Форум: "WinAPI";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизХук на 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.063 c