![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хук на 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 - не обращайте внимания, они равны