-
Пытаюсь сделать приём файлов через 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?
-
что в CallNextHookEx используется HookHandle - не обращайте внимания, они равны
-
> приём файлов через drag'n'drop в трей
А хук-то зачем ?
-
ну... у TTrayIcon вроде Handle'а нет, через неё значит не сделаешь, или как? ещё забыл сказать, что у меня Windows 7 (7057), так что может это её баг, если у меня правильно
-
или если вопрос в том, что я этим хуком хочу делать, то я хочу сделать DragAcceptFiles(FindWindow('Shell_TrayWnd', nil), true) и ловить сообщения WM_DROPFILES
-
> у TTrayIcon вроде Handle'а нет
Зато, очевидно, как минимум одно окно есть у твоего приложения, которое "запуздырило иконку в трей". Это окно обязано получать извещение о событиях мышиного ввода в области отрисовки "запуздыренной иконки". Так что хук нафих не нужен.
-
значит надо обрабатывать OnMouseUp иконки, там if Mouse.IsDragging... а дальше? как получить WM_DRAGDROP? и нужно ли для этого писать DragAcceptFiles? и чисто в образовательных целях, что же не так в моём хуке?
-
ну т.е. не DRAGDROP, а DROPFILES
-
> 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.
-
насчёт немышиного события я вроде понимал)
> WH_MOUSE поставил временно, чтобы explorer хотя бы падал > только при наведении мыши, а не сразу при запуске
приведённый пример, я так понял, как раз на события мыши. а если устанавливать с WH_GETMESSAGE (вычитал, что оно-то мне и надо), то TMsg будет? и почему же проводник падает ещё до/сразу после строчки if code = HC_ACTION then ?
-
хотя, может быть, не на/после той строчки, а на первой попытке извлечения сообщения. если там происходит ошибка, хук ломается, забирая с собой и процесс, в который он внедрён?
-
Удалено модератором
-
-
спасибо большое!
|