Написал такую процедурку, для отлова кликов по рабочему столу Код (Text): proc MyMouseHookProc, nCode, wParam, lParam cmp [nCode],0 jl @@Other cmp [wParam],WM_MBUTTONDOWN jne @@Other mov ebx,dword [lParam] invoke WindowFromPoint,dword [ebx+POINT.x],dword [ebx+POINT.y] cmp eax,HWND_DESKTOP ; тут наверно проблема jne @@Other invoke MessageBox,0,0,0,0 @@Other: invoke CallNextHookEx,[MouseHookHandle],[nCode],[wParam],[lParam] ret endp Нормально ли сравнивать с HWND_DESKTOP? Handle'ов же может быть в теории много разных у одного объекта. Просто суть в том, что процедура норм вызывается, но почему-то всегда отрабатывает так, как будто кликали не по рабочему столу... Мб я где-то раньше налажал Объясните плиз
Код (Text): proc MyMouseHookProc, nCode, wParam, lParam cmp [nCode],0 jl @@Other cmp [wParam],WM_MBUTTONDOWN jne @@Other mov ebx,dword [lParam] invoke WindowFromPoint,dword [ebx+POINT.x],dword [ebx+POINT.y] mov ebx,eax invoke GetDesktopWindow cmp eax,ebx jne @@Other invoke MessageBox,0,0,0,0 @@Other: invoke CallNextHookEx,[MouseHookHandle],[nCode],[wParam],[lParam] ret endp Та же проблема Видимо я где-то раньше лажаю
Я бы заменил код: Код (Text): mov ebx,dword [lParam] invoke WindowFromPoint,dword [ebx+POINT.x],dword [ebx+POINT.y] mov ebx,eax на Код (Text): mov edx, lParam assume edx:PTR MOUSEHOOKSTRUCT ;[edx].hwnd - дескриптор окна под указателем мыши assume edx:nothing ЗЫ: сразу не обратил внимания, что у тебя на fasm. Я думаю перевести не составит труда.
Хм, чето все тот же результат Представляю вашему вниманию сверх извращенный вариант (который правда тоже не работает). Я скоро с катушек съеду Помогите люди Код (Text): proc MyMouseHookProc, nCode, wParam, lParam cmp [nCode],0 jl @@DontProcess cmp [wParam],WM_LBUTTONDOWN jne @@Other mov ebx,dword [lParam] mov ebx,dword [ebx+8] call DesktopHandle cmp eax,ebx jne @@Other invoke MessageBox,0,0,0,0 @@Other: invoke CallNextHookEx,[MouseHookHandle],[nCode],[wParam],[lParam] @@DontProcess: ret endp proc DesktopHandle ;hDesktop := FindWindowEx(FindWindowEx(FindWindow('Progman','Program Manager'), 0,'SHELLDLL_DefView', ''), 0, 'SysListView32', ''); invoke FindWindow,FWdata1,FWdata2 invoke FindWindowEx,eax,0,FWdata3,FWdata5 invoke FindWindowEx,eax,0,FWdata4,FWdata5 ret endp section '.data' data readable writeable hInstance dd ? FWdata1 db 'Progman',0 FWdata2 db 'Program Manager',0 FWdata3 db 'SHELLDLL_DefView',0 FWdata4 db 'SysListView32',0 FWdata5 db 0 P.S. Еще небольшой вопрос, почему при одном нажатии клавиши моя процедура хука вызывается 5-7 раз? Это нормально?
У меня под мышью на рабочем столе находится элемент с именем "FolderView" и классом "SysListView32". Может стОит поискать его? ЗЫ: сделать подобную проверку можно http://rammerlabs.nm.ru/WinMan.zip ЗЗЫ: вызывается много раз, т.к. скорость вызова хуков побольше, чем та, с которой ты нажимаешь/отпускаешь клавиши!
RamMerLabs пасибки за прогу, думаю в будущем поможет У меня тоже "FolderView" и классом "SysListView32", но на самом деле мой изврат-вариант тоже самое в итоге искал Я думаю, может я просто уже окосел за день работы и не вижу какой-нить банальной ошибки в коде своем ибо ну не может мир быть таким кривым а я сейчас могу
Как ты наверное увидел в WinMan'е есть перехват событий мыши. Реализовано у меня там это примерно так же, как и у тебя. Но только я в библиотеке, которая устанавливает перехват, организовал пересылку пользовательского сообщения (SendMessage, hMyProg, 406h, [edi].hWnd, 0) в основное тело программы, а там уже обрабатываю: отфильтровываю WM_MOUSEMOVE, и заполняю listview. У меня всё работает без косяков (уже!).
RamMerLabs, ну мне хочется всеж этот вариант добить из принципа )) Кстати все заработало в таком вот виде, если кому вдруг понадобится: Код (Text): proc GetDSKTPHandle invoke FindWindow,FWdata1,FWdata2 invoke FindWindowEx,eax,0,FWdata3,FWdata5 invoke FindWindowEx,eax,0,FWdata4,0 ret endp section '.data' data readable writeable hInstance dd ? FWdata1 db 'Progman',0 FWdata2 db 'Program Manager',0 FWdata3 db 'SHELLDLL_DefView',0 FWdata4 db 'SysListView32',0 FWdata5 db 0 Такая процедура возвращает HANDLE который нормально сравнивается с HANDLE'ом из структуры RamMerLabs СПАСИБО
RamMerLabs - - а как сделать так чтобы один раз щелкнул, один вызывается. а то у меня с этим большая проблема. всю голову сломал. может кто знает. заранее спасибо.