Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Хук на WM_DROPFILES в трей   Найти похожие ветки 

 
Psycho ©   (2009-04-01 21:22) [0]

Пытаюсь сделать приём файлов через 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-01 23:23) [1]

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


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


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


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


 
Psycho ©   (2009-04-02 18:18) [3]

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


 
Psycho ©   (2009-04-02 18:47) [4]

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


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


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


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


 
Psycho ©   (2009-04-02 19:57) [6]

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


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

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


 
Leonid Troyanovsky ©   (2009-04-04 15:19) [8]


> 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-06 22:33) [9]

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

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

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


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

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


 
имя   (2009-04-08 23:49) [11]

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


 
Eraser ©   (2009-04-10 15:17) [12]

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


 
Psycho ©   (2009-04-10 16:58) [13]

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



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.143 c
2-1269007934
Delphist2
2010-03-19 17:12
2010.08.27
обновить dblistbox


2-1267712808
Scot Storch
2010-03-04 17:26
2010.08.27
чтение из стрима


15-1269176860
Правильный$Вася
2010-03-21 16:07
2010.08.27
загрузочный ли образ


15-1265497950
Германн
2010-02-07 02:12
2010.08.27
Опции компилятора DEBUG, RELEASE в CodeGear2007


2-1273332902
Tassadar
2010-05-08 19:35
2010.08.27
Runtime error - array of string как атрибут класса