Конференция "WinAPI" » Хук на WM_DROPFILES в трей
 
  • Psycho © (01.04.09 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 © (01.04.09 23:23) [1]
    что в CallNextHookEx используется HookHandle - не обращайте внимания, они равны
  • Сергей М. © (02.04.09 10:35) [2]

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


    А хук-то зачем ?
  • Psycho © (02.04.09 18:18) [3]
    ну... у TTrayIcon вроде Handle'а нет, через неё значит не сделаешь, или как?
    ещё забыл сказать, что у меня Windows 7 (7057), так что может это её баг, если у меня правильно
  • Psycho © (02.04.09 18:47) [4]
    или если вопрос в том, что я этим хуком хочу делать, то я хочу сделать DragAcceptFiles(FindWindow('Shell_TrayWnd', nil), true) и ловить сообщения WM_DROPFILES
  • Сергей М. © (02.04.09 19:07) [5]

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


    Зато, очевидно, как минимум одно окно есть у твоего приложения, которое "запуздырило иконку в трей". Это окно обязано получать извещение о событиях мышиного ввода в области отрисовки "запуздыренной иконки".
    Так что хук нафих не нужен.
  • Psycho © (02.04.09 19:57) [6]
    значит надо обрабатывать OnMouseUp иконки, там if Mouse.IsDragging... а дальше? как получить WM_DRAGDROP? и нужно ли для этого писать DragAcceptFiles?
    и чисто в образовательных целях, что же не так в моём хуке?
  • Psycho © (02.04.09 20:13) [7]
    ну т.е. не DRAGDROP, а DROPFILES
  • Leonid Troyanovsky © (04.04.09 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 © (06.04.09 22:33) [9]
    насчёт немышиного события я вроде понимал)

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

    приведённый пример, я так понял, как раз на события мыши. а если устанавливать с WH_GETMESSAGE (вычитал, что оно-то мне и надо), то TMsg будет? и почему же проводник падает ещё до/сразу после строчки if code = HC_ACTION then ?
  • Psycho © (07.04.09 00:21) [10]
    хотя, может быть, не на/после той строчки, а на первой попытке извлечения сообщения. если там происходит ошибка, хук ломается, забирая с собой и процесс, в который он внедрён?
  • имя (08.04.09 23:49) [11]
    Удалено модератором
  • Eraser © (10.04.09 15:17) [12]
  • Psycho © (10.04.09 16:58) [13]
    спасибо большое!
 
Конференция "WinAPI" » Хук на WM_DROPFILES в трей
Есть новые Нет новых   [134435   +35][b:0][p:0.001]