1 (изменено: Foma, 2014-06-18 23:44:24)

Тема: AHK: Альтернатива BlockInput

Дело оказалось совсем в другом, поэтому меняю название темы и вопрос. Который теперь звучит так:
Какие существуют способы, кроме BlockInput, временно заблокировать клавиатуру и кнопки мыши?






Устарело:

По какой причине может не срабатывать BlockInput в таком виде

F1::
ToolTip,start
BlockInput,on
Sleep, 10000    
BlockInput, off
ToolTip,End
Sleep, 500
ExitApp

в скомпилированном файле?

2

Re: AHK: Альтернатива BlockInput

Проверил, срабатывает.

3

Re: AHK: Альтернатива BlockInput

Антивирусник блокирует за "Прямой доступ к клавиатуре". И никак нельзя настроить. Даже добавление в исключения не помогает. Жесть...

4

Re: AHK: Альтернатива BlockInput

Какие ещё способы временно заблокировать клавиатуру и кнопки мыши?

5

Re: AHK: Альтернатива BlockInput

Блокируем на 5 сек мышь и клавиатуру:

OnExit, Exit
hHookMouse := DllCall("SetWindowsHookEx"
   , Int, WH_MOUSE_LL := 14
   , Ptr, RegisterCallback("LowLevelMouseProc", "Fast")
   , Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
   , UInt, 0, Ptr)
   
hHookKeybd := DllCall("SetWindowsHookEx"
   , Int, WH_KEYBOARD_LL := 13
   , Ptr, RegisterCallback("LowLevelKeyboardProc", "Fast")
   , Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
   , UInt, 0, Ptr)
   
Sleep 5000
DllCall("UnhookWindowsHookEx", Ptr, hHookMouse), hHookMouse := ""
DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd), hHookKeybd := ""
Return

Exit:
   (hHookMouse && DllCall("UnhookWindowsHookEx", Ptr, hHookMouse))
   (hHookKeybd && DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd))
   ExitApp

LowLevelMouseProc(nCode, wParam, lParam)
{
   Return 1
}

LowLevelKeyboardProc(nCode, wParam, lParam)
{
   Return 1
}

Применять с осторожностью, может повлиять на другие приложения, использующие аналогичные хуки.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Альтернатива BlockInput

Работет. И антивирь молчит. Спасибо!

7

Re: AHK: Альтернатива BlockInput

Применять с осторожностью, может повлиять на другие приложения, использующие аналогичные хуки.

  А можно подробнее о последствиях такого влияния?

8

Re: AHK: Альтернатива BlockInput

И ещё вопрос. Наверное можно заменить блокировку мыши определённой процедурой, которая будет игнорировать клик при определённых условиях, а без них работать как обычно.
  Для клика реализовать это просто


LButton::
if (условие)
    return
else
    click
return

Но как быть, с перетаскиванием? Можно что-то придумать?

9

Re: AHK: Альтернатива BlockInput

Foma пишет:

А можно подробнее о последствиях такого влияния?

Функции LowLevelMouseProc() и LowLevelKeyboardProc() для корректной работы других приложений, где установлены подобные хуки, должны возвращать

Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)

У нас же они возвращают 1, соответственно другие приложения в этот период не будут получать hook-уведомлений и могут работать некорректно.

Но как быть, с перетаскиванием? Можно что-то придумать?

LButton::
if (условие)
    return
else
{
   Send {LButton Down}
   KeyWait, LButton
   Send {LButton Up}
}
return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Альтернатива BlockInput

Просто и эффективно с мышью получилось. А со всеми сразу клавишами также просто нельзя?

11

Re: AHK: Альтернатива BlockInput

Со всеми будет проблематично.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12 (изменено: Pogodin, 2014-06-22 20:48:40)

Re: AHK: Альтернатива BlockInput

teadrinker пишет:

Со всеми будет проблематично.

  С мышью тоже не просто оказалось. Два дня бился со странным глюком в своём скрипте: при перетаскивании окна gui за заголовок,  курсор намертво "прилипал" к заголовку и окно следовало за ним как привязанное. Думал где-то перехват происходит или ещё как-то прерывается действие, но даже critical  не спасал. Стал удалять код блок за блоком. В итоге осталось вот это:

LButton::
    {
    Send {LButton Down}
    KeyWait,LButton
    Send {LButton Up}
    }
return

1::
Gui,Show, x100 y100 w300 h200,Gui
Return


2::
ExitApp

  И курсор по прежнему "прилипает". Судя по всему до KeyWait действия не доходят. Даже вот в таком варианте

LButton::
    {
    Send {LButton Down}
    SoundBeep
    Send {LButton Up}
    }
return

1::
Gui,Show, x100 y100 w300 h200,111
Return


2::
ExitApp

при клике на заголовок окна gui, звук не воспроизводится.

Что за странный феномен и как от него можно избавиться?


  Foma, у тебя применяется gui в скрипте?

13

Re: AHK: Альтернатива BlockInput

При нажатии мышью на заголовок текущая ветвь скрипта прерывается. Это можно проследить на примере:

Gui, Show, w300 h100
Loop
{
   ToolTip % A_Index
   Sleep, 300
}

Перетаскивайте окно за заголовок — отсчёт прервётся.
Обойти можно так:

Gui, Show, w300 h100
Return

LButton::
   if (условие)
      Return
   Send {LButton Down}
   Return

LButton Up::
   Send, {LButton Up}
   Return

Хоткей LButton Up запускает новую ветвь и она выполняется.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder