1

Тема: AHK: Отключение клавиатуры для оного приложения

Здравствуйте.
Подскажите пожалуйста как отключить ввод с клавиатуры для одного конкретного приложения? При этом что бы во всем остальном ПК клавиатура работала.
Возможно ли так сделать?

2

Re: AHK: Отключение клавиатуры для оного приложения

Ifwinactive и blockinput то что вам нужно.

Когда вы говорите что не можете сделать, вам всего-лишь не хватает фантазии придумать какой-нибудь костыль.

3

Re: AHK: Отключение клавиатуры для оного приложения

Да, перед тем как просить помощи тут я читал  про blockinput.  Как я понял он отключает и клавиатуру и  мышь мне бы желательно только клавиатуру. Так возможно? Ну или если по нажатию кнопки можно будет вернуть работоспособность клавиатуры и мышки то тоже пойдет. belyankin12

4

Re: AHK: Отключение клавиатуры для оного приложения

Вот скрипт

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
}

он работает вроде как надо но не постоянно. Моих знаний не хватает что-бы изменить его так что-бы на кнопку включался и на кнопку отключался...
Подскажите люди добрые как это реализовать..

5

Re: AHK: Отключение клавиатуры для оного приложения

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


#If WinActive("ahk_class Notepad")
F1:: KeyBlockOn := !KeyBlockOn
#If WinActive("ahk_class Notepad") and KeyBlockOn
*q::
*w::
*e::
*r::
*t::
*y::
; добавить по вкусу
	Return

6 (изменено: SHOX, 2019-05-16 02:29:42)

Re: AHK: Отключение клавиатуры для оного приложения

stealzy
Спасибо большое! это то что нужно!
Единственно хотелось бы что бы данный скрипт можно было как то отключить одной кнопкой.. Это возможно сделать?

7 (изменено: teadrinker, 2019-05-16 02:27:40)

Re: AHK: Отключение клавиатуры для оного приложения

Для блокнота можно так:

window := "ahk_class Notepad"

OnExit(Func("KeyboardHook").Bind(false))

Loop {
   WinWaitActive, % window
   KeyboardHook(true)
   WinWaitNotActive, % window
   KeyboardHook(false)
}
   
KeyboardHook(set) {
   static hHook
   if !set
      (hHook && DllCall("UnhookWindowsHookEx", Ptr, hHook) && hHook := "")
   else
      hHook := DllCall("SetWindowsHookEx", Int, WH_KEYBOARD_LL := 13
                                         , Ptr, RegisterCallback("LowLevelKeyboardProc", "Fast")
                                         , Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
                                         , UInt, 0, Ptr)
}

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

При активности блокнота клавиатура блокируется, при неактивности или завершении скрипта — разблокируется.

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

8

Re: AHK: Отключение клавиатуры для оного приложения

teadrinker Спасибо! Работает! Но не помешало бы иметь возможность отключать  скрипт кнопкой возможно? А так спасибо! Работает как я и хотел))

9

Re: AHK: Отключение клавиатуры для оного приложения

Кнопка в переменной toggleKey (сейчас F1):

window := "ahk_class Notepad"
toggleKey := "F1"

toggle := []

OnExit(Func("KeyboardHook").Bind(false))
handler := Func("ToggleKeyboardBlock").Bind(toggle)
Hotkey, % "$" . toggleKey, % handler, On

Loop {
   WinWaitActive, % window
   ( !toggle[1] && KeyboardHook(true) )
   WinWaitNotActive, % window
   ( !toggle[1] && KeyboardHook(false) )
}
Return

ToggleKeyboardBlock(toggle) {
   global window
   toggle[1] := !toggle[1]
   SoundBeep toggle[1] ? 900 : 600
   if WinActive(window)
      KeyboardHook( toggle[1] ? false : true )
}
   
KeyboardHook(set) {
   static hHook
   if !set
      (hHook && DllCall("UnhookWindowsHookEx", Ptr, hHook) && hHook := "")
   else
      hHook := DllCall("SetWindowsHookEx", Int, WH_KEYBOARD_LL := 13
                                         , Ptr, RegisterCallback("LowLevelKeyboardProc", "Fast")
                                         , Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
                                         , UInt, 0, Ptr)
}

LowLevelKeyboardProc(nCode, wParam, lParam)
{
   global toggleKey
   static vkToggle
   ( !vkToggle && vkToggle := GetKeyVK(toggleKey) )
   vk := NumGet(lParam + 0, "UInt")
   Return vk != vkToggle ? 1 : DllCall("CallNextHookEx", Ptr, 0, Int, nCode, Ptr, wParam, Ptr, lParam)
}

Изначально блокировка включена.

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

10

Re: AHK: Отключение клавиатуры для оного приложения

teadrinker Спасибо!