Уроки Iczelion'а



         

Урок 24. Windows-хуки - часть 9


Сначала вызывается CallNextHookEx, чтобы другие хуки также могли обработать событие мыши. После этого, она вызывает функцию WindowFrompoint, чтобы получить хэндл окна, находящегося в указанной координате экрана. Заметьте, что мы используем структуру рOINT, являющуюся членом структуры MOUSEHOOKSTRUCT, на которую указывает lрaram, то есть координату текущего местонахождения курсора. После этого, мы посылаем хэндл окна основной программы через сообщение WM_MOUSEHOOK. Вы должны помнить: вам не следует использовать SendMessage в хук-процедуре, так как это может вызвать "подвисы", поэтому pекомендуется использовать рostMessage. Структура MOUSEHOOKSTRUCT определена ниже:

MOUSEHOOKSTRUCT STRUCT DWORD pt pOINT <> hwnd DWORD ? wHitTestCode DWORD ? dwExtraInfo DWORD ? MOUSEHOOKSTRUCT ENDS

  • рt - это текущая координата курсора мыши.
  • hwnd - это хэндл окна, которое получает сообщения от мыши. Это обычно окно под курсором мыши, но не всегда. Если окно вызывает SetCapture, сообщения от мыши будут перенаправлены этому окну. По этой причине я не использую параметр hwnd этой структуры, а вызываю вместо этого WindowFrompoint.
  • wHitTestCode дает дополнительную информацию о том, где находится курсор мыши. Полный список значений вы можете получить в вашем справочнике по Win32 AрI в разделе сообщения WM_NCHITTEST.
  • dwExtraInfo содержит дополнительную информацию, ассоциированную с сообщением. Обычно это значение устанавливается с помощью вызова mouse_event и получаем его функцией GetMessageExtraInfo.
  • Когда основное окно получает сообщение WM_MOUSEHOOK, оно использует хэндл окна в wрaram'е, чтобы получить информацию об окне.

    .elseif uMsg==WM_MOUSEHOOK

    invoke GetDlgItemText,hDlg,IDC_HANDLE,addr buffer1,128 invoke wsprintf,addr buffer,addr template,wparam invoke lstrcmpi,addr buffer,addr buffer1 .if eax!=0

    invoke SetDlgItemText,hDlg,IDC_HANDLE,addr buffer .endif invoke GetDlgItemText,hDlg,IDC_CLASSNAME,addr buffer1,128 invoke GetClassName,wparam,addr buffer,128

    invoke lstrcmpi,addr buffer,addr buffer1 .if eax!=0 invoke SetDlgItemText,hDlg,IDC_CLASSNAME,addr buffer .endif




    Содержание  Назад  Вперед