Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Хук на WM_DROPFILES в трей


Psycho ©   (2009-04-01 21:22:00) 

Пытаюсь сделать приём файлов через drag'n'drop в трей. Сделал DLL, вроде всё по правилам, но как только дело доходит до выполнения функции-фильтра, explorer падает и перезапускается.

function HookTrayProc(code: integer; wParam: integer; lParam: integer): integer; stdcall;
begin
 if code = HC_ACTION then
   if TMsg(Pointer(lParam)^).message = WM_DROPFILES then
     SendMessage(FindWindow('TfrmMain', nil), WM_DROPFILES, TMsg(Pointer(lParam)^).wParam, TMsg(Pointer(lParam)^).lParam);
 Result := CallNextHookEx(HookHandle, Code, wParam, lParam)
end;

...

 ResultHook:=SetWindowsHookEx(WH_MOUSE, @HookTrayProc, HInstance, GetWindowThreadProcessId(FindWindow('Shell_TrayWnd', nil)));


WH_MOUSE поставил временно, чтобы explorer хотя бы падал только при наведении мыши, а не сразу при запуске. кстати что туда на самом деле следует писать? WH_CALLWNDPROC?


Psycho   (2009-04-10 16:58:00) [1]

спасибо большое!


Eraser   (2009-04-10 15:17:00) [2]

попалось тут http://www.codeproject.com/KB/cpp/DragnDropOnTrayIcon.aspx


  (2009-04-08 23:49:00) [3]

Удалено модератором


Psycho   (2009-04-07 00:21:00) [4]

хотя, может быть, не на/после той строчки, а на первой попытке извлечения сообщения. если там происходит ошибка, хук ломается, забирая с собой и процесс, в который он внедрён?


Psycho   (2009-04-06 22:33:00) [5]

насчёт немышиного события я вроде понимал)

> WH_MOUSE поставил временно, чтобы explorer хотя бы падал
> только при наведении мыши, а не сразу при запуске

приведённый пример, я так понял, как раз на события мыши. а если устанавливать с WH_GETMESSAGE (вычитал, что оно-то мне и надо), то TMsg будет? и почему же проводник падает ещё до/сразу после строчки if code = HC_ACTION then ?


Leonid Troyanovsky   (2009-04-04 15:19:00) [6]


> Psycho ©   (02.04.09 19:57) [6]

> и чисто в образовательных целях, что же не так в моём хуке?

В MouseProc нет никакого TMsg.

function HookTrayProc(code: integer; awParam: integer; alParam: integer): integer; stdcall;
begin
if code = HC_ACTION then
  with PMOUSEHOOKSTRUCT(alParam)^ do
    Application.MainForm.Caption :=  Format('%d %d', [pt.x, pt.y]);
Result := CallNextHookEx(0, Code, awParam, alParam)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 SetWindowsHookEx(WH_MOUSE, HookTrayProc, HInstance, GetCurrentThreadId);
end;

Кста, WM_DROPFILES - вовсе не мышиное событие.

--
Regards, LVT.


Psycho   (2009-04-02 20:13:00) [7]

ну т.е. не DRAGDROP, а DROPFILES


Psycho   (2009-04-02 19:57:00) [8]

значит надо обрабатывать OnMouseUp иконки, там if Mouse.IsDragging... а дальше? как получить WM_DRAGDROP? и нужно ли для этого писать DragAcceptFiles?
и чисто в образовательных целях, что же не так в моём хуке?


Сергей М.   (2009-04-02 19:07:00) [9]


> у TTrayIcon вроде Handle'а нет


Зато, очевидно, как минимум одно окно есть у твоего приложения, которое "запуздырило иконку в трей". Это окно обязано получать извещение о событиях мышиного ввода в области отрисовки "запуздыренной иконки".
Так что хук нафих не нужен.


Psycho   (2009-04-02 18:47:00) [10]

или если вопрос в том, что я этим хуком хочу делать, то я хочу сделать DragAcceptFiles(FindWindow('Shell_TrayWnd', nil), true) и ловить сообщения WM_DROPFILES


Psycho   (2009-04-02 18:18:00) [11]

ну... у TTrayIcon вроде Handle'а нет, через неё значит не сделаешь, или как?
ещё забыл сказать, что у меня Windows 7 (7057), так что может это её баг, если у меня правильно


Сергей М.   (2009-04-02 10:35:00) [12]


> приём файлов через drag'n'drop в трей


А хук-то зачем ?


Psycho   (2009-04-01 23:23:00) [13]

что в CallNextHookEx используется HookHandle - не обращайте внимания, они равны


Наверх

Титульная страница Поиск, карта сайта Написать письмо