С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 03.12.2009
Сообщений: 42

Отловить открытие определенной папки

18.10.2012, 14:12. Показов 2259. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста с решением проблемы:
Необходимо при открытии определенной папки(двойной клик по папке в explorer) вывести сообщение "Вы открыли папку" в моем приложении.
Перерыл кучу литературы, находил даже примеры, которые реализуют отлавливание событий создания, удаление файла в директории и т.д. , а именно открытие папки - нет.
пытался работать с функциями CreateFIle, FindFirstChangeNotification но это не дает нужного результата...
Очень прошу помощи у тех, кто в курсе как это сделать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.10.2012, 14:12
Ответы с готовыми решениями:

Как отловить открытие папки/файла в Проводнике?
Как отловить открытие папки/файла в Проводнике? Уже обчитался про NativeAPI и всевозможные хуки.Нужен хотя бы черновой пример.

Создание папки с определённой иконкой
Требуется создать папку с любой(кроме стандартной) иконкой. Как это сделать? Я пробовал так: ...

Сформировать пункты в MainMenu на основе сканирования определенной папки
Суть в следующем, в папке с программой имеется папка "Объекты", в ней в свою очередь папки с названиями разделов, в папках с разделами...

8
 Аватар для Ice_and_Fire
512 / 298 / 37
Регистрация: 22.06.2011
Сообщений: 929
18.10.2012, 15:19
Если только проводником, то FindWindow по классу окна и заголовку
Правда окно с текстом находится внутри др. окна, так что FindWindowEX
Для win7 класс:
Миниатюры
Отловить открытие определенной папки  
0
Наблюдатель
 Аватар для Alex Dark
457 / 192 / 33
Регистрация: 01.05.2012
Сообщений: 1,028
18.10.2012, 15:31
На сколько я помню, нтфс хранит четыре даты для файла и папки: Создания, последнего доступа, последнего изменения и ещё чегото.

В принципе можно воспользоваться отслеживанием изменения этих дат (конкретно как не спрашивай, это только мысль, идея).

Правда есть одно не маловажное НО.
Можно отключить регистрацию изменения этих дат (подробностей на память не помню)
0
0 / 0 / 0
Регистрация: 03.12.2009
Сообщений: 42
18.10.2012, 15:45  [ТС]
Хм, мне кажется можно сделать гораздо проще...я впринципе попытался сделать так:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
procedure TMonDirThread.Execute;
  var 
  HandleChange: THandle;  //Handle создаваемого объекта для ожидания события
begin
//-- Создаем объект для ожидания события
  HandleChange :=     CreateFile('c:\tst', GENERIC_READ,
    FILE_SHARE_READ or FILE_SHARE_DELETE or FILE_SHARE_WRITE,
    nil,
    OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS or
    FILE_FLAG_OVERLAPPED, 0);
 
//-- При ошибке Win32Check выводит сообщение и прерывает Execute.
 //   Win32Check(HandleChange <> INVALID_HANDLE_VALUE);
      Synchronize(ThreadStart);               //Сообщение о старте потока
  try
//-- Цикл, пока для потока не будет выдана команда Terminate
    while not Terminated do
    begin
      case WaitForSingleObject(HandleChange,1000) of
        WAIT_FAILED: Terminate;                //Ошибка, завершаем поток
        WAIT_OBJECT_0: Synchronize(UpdateLog); //Сообщаем об изменении
      end;
     // FindNextFile(HandleChange);
    end;
  finally
    FindCloseChangeNotification(HandleChange);
  end;
  Synchronize(ThreadStop);                     //Сообщаем о завершении потока
end;
Но при запуске приложения постоянно в лог пишет что папка открыта, хоть я ее не открываю. Это из за самой функции
Pascal
1
2
3
4
5
6
CreateFile('c:\tst', GENERIC_READ,
    FILE_SHARE_READ or FILE_SHARE_DELETE or FILE_SHARE_WRITE,
    nil,
    OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS or
    FILE_FLAG_OVERLAPPED, 0);
и ее параметра
Pascal
1
OPEN_EXISTING,
Оно просто открывает папку, когда находит такову. Может есть какой то параметр для этой функции, который срабатывает когда Я САМ ее открою? сколько не копаюсь - ничего...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
18.10.2012, 16:06
trin, ReadDirectoryChanges с ключиком FILE_NOTIFY_CHANGE_LAST_ACCESS не пробовал использовать?
0
0 / 0 / 0
Регистрация: 03.12.2009
Сообщений: 42
18.10.2012, 16:23  [ТС]
мм, не-а, еще не пробовал, сейчас загуглю, спасибо

Добавлено через 15 минут
Подскажите пожалуйста, что нужно указать 3 и 6 параметром этой функции?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
18.10.2012, 16:34
Третий - длина буфера, куда будет читаться информация (того самого буфера, указатель на который передавался предыдущим параметром), шестой - указатель на переменную типа DWORD, куда вернется реальный размер прочитанных данных.
0
0 / 0 / 0
Регистрация: 03.12.2009
Сообщений: 42
18.10.2012, 19:55  [ТС]
Скажите пожалуйста, что не прально делаю:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TMonDirThread.Execute;
  var      Buffer: array[0..4095] of Byte;
 h : HWND; hDir: THandle;  //Handle создаваемого объекта для ожидания события
begin    h:= FindWindow(nil,'fMonDirMain');
 hDir := CreateFile('c:\tst', GENERIC_READ,
    FILE_SHARE_READ or FILE_SHARE_WRITE
    or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
  repeat
        if Terminated then
          Exit;
        if ReadDirectoryChangesW(hDir,
        @Buffer,
        1024,
        True,
        FILE_NOTIFY_CHANGE_LAST_ACCESS
                           , nil,
                           nil,
                           nil)
         then PostMessage(h, WM_KEYDOWN, 5, 5); // сообщаю о наличии  изменений в форму
  until false;
CloseHandle(hDir);
end;
Добавлено через 3 часа 4 минуты
Задачу решил. кому интересно - стучите
0
sistemsx
21.05.2013, 11:32
trin, Добрый день. А можно подробный код, а то не понятно как использовать вашу процедуру. Спасибо.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.05.2013, 11:32
Помогаю со студенческими работами здесь

Кнопка на открытие определенной папки
Доброго времени суток, уважаемые форумчане! Я знаю, что немного Вам уже поднадоел своими просьбами. Но опять появилась идея, а как...

Извлечь имя папки файла начиная с определенной папки
Собстно вопрос. Как извлечь имя папки файла начиная с определенной папки Например полное имя: D:\Program Files...

Как в консольном приложении отловить нажатие определённой клавиши?
Как в консольном приложении отловить нажатие определённой клавиши?

Отловить нажатие определенной комбинации клавиш, даже когда программа не в фокусе
Бодрого дня или ночи! :D Написал программу и теперь нузно разобраться как сделать в ней управление сочитанием клавиш, а именно нужно,...

Combobox - как отловить нажатие на стрелку? Открытие-скрытие списка
только subclassing?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru