перехватываю сообщения WM_PAINT всех приложений.
зарегистрировал для этого хук WH_GETMESSAGE.
Но! Сообщения перехватываются но как бы не все.
Вот обычный PBrush например. В Spy++ видно, что WM_PAINTы сыпятся просто, когда рисуешь (не отпуская мышь). А моя прога ловит только когда мышь нажмешь-отпустишь. Почему Spy ловит, а моя прога нет? Вот в чем вопрос.
Всем спасибо. Разобрался.14.10.01 18:22 Автор: goblin Статус: Незарегистрированный пользователь
Прав оказался <Mikhail>. Все отловилось WH_CALLWNDPROC хуком.
Только вначале я на него забил. Опшибочку допустил.
В CALLBACK функции
CallWndProc( int code, WPARAM wParam, LPARAM lParam )
lParam не к (CWPSTRUCT *) приводил а к (MSG *), как с WH_GETMESSAGE хуком.
Структуры-то похожие, вот я и облажался.
Ясно, что с WH_CALLWNDPROC у меня ничего не вышло.
Поэтому я и мучал WH_GETMESSAGE.
vo-pervyx segodnya Subbota :-)))
vo-vtoryx napishi malen'kij primerchik rabotayushego code-a.
A to tak srazu i ne pojmesh'
ya s takoj problemoj vo vsyakom sluchae ne stalkivalsya.
//hook.dll
#pragma data_seg(".MyData")
HHOOK hGetMessageHook = NULL;
UINT UpdateMessage = NULL;
HWND hParentWnd = NULL;
#pragma data_seg( )
HINSTANCE hInstance = NULL; // This instance of the DLL
LRESULT CALLBACK GetMsgProc( int code, WPARAM wParam, LPARAM lParam );
//------------------------
BOOL APIENTRY DllMain( HANDLE hModule,DWORD r,LPVOID l )
{
if (r==DLL_PROCESS_ATTACH)hInstance = (HINSTANCE)hModule;
return TRUE;
}
//------------------------
__declspec(dllexport) int SetHook( HWND hWnd,UINT UpdateMsg)
{
hParentWnd = hWnd;
UpdateMessage=UpdateMsg;
hGetMessageHook= ::SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInstance,0);
return 0;
}
//-----------------------
LRESULT CALLBACK GetMsgProc( int code, WPARAM wParam, LPARAM lParam )
{
MSG *msg = (MSG *) lParam;
if ((code >= 0)&&(msg->message==WM_PAINT))
PostMessage(hParentWnd,UpdateMessage,0,0);
return CallNextHookEx (hGetMessageHook,code ,wParam , lParam);
};
это вот вкратце. Если нужно подробнее, могу на мыло прислать.
А дальше вот что. Запускаю Paint Brush. Запускаю Spy++, настраиваю его ловить только сообщения WM_PAINT для дочернего окна PBrush'а - белого такого, там где рисовать можно:). Вызываю SetHook из своей длл. Ну и вот. В Spy сообщения просто валом прут, когда в PBrush рисуешь, а ко мне приходят только когда мышь нажмешь\отпустишь. т.е. если скажем линию ведешь, то только в начале и в конце, а в процессе, так сказать, - нет.
> > //hook.dll
> #pragma data_seg(".MyData")
> HHOOK hGetMessageHook = NULL;
> UINT UpdateMessage = NULL;
> HWND hParentWnd = NULL;
> #pragma data_seg( )
>
> HINSTANCE hInstance = NULL; // This instance of
> the DLL
>
> LRESULT CALLBACK GetMsgProc( int code, WPARAM wParam,
> LPARAM lParam );
> //------------------------
> BOOL APIENTRY DllMain( HANDLE hModule,DWORD r,LPVOID l )
> {
> if (r==DLL_PROCESS_ATTACH)hInstance = (HINSTANCE)hModule;
> return TRUE;
> }
> //------------------------
> __declspec(dllexport) int SetHook( HWND hWnd,UINT
> UpdateMsg)
> {
> hParentWnd = hWnd;
> UpdateMessage=UpdateMsg;
> hGetMessageHook=
> ::SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInstance,0);
> return 0;
> }
> //-----------------------
> LRESULT CALLBACK GetMsgProc( int code, WPARAM wParam,
> LPARAM lParam )
> {
if (nCode < 0) return (hGetMessageHook,code ,wParam ,lParam);
> MSG *msg = (MSG *) lParam;
> if ((code >= 0)&&(msg->message==WM_PAINT))
> PostMessage(hParentWnd,UpdateMessage,0,0);
> CallNextHookEx (hGetMessageHook,code ,wParam ,lParam);
return 0;
> };
>
> > это вот вкратце. Если нужно подробнее, могу на мыло > прислать. > > А дальше вот что. Запускаю Paint Brush. Запускаю Spy++, > настраиваю его ловить только сообщения WM_PAINT для > дочернего окна PBrush'а - белого такого, там где рисовать > можно:). Вызываю SetHook из своей длл. Ну и вот. В Spy > сообщения просто валом прут, когда в PBrush рисуешь, а ко > мне приходят только когда мышь нажмешь\отпустишь. т.е. если > скажем линию ведешь, то только в начале и в конце, а в > процессе, так сказать, - нет.
Кажется нужно сделать так, т.к функция GetMsgProc должна возвращать 0
> > //hook.dll
> #pragma data_seg(".MyData")
> HHOOK hGetMessageHook = NULL;
> UINT UpdateMessage = NULL;
> HWND hParentWnd = NULL;
> #pragma data_seg( )
>
> HINSTANCE hInstance = NULL; // This instance of
> the DLL
>
> LRESULT CALLBACK GetMsgProc( int code, WPARAM wParam,
> LPARAM lParam );
> //------------------------
> BOOL APIENTRY DllMain( HANDLE hModule,DWORD r,LPVOID l )
> {
> if (r==DLL_PROCESS_ATTACH)hInstance = (HINSTANCE)hModule;
> return TRUE;
> }
> //------------------------
> __declspec(dllexport) int SetHook( HWND hWnd,UINT
> UpdateMsg)
> {
> hParentWnd = hWnd;
> UpdateMessage=UpdateMsg;
> hGetMessageHook=
> ::SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,hInstance,0);
> return 0;
> }
> //-----------------------
> LRESULT CALLBACK GetMsgProc( int code, WPARAM wParam,
> LPARAM lParam )
> {
> MSG *msg = (MSG *) lParam;
> if ((code >= 0)&&(msg->message==WM_PAINT))
^^^^^^
a pochemu (code >= 0) ???
poprobuj bez nego, dumaju message-i valom lezt' budut :-)))
> PostMessage(hParentWnd,UpdateMessage,0,0);
> return CallNextHookEx (hGetMessageHook,code ,wParam ,
> lParam);
> };
>
> > это вот вкратце. Если нужно подробнее, могу на мыло > прислать. > > А дальше вот что. Запускаю Paint Brush. Запускаю Spy++, > настраиваю его ловить только сообщения WM_PAINT для > дочернего окна PBrush'а - белого такого, там где рисовать > можно:). Вызываю SetHook из своей длл. Ну и вот. В Spy > сообщения просто валом прут, когда в PBrush рисуешь, а ко > мне приходят только когда мышь нажмешь\отпустишь. т.е. если > скажем линию ведешь, то только в начале и в конце, а в > процессе, так сказать, - нет.