Тема: AHK: Отключение клавиатуры для оного приложения
Здравствуйте.
Подскажите пожалуйста как отключить ввод с клавиатуры для одного конкретного приложения? При этом что бы во всем остальном ПК клавиатура работала.
Возможно ли так сделать?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте.
Подскажите пожалуйста как отключить ввод с клавиатуры для одного конкретного приложения? При этом что бы во всем остальном ПК клавиатура работала.
Возможно ли так сделать?
Ifwinactive и blockinput то что вам нужно.
Да, перед тем как просить помощи тут я читал про blockinput. Как я понял он отключает и клавиатуру и мышь мне бы желательно только клавиатуру. Так возможно? Ну или если по нажатию кнопки можно будет вернуть работоспособность клавиатуры и мышки то тоже пойдет. belyankin12
Вот скрипт
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
}
он работает вроде как надо но не постоянно. Моих знаний не хватает что-бы изменить его так что-бы на кнопку включался и на кнопку отключался...
Подскажите люди добрые как это реализовать..
Вам ведь нужно чтобы это включалось когда окно активно, значит нужно еще поставить оконный хук, который будет управлять состоянием клавы.
Предлагаю вам более простой подход:
#If WinActive("ahk_class Notepad")
F1:: KeyBlockOn := !KeyBlockOn
#If WinActive("ahk_class Notepad") and KeyBlockOn
*q::
*w::
*e::
*r::
*t::
*y::
; добавить по вкусу
Return
stealzy
Спасибо большое! это то что нужно!
Единственно хотелось бы что бы данный скрипт можно было как то отключить одной кнопкой.. Это возможно сделать?
Для блокнота можно так:
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
}
При активности блокнота клавиатура блокируется, при неактивности или завершении скрипта — разблокируется.
teadrinker Спасибо! Работает! Но не помешало бы иметь возможность отключать скрипт кнопкой возможно? А так спасибо! Работает как я и хотел))
Кнопка в переменной 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)
}
Изначально блокировка включена.
teadrinker Спасибо!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться