Хук на WH_MOUSE
От: DimichZubtsov Украина http://www.sbigame.narod.ru
Дата: 31.05.05 06:50
Оценка:
Здравствуйте!
Столкнулся со странной проблемой — при установке хука на события мыши (WH_MOUSE, глобальный хук, реализован в DLL) приложение, которое ставит хук начинает жутко тормозить, и результат работы хука даже толком и не удается проверить. С хуком клавиатуры (WH_KEYBOARD) такого не происходит. В чем может быть дело?

01.06.05 17:24: Перенесено из 'C/C++. Прикладные вопросы'
Re: Хук на WH_MOUSE
От: Аноним  
Дата: 31.05.05 09:37
Оценка:
Здравствуйте, DimichZubtsov, Вы писали:


DZ>Здравствуйте!

DZ>Столкнулся со странной проблемой — при установке хука на события мыши (WH_MOUSE, глобальный хук, реализован в DLL) приложение, которое ставит хук начинает жутко тормозить, и результат работы хука даже толком и не удается проверить. С хуком клавиатуры (WH_KEYBOARD) такого не происходит. В чем может быть дело?


Пришли проект или примерный кусочек кода .scaramancha_hotmail_com
Женя.
Re: Хук на WH_MOUSE
От: Кодёнок  
Дата: 31.05.05 11:16
Оценка:
DZ>Здравствуйте!
DZ>Столкнулся со странной проблемой — при установке хука на события мыши (WH_MOUSE, глобальный хук, реализован в DLL) приложение, которое ставит хук начинает жутко тормозить, и результат работы хука даже толком и не удается проверить. С хуком клавиатуры (WH_KEYBOARD) такого не происходит. В чем может быть дело?

Пиши кусочек кода. На всякий случай не забудь, что поток, ставящий хук, должен иметь цикл обработки сообщений.
Re[2]: Хук на WH_MOUSE
От: DimichZubtsov Украина http://www.sbigame.narod.ru
Дата: 31.05.05 14:17
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Пиши кусочек кода. На всякий случай не забудь, что поток, ставящий хук, должен иметь цикл обработки сообщений.


Что именно имеется ввиду? Если я запускаю из основного потока приложения — это DefWindowProc?

Код такой:

#include "nslib.h"

#pragma data_seg(".NETSTAT")
HWND NSWindow=NULL;
#pragma data_seg()
#pragma comment(linker,"/section:.NETSTAT,rws")

HINSTANCE DllInstance;
UINT WM_MOUSEORKEYBOARDACTION;
HHOOK MouseHook,KeyboardHook;

BOOL APIENTRY DllMain(HINSTANCE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:DllInstance=hModule;
WM_MOUSEORKEYBOARDACTION=RegisterWindowMessage(WM_MOUSEORKEYBOARDACTION_MSG);
break;
case DLL_PROCESS_DETACH:if (NSWindow) UnsetKeyboardAndMouseHook(NSWindow);
}
return true;
}

LRESULT CALLBACK MouseHookProc(int iCode,WPARAM wParam,LPARAM lParam)
{
if (iCode == HC_ACTION) {
MSG *msg = (MSG*)lParam;
if ((msg->message == WM_LBUTTONDOWN) || (msg->message == WM_RBUTTONDOWN) ||
(msg->message == WM_MOUSEMOVE) || (msg->message == 0x020A))
PostMessage(NSWindow,WM_MOUSEORKEYBOARDACTION,0,0);
}
return CallNextHookEx(MouseHook,iCode,wParam,lParam);
}

LRESULT CALLBACK KeyboardHookProc(int iCode,WPARAM wParam,LPARAM lParam)
{
if (iCode == HC_ACTION) PostMessage(NSWindow,WM_MOUSEORKEYBOARDACTION,0,0);
return CallNextHookEx(NULL,iCode,wParam,lParam);
}

exported void SetKeyboardAndMouseHook(HWND hWnd)
{
if ((!NSWindow) && (hWnd) &&
(MouseHook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseHookProc,DllInstance,NULL)) &&
(KeyboardHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardHookProc,DllInstance,NULL)))
NSWindow=hWnd;
}

exported void UnsetKeyboardAndMouseHook(HWND hWnd)
{
if (hWnd==NSWindow)
{
UnhookWindowsHookEx(MouseHook);
UnhookWindowsHookEx(KeyboardHook);
NSWindow=NULL;
}
}

Кстати этот код писал по примеру с RSDN, немного изменил только.
Re[3]: Хук на WH_MOUSE
От: Кодёнок  
Дата: 01.06.05 06:04
Оценка:
DZ>Что именно имеется ввиду? Если я запускаю из основного потока приложения — это DefWindowProc?

Надо вызывать GetMessage или PeekMessage в цикле, непрерывно.

DZ>Код такой:


Интересует другой код, который вызывает процедуру установки хука. Поток, который это делает, имеет message loop?

// message loop
while (GetMessage(&msg,0,0,0)) 
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
Re[4]: Хук на WH_MOUSE
От: DimichZubtsov Украина http://www.sbigame.narod.ru
Дата: 01.06.05 12:48
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Интересует другой код, который вызывает процедуру установки хука. Поток, который это делает, имеет message loop?


Не имеет Спасибо за наводку, попробую доделать и отпишу результат.
Re[5]: Хук на WH_MOUSE
От: Аноним  
Дата: 20.07.05 05:42
Оценка:
DZ>Здравствуйте, Кодёнок, Вы писали:

Кё>>Интересует другой код, который вызывает процедуру установки хука. Поток, который это делает, имеет message loop?


DZ>Не имеет Спасибо за наводку, попробую доделать и отпишу результат.


В общем воевал-воевал, но нормального результата так и не добился. "Тормоза" исчезли, но все равно события от мыши приходят как-то по странному — например щелкаешь кнопкой несколько раз, а сообщение в хук-функцию приходит одно, и спустя несколько секунд. В общем сделал через WH_GETMESSAGE — все работает отлично, но вот еще странная проблема — когда активно какое-либо консольное окно соообщения ни от мыши ни от клавиатуры не приходят. Почему?
Re[2]: Хук на WH_MOUSE
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.07.05 07:15
Оценка:
Кё>Пиши кусочек кода. На всякий случай не забудь, что поток, ставящий хук, должен иметь цикл обработки сообщений.
Откуда такая информация?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[3]: Хук на WH_MOUSE
От: Кодёнок  
Дата: 20.07.05 07:22
Оценка:
Здравствуйте, Andrew S, Вы писали:

Кё>>Пиши кусочек кода. На всякий случай не забудь, что поток, ставящий хук, должен иметь цикл обработки сообщений.

AS>Откуда такая информация?

Из практики Если не вызывать GetMessage/PeekMessage, мышинные и клавиатурные хуки глючат или тормозят в консольных приложениях, например (w2k/xp).
Re[4]: Хук на WH_MOUSE
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.07.05 07:38
Оценка:
Кё>>>Пиши кусочек кода. На всякий случай не забудь, что поток, ставящий хук, должен иметь цикл обработки сообщений.
AS>>Откуда такая информация?

Кё>Из практики Если не вызывать GetMessage/PeekMessage, мышинные и клавиатурные хуки глючат или тормозят в консольных приложениях, например (w2k/xp).

Как я понимаю, речь идет про глобальные хуки? Как они могут тормозить из-за этого, если выполняются в контексте другого процесса? Насчет LL хуков — там все ясно, для них это необходимое условие. Но обычные — я что то очень сильно сомневаюсь.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: Хук на WH_MOUSE
От: Кодёнок  
Дата: 20.07.05 07:43
Оценка:
Здравствуйте, Andrew S, Вы писали:

Кё>>>>Пиши кусочек кода. На всякий случай не забудь, что поток, ставящий хук, должен иметь цикл обработки сообщений.

AS>>>Откуда такая информация?

Кё>>Из практики Если не вызывать GetMessage/PeekMessage, мышинные и клавиатурные хуки глючат или тормозят в консольных приложениях, например (w2k/xp).

AS>Как я понимаю, речь идет про глобальные хуки? Как они могут тормозить из-за этого, если выполняются в контексте другого процесса? Насчет LL хуков — там все ясно, для них это необходимое условие. Но обычные — я что то очень сильно сомневаюсь.

Да, о глобальных. Можешь проверить — тормозят
Re[6]: Хук на WH_MOUSE
От: Andrew S Россия http://alchemy-lab.com
Дата: 20.07.05 08:55
Оценка:
Кё>>>Из практики Если не вызывать GetMessage/PeekMessage, мышинные и клавиатурные хуки глючат или тормозят в консольных приложениях, например (w2k/xp).
AS>>Как я понимаю, речь идет про глобальные хуки? Как они могут тормозить из-за этого, если выполняются в контексте другого процесса? Насчет LL хуков — там все ясно, для них это необходимое условие. Но обычные — я что то очень сильно сомневаюсь.

Кё>Да, о глобальных. Можешь проверить — тормозят


Да, действительно, похоже на то. Довольно странное поведение csrss — тормозят только окна консоли.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.