Непонятка с обработчиком WH_MOUSE

Тема в разделе "WASM.WIN32", создана пользователем ORANGIX, 18 фев 2007.

  1. ORANGIX

    ORANGIX New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    18
    Написал такую процедурку, для отлова кликов по рабочему столу
    Код (Text):
    1. proc MyMouseHookProc, nCode, wParam, lParam
    2. cmp [nCode],0
    3. jl @@Other
    4. cmp [wParam],WM_MBUTTONDOWN
    5. jne @@Other
    6. mov ebx,dword [lParam]
    7. invoke WindowFromPoint,dword [ebx+POINT.x],dword [ebx+POINT.y]
    8. cmp eax,HWND_DESKTOP ; тут наверно проблема
    9. jne @@Other
    10. invoke MessageBox,0,0,0,0
    11. @@Other:
    12. invoke CallNextHookEx,[MouseHookHandle],[nCode],[wParam],[lParam]
    13. ret
    14. endp
    Нормально ли сравнивать с HWND_DESKTOP? Handle'ов же может быть в теории много разных у одного объекта.
    Просто суть в том, что процедура норм вызывается, но почему-то всегда отрабатывает так, как будто кликали не по рабочему столу...
    Мб я где-то раньше налажал :) Объясните плиз
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    его можно получить через GetDesktopWindow()
     
  3. ORANGIX

    ORANGIX New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    18
    Код (Text):
    1. proc MyMouseHookProc, nCode, wParam, lParam
    2. cmp [nCode],0
    3. jl @@Other
    4. cmp [wParam],WM_MBUTTONDOWN
    5. jne @@Other
    6. mov ebx,dword [lParam]
    7. invoke WindowFromPoint,dword [ebx+POINT.x],dword [ebx+POINT.y]
    8. mov ebx,eax
    9. invoke GetDesktopWindow
    10. cmp eax,ebx
    11. jne @@Other
    12. invoke MessageBox,0,0,0,0
    13. @@Other:
    14. invoke CallNextHookEx,[MouseHookHandle],[nCode],[wParam],[lParam]
    15. ret
    16. endp
    Та же проблема :dntknw:
    Видимо я где-то раньше лажаю
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Я бы заменил код:
    Код (Text):
    1. mov ebx,dword [lParam]
    2. invoke WindowFromPoint,dword [ebx+POINT.x],dword [ebx+POINT.y]
    3. mov ebx,eax
    на

    Код (Text):
    1. mov edx, lParam
    2. assume edx:PTR MOUSEHOOKSTRUCT
    3. ;[edx].hwnd - дескриптор окна под указателем мыши
    4. assume edx:nothing
    ЗЫ: сразу не обратил внимания, что у тебя на fasm. Я думаю перевести не составит труда.
     
  5. ORANGIX

    ORANGIX New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    18
    Хм, чето все тот же результат :)
    Представляю вашему вниманию сверх извращенный вариант (который правда тоже не работает). Я скоро с катушек съеду :) Помогите люди

    Код (Text):
    1. proc MyMouseHookProc, nCode, wParam, lParam
    2. cmp [nCode],0
    3. jl @@DontProcess
    4. cmp [wParam],WM_LBUTTONDOWN
    5. jne @@Other
    6. mov ebx,dword [lParam]
    7. mov ebx,dword [ebx+8]
    8. call DesktopHandle
    9. cmp eax,ebx
    10. jne @@Other
    11. invoke MessageBox,0,0,0,0
    12. @@Other:
    13. invoke CallNextHookEx,[MouseHookHandle],[nCode],[wParam],[lParam]
    14. @@DontProcess:
    15. ret
    16. endp    
    17.  
    18. proc DesktopHandle
    19. ;hDesktop := FindWindowEx(FindWindowEx(FindWindow('Progman','Program Manager'), 0,'SHELLDLL_DefView', ''), 0, 'SysListView32', '');
    20. invoke FindWindow,FWdata1,FWdata2
    21. invoke FindWindowEx,eax,0,FWdata3,FWdata5
    22. invoke FindWindowEx,eax,0,FWdata4,FWdata5
    23. ret
    24. endp
    25.  
    26.  
    27. section '.data' data readable writeable
    28. hInstance dd ?
    29. FWdata1 db 'Progman',0
    30. FWdata2 db 'Program Manager',0
    31. FWdata3 db 'SHELLDLL_DefView',0
    32. FWdata4 db 'SysListView32',0
    33. FWdata5 db 0
    P.S. Еще небольшой вопрос, почему при одном нажатии клавиши моя процедура хука вызывается 5-7 раз? Это нормально?
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    У меня под мышью на рабочем столе находится элемент с именем "FolderView" и классом "SysListView32". Может стОит поискать его?

    ЗЫ: сделать подобную проверку можно http://rammerlabs.nm.ru/WinMan.zip
    ЗЗЫ: вызывается много раз, т.к. скорость вызова хуков побольше, чем та, с которой ты нажимаешь/отпускаешь клавиши!
     
  7. ORANGIX

    ORANGIX New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    18
    RamMerLabs
    пасибки за прогу, думаю в будущем поможет :)
    У меня тоже "FolderView" и классом "SysListView32", но на самом деле мой изврат-вариант тоже самое в итоге искал

    Я думаю, может я просто уже окосел за день работы и не вижу какой-нить банальной ошибки в коде своем :) ибо ну не может мир быть таким кривым :) а я сейчас могу
     
  8. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Как ты наверное увидел в WinMan'е есть перехват событий мыши. Реализовано у меня там это примерно так же, как и у тебя. Но только я в библиотеке, которая устанавливает перехват, организовал пересылку пользовательского сообщения (SendMessage, hMyProg, 406h, [edi].hWnd, 0) в основное тело программы, а там уже обрабатываю: отфильтровываю WM_MOUSEMOVE, и заполняю listview. У меня всё работает без косяков (уже!).
     
  9. ORANGIX

    ORANGIX New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    18
    RamMerLabs, ну мне хочется всеж этот вариант добить из принципа :)))

    Кстати все заработало в таком вот виде, если кому вдруг понадобится:

    Код (Text):
    1. proc GetDSKTPHandle
    2. invoke FindWindow,FWdata1,FWdata2
    3. invoke FindWindowEx,eax,0,FWdata3,FWdata5
    4. invoke FindWindowEx,eax,0,FWdata4,0
    5. ret
    6. endp
    7.  
    8. section '.data' data readable writeable
    9. hInstance dd ?
    10. FWdata1 db 'Progman',0
    11. FWdata2 db 'Program Manager',0
    12. FWdata3 db 'SHELLDLL_DefView',0
    13. FWdata4 db 'SysListView32',0
    14. FWdata5 db 0
    Такая процедура возвращает HANDLE который нормально сравнивается с HANDLE'ом из структуры

    RamMerLabs СПАСИБО
     
  10. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Да собственно и не за что...
     
  11. trust

    trust New Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    49
    RamMerLabs -
    - а как сделать так чтобы один раз щелкнул, один вызывается. а то у меня с этим большая проблема. всю голову сломал. может кто знает. заранее спасибо.