1

Тема: AHK: Возможность вкл/выкл блокировки ввода с клавиатуры

Есть код в коллекции:Блокировка ввода с клавиатуры для указанного окна, но мне нужно приостановить его работу по нажатию кнопки.

+ открыть спойлер
#Persistent
Gui, add, edit, vblblbl
l:=0
Gui,add,Button, gLock, вкл/выкл
Gui,show, w200 h200,Окно
WinTtl=Окно
 Return

Lock:
{
if l=1
	{
    SendEvent, {vkFF}
    l:=0 
	}
else if l=0
	{
   SetTimer, BlockKbd, 100
   l:=1
	}
}
return

BlockKbd:
    SetTimer, BlockKbd, Off

    Loop 
    {
        WinWaitActive, %WinTtl%        
        SetTimer, UnBlockKbd, 100    
        Input, InputKeys,, {vkFF}    
    }
    Return

UnBlockKbd:
    SetTimer, UnBlockKbd, Off
    WinWaitNotActive, %WinTtl%  
    SendEvent, {vkFF}       
    Return
    
F10::ExitApp

Guiclose:
ExitApp

Работает как-то одноразово, ну решил:"Нужно проверять значение переменной l"

+ открыть спойлер
#Persistent
WinTtl=Окно
  SetTimer, BlockKbd, 100
Gui, add, edit, vblblbl
l:=0
Gui,add,Button, gLock, вкл/выкл
Gui,show, w200 h200,Окно

 Return

Lock:
{
if l=1
    l:=0 
else if l=0
   l:=1
}
return

BlockKbd:
    SetTimer, BlockKbd, Off

    Loop 
    {
        WinWaitActive, %WinTtl%        
        SetTimer, UnBlockKbd, 100  
        if l=1
			SetTimer, UnBlockKbd, 100        
        else
        Input, InputKeys,, {vkFF}    
    }
    Return

UnBlockKbd:
    SetTimer, UnBlockKbd, Off
    Loop
    {
    if l=0 
		SendEvent, {vkFF} 
    else ifWinNotActive, %WinTtl% 
        SendEvent, {vkFF} 
}
    Return
    
F10::ExitApp

Guiclose:
ExitApp

Как сделать, чтобы можно было вкл/выкл возможность скрипта блокировать ввод?

AutoHotkey - 1.1.32.00

2 (изменено: svoboden, 2018-08-12 05:50:54)

Re: AHK: Возможность вкл/выкл блокировки ввода с клавиатуры

Так можно, по нажатию кнопки F12 вкл/выкл:

#UseHook
#Persistent
l:=0
Gui, add, edit, vblblbl
Gui,add,Button, gLock, вкл/выкл
Gui,show, w200 h200,Окно
WinTtl=Окно
 Return


Lock:
if (l=1)
    {
  SendEvent, {vkFF 2}
    l:=0
    }
Else if (l=0)
    {
   SetTimer, Block, -1
   l:=1
    }
return

Block:
    WinWaitActive, %WinTtl%        
    Input, InputKeys,, {vkFF}    
    Return

Guiclose:
ExitApp

F12::
if (l=1)
    {
  SendEvent, {vkFF 2}
    l:=0
    }
Else if (l=0)
    {
   SetTimer, Block, -1
   l:=1
    }
Return

F10::ExitApp

3 (изменено: serzh82saratov, 2018-08-12 14:08:13)

Re: AHK: Возможность вкл/выкл блокировки ввода с клавиатуры

+ открыть спойлер

Input не особо надёжен, тем более для блокировки.
Пример для нескольких окон по классу и exe.


Global Arr := {Notepad:"notepad.exe"
			,CalcFrame:"calc.exe"} 
Run Notepad
Run Calc
Return

Esc::ExitApp

EVENT_SYSTEM_FOREGROUND(hWinEventHook, event, hwndid, idObject, idChild, dwEventThread, dwmsEventTime) {
	Static _ := SetWinEventHook("EVENT_SYSTEM_FOREGROUND", 0x0003)
	If (idObject || idChild)
		Return
	WinGetClass, Class, % "ahk_id " hwndid
	If Arr.HasKey(Class) || SetHook(0)
	{
		WinGet, Process, ProcessName, % "ahk_id " hwndid  
		SetHook(Arr[Class] = Process)   
	}
} 

SetHook(On) {
	Static hHookKeybd, _ := OnExit(Func("SetHook").Bind(0))
	DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd)
	If On
		hHookKeybd := 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
}

SetWinEventHook(EventProc, eventMin, eventMax = 0)  {
	Return DllCall("SetWinEventHook"
				, "UInt", eventMin, "UInt", eventMax := !eventMax ? eventMin : eventMax
				, "Ptr", hmodWinEventProc := 0, "Ptr", lpfnWinEventProc := RegisterCallback(EventProc, "F")
				, "UInt", idProcess := 0, "UInt", idThread := 0
				, "UInt", dwflags := 0x0|0x2, "Ptr")	;	WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS
}

ADD:
Не внимательно прочитал, то что надо по кнопке снимать перехват.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

4 (изменено: Gutalin, 2018-08-12 14:58:48)

Re: AHK: Возможность вкл/выкл блокировки ввода с клавиатуры

svoboden, да, всё работает очень хорошо и блокирует ввод во всех окнах.
Почему это не работает?

+ открыть спойлер
#UseHook
#Persistent
l:=0
Gui, add, edit, vblblbl
Gui,add,Button, gLock, вкл/выкл
Gui,show, w200 h200,Окно
WinTtl=Окно
 Return


Lock:
if (l=1)
    {
    SendEvent, {vkFF}
    l:=0
    }
Else if (l=0)
    {
   SetTimer, Block, -1
   l:=1
    }
return

Block:
While l=0
{
IfWinNotActive, %WinTtl%
    break
else IfWinActive, %WinTtl%
Input, InputKeys,, {vkFF}
}
Return


Guiclose:
ExitApp

F10::ExitApp

Add:
l:=1 идёт сразу после выполнения block и это всё ломает
AdD2:
Вроде разобрался и работает, но всеравно блокирует все окна:


#UseHook
#Persistent
l:=1
Gui, add, edit, vblblbl
Gui,add,Button, gLock, вкл/выкл
Gui,show, w200 h200,Окно
WinTtl=Окно
 Return


Lock:
if (l=1)
    {
    l:=0
    SetTimer, Block, -1
    }
Else if (l=0)
    {
    l:=1
    SendEvent, {vkFF}
    }

return

Block:
While l=0
{
IfWinNotActive, %WinTtl%
    break
else IfWinActive, %WinTtl%
Input, InputKeys,, {vkFF}
}
Return


Guiclose:
ExitApp

F10::ExitApp
AutoHotkey - 1.1.32.00

5

Re: AHK: Возможность вкл/выкл блокировки ввода с клавиатуры

Проблема была решена проще.
Всем спасибо за ответы!

AutoHotkey - 1.1.32.00

6 (изменено: svoboden, 2018-08-19 04:34:31)

Re: AHK: Возможность вкл/выкл блокировки ввода с клавиатуры

Gutalin пишет:

но все равно блокирует все окна:

Можно, чтобы только одно блокировало:

#Persistent
l:=0
Gui, add, edit, vblblbl
 Gui, add, Button, gLock, вкл/выкл
  Gui, show, w200 h200, Окно
 WinTtl = Окно
Return

Lock:
{
if l=1
    {
  SetTimer, bd, Off
  SendEvent, {vkFF 2}
    l:=0
    }
Else if l=0
    {
   SetTimer, Block, -1
   l:=1
    }
  }
return

Block:
    IfWinActive, %WinTtl%
    SetTimer, bd, 1
    Input, InputKeys,, {vkFF 2}
    l:=0
    Return

Guiclose:
ExitApp

F12::
{
if l=1
    {
  SetTimer, bd, Off
  SendEvent, {vkFF 2}
    l:=0
    }
Else if l=0
   {
   SetTimer, Block, -1
   l:=1
   }
 }
Return

F10::ExitApp

bd:
   SetTimer, t, -1
   IfWinNotActive, %WinTtl%
   SendEvent, {vkFF 2}
   Exit
Return

t:
SetTimer, bd, Off
Return

Как вы проще решили эту проблему?