Подскажите как отлавливать хуком WM_CHAR

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 12 мар 2010.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Пытаюсь примерно так
    дллка
    Код (Text):
    1. #include "stdafx.h"
    2. #include <windows.h>
    3. extern "C" __declspec(dllexport)LRESULT CALLBACK CLHH(int nCode, WPARAM wParam, LPARAM lParam);
    4. BOOL APIENTRY DllMain( HMODULE hModule,
    5.                        DWORD  ul_reason_for_call,
    6.                        LPVOID lpReserved
    7.                      )
    8. {
    9.     switch (ul_reason_for_call)
    10.     {
    11.     case DLL_PROCESS_ATTACH:
    12.     case DLL_THREAD_ATTACH:
    13.     case DLL_THREAD_DETACH:
    14.     case DLL_PROCESS_DETACH:
    15.         break;
    16.     }
    17.     return TRUE;
    18. }
    19.  
    20. LRESULT CALLBACK CLHH(int nCode,WPARAM wParam,LPARAM lParam)
    21. {
    22.     MSG mm;
    23.     memcpy(&mm,&wParam,sizeof(MSG));
    24.     if(mm.wParam==WM_CHAR)
    25.     {
    26.         MessageBox(0,(char*)mm.lParam,"",MB_OK);
    27.     }
    28.     ZeroMemory(&mm,sizeof(MSG));
    29.     return CallNextHookEx(NULL,nCode,wParam,lParam);
    30. }
    постановка хука
    Код (Text):
    1. #include "stdafx.h"
    2. #include <windows.h>
    3. #include <conio.h>
    4.  
    5. int _tmain(int argc, _TCHAR* argv[])
    6. {
    7.     SetLastError(0);
    8.     HINSTANCE hLib = LoadLibrary("HOOKdll.dll");
    9.     HOOKPROC pCLHH;
    10.     pCLHH=reinterpret_cast<HOOKPROC>(GetProcAddress(hLib,"_CLHH@12"));
    11.     HHOOK hHook=SetWindowsHookEx(WH_MSGFILTER,pCLHH,hLib,0);
    12.     printf("%d",GetLastError());
    13.     getch();
    14.     UnhookWindowsHookEx(hHook);
    15.     FreeLibrary(hLib);
    16.     return 0;
    17. }
    Но так ничего не происходит :dntknw:
    ЗЫ GetLastError() конечно же 0 возвращяет.
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
     
  3. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Вам скорее всего нужно WH_GETMESSAGE.
     
  4. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Нашол у себя ляп "memcpy(&mm,&wParam,sizeof(MSG));" надо было lParam.Пробовал также и WH_GETMESSAGE ,неработает :dntknw:
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    _nic
    +WM_CHAR вроде как приходят через TranslateMessage а не через GetMessage/PeekMessage. Попробуйте отловить другие сообщения.
     
  6. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Именно lParam а не &lParam. Ну это так, к слову.
     
  7. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    WM_CHAR невозможно отловить?
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Используйте захват таблицы калбеков(apfnDispath/pfnClient). Здесь начинаются любые теложвижения шадова в юзермоде.
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    *apfnDispatch
     
  10. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Этого даже на мсдн нету ((( Какую литературу мне искать?
     
  11. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    _nic
    Никакую, это так клерк повышает свою самооценку.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    KeSqueer
    Какую оценку, о чём вы ?
    Я массив указателей перемещаю в другое место от User32.dll и там меняю ссылки на свои обработчики, тогда поток развёртывает шадова калбек и вызыват мой.
     
  13. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    так что никто неможет подсказать как правильно ставить хук на оконные сообщения?
     
  14. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    мммм? в исходниках windows смотрели?
     
  15. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Обьясните тогда ламеру.Почему если я всетаки получаю HWND с помощью хуков,я немогу вклинится в их обработчики событий?Или что может быть такое окно HWND которого не получится получить через такой хук?
     
  16. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    TranslateMessage перехвати
     
  17. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    А как это возможно?
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _nic
    #8, сосредоточтесь.
     
  19. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Код (Text):
    1. WH_KEYBOARD
    2. Windows вызывает этот хук когда функции GetMessage или PeekMessage собираются вернуть сообщения WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP, WM_SYSKEYDOWN, или WM_CHAR. Когда хук установлен как локальный, эти сообщения должны поступать из входной очереди потока, к которому прикреплен хук. Фильтрующая функция получает виртуальный код клавиши и состояние клавиатуры на момент вызова клавиатурного хука. Фильтры имеют возможность отменить сообщение. Фильтрующая функция, прикрепленная к этому хуку, должна знать о существовании следующих кодов:
    3.  
    4. HC_ACTION
    5. Windows вызывает хук WH_KEYBOARD с этим кодом при удалении события из системной очереди.
    6.  
    7. HC_NOREMOVE
    8. Windows вызывает хук WH_KEYBOARD с этим кодом, когда клавиатурное сообщение не удаляется из очереди, потому что приложение вызвало функцию PeekMessage с параметром PM_NOREMOVE. При вызове хука с этим кодом не гарантируется передача действительного состояние клавиатуры. Приложение должно знать о возможности возникновения подобной ситуации.
    Код (Text):
    1. WH_MSGFILTER
    2. Windows вызывает этот хук, когда диалоговое окно, информационное окно, полоса прокрутки или меню получают сообщение, либо когда пользователь нажимает комбинацию клавиш ALT+TAB (или ALT+ESC) при активном приложении, установившем этот хук. Данный хук устанавливается для конкретного потока, поэтому его безопасно размещать как в самом приложении, так и в DLL. Фильтрующая функция этого хука получает следующие коды:
    3. MSGF_DIALOGBOX: Сообщение предназначено либо диалоговому, либо информационному окну.
    4. MSGF_MENU: Сообщение предназначено меню.
    5. MSGF_SCROLLBAR: Сообщение предназначено полосе прокрутки.
    6. MSGF_NEXTWINDOW: Происходит переключение фокуса на следующее окно.
    7. В WINUSER.H определено больше MSGF_-кодов, но в настоящее время они не используются хуком WH_MSGFILTER.
    8. В lParam передается указатель на структуру, содержащую информацию о сообщении. Хуки WH_SYSMSGFILTER вызываются перед хуками WH_MSGFILTER. Если какая-нибудь из фильтрующих функций хука WH_SYSMSGFILTER возвратит TRUE, хуки WH_MSGFILTER не будут вызваны.
     
  20. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Тут http://msdn.microsoft.com/en-us/library/ms644984(VS.85).aspx таким и близко не пахнет