mouse_event - не могу понять в чем ошибка

Тема в разделе "WASM.BEGINNERS", создана пользователем hapr, 17 май 2018.

Метки:
  1. hapr

    hapr Member

    Публикаций:
    0
    Регистрация:
    9 мар 2009
    Сообщения:
    59
    Допустим есть глобальный клавиатурный хук(без dll), при нажатии например клавиши VK_CLEAR он должен нажать левую клавишу мыши и сразу отпустить ее. Когда VK_CLEAR отпускается нечего не делаем лишь блокируем ее. И тут появляется ошибка: если есть нажать VK_CLEAR и не отпускать некоторое время, то происходит следующие: при вызове mouse_event поток отвечающий за хук перестает отвечать, что с ним происходит так и не понял, но это поток уже никакими обычными средствами не убивается. И уже все последующие вызовы mouse_event из других приложений приводят к тому же результату для приложения использующее mouse_event. Пробовал между вызовами mouse_event вставлять keybd_event, а так же Sleep - нечего не помогло.
    Может кто знает почему это происходит и как это решить?
    Вот код пример.

    Код (ASM):
    1.  
    2.   proc LowLevelKeyboardProc [ebp esi edi ebx],!nCode,!wParam,!lParam
    3.   cmp  [!nCode],0
    4.   jne .Skip
    5.   mov  ebx,[!lParam];ebx = [!lParam]
    6.   movzx  esi,byte[ebx+KBDLLHOOKSTRUCT.vkCode];ebx = [!lParam]
    7.   cmp  esi,VK_CLEAR
    8.   jne  .Skip
    9.   test  [ebx+KBDLLHOOKSTRUCT.flags],0x80;ebx = [!lParam]
    10.   jnz  .InterlockKey
    11.   .Mouse:
    12.   invoke  mouse_event,MOUSEEVENTF_LEFTDOWN,0,0,0,0
    13.   invoke  mouse_event,MOUSEEVENTF_LEFTUP,0,0,0,0
    14.   .InterlockKey:
    15.   mov  eax,1
    16.   ret
    17.  
    18.   .Skip:
    19.   invoke  CallNextHookEx,0,[!nCode],[!wParam],[!lParam]
    20.   ret
    21.  endp
    22.          
    Решение есть, так как программа покрайнемере одна имеется но как в ней это решаеться ?
    Программа KeyExtender, прикрепляю скрин, в ней идет просто две mouse_event, а я так и не смог понять почему у меня глючит а в этой программе нет.
     

    Вложения:

  2. hapr

    hapr Member

    Публикаций:
    0
    Регистрация:
    9 мар 2009
    Сообщения:
    59
    Нашел решение.
    Почему это происходит фиг его знает, но происходит это только если в самом клавиатурном низкоуровневом хуке использовать два раза или более mouse_event, решается это выполнением mouse_event вне хука отправив например сообщение в поток в катором выполняеться сам хук. В ответ на это сообщение и выполнить mouse_event .