musicstashall
Знающий
- Сообщения
- 322
- Репутация
- 7
Всем доброго.
Неожиданно столкнулся с проблемой переполнения очереди сообщений от хука. Как решить — не знаю. Хуки используются от очень частых событий, таких как $EVENT_OBJECT_CREATE и иногда, при сильном заполнении, виснет даже рабочий стол. Недопустимо. Мне нужны события только от ряда классов объектов, указанных в переменной $_jData, все прочие не интересуют. Если б можно было как-то пропускать или отменять хуки, не знаю. Подскажите пажалста. Реализовано таким способом:
Неожиданно столкнулся с проблемой переполнения очереди сообщений от хука. Как решить — не знаю. Хуки используются от очень частых событий, таких как $EVENT_OBJECT_CREATE и иногда, при сильном заполнении, виснет даже рабочий стол. Недопустимо. Мне нужны события только от ряда классов объектов, указанных в переменной $_jData, все прочие не интересуют. Если б можно было как-то пропускать или отменять хуки, не знаю. Подскажите пажалста. Реализовано таким способом:
Код:
#include <WinAPISys.au3>
#include <WinAPISysWin.au3>
OnAutoItExitRegister('OnAutoItExit')
Global $_jData = 'tooltips_class32|ViewControlClass|DropDown|ComboLBox|Net UI Tool Window|Net UI Tool Window Layered'
Global $hEventProc = DllCallbackRegister('WM_SYSHOOK', 'none', 'ptr;dword;hwnd;long;long;dword;dword')
Global $hEventHook = _WinAPI_SetWinEventHook($EVENT_OBJECT_CREATE, $EVENT_OBJECT_SHOW, DllCallbackGetPtr($hEventProc))
While 1
Sleep(300)
WEnd
Func WM_SYSHOOK($hEventHook, $iEvent, $hWnd, $iObjectID, $iChildID, $iThreadId, $iEventTime)
Local $iClass = _WinAPI_GetClassName($hWnd)
ConsoleWrite('+ hWnd: ' & $hWnd & ', Class: ' & $iClass & @CR)
If StringInStr($_jData, $iClass) Then
; выполняем действие
EndIf
EndFunc
Func OnAutoItExit()
_WinAPI_UnhookWinEvent($hEventHook)
DllCallbackFree($hEventProc)
EndFunc