Что нового

BlockInputEx - Расширенная блокировка мышки и клавиатуры

Крепыш

Новичок
Сообщения
105
Репутация
2
Написал скрипт, который:
1) Блокирует компьютер при запуске нежелательных приложений;
2) Блокирует клавиатуру и кнопки мыши при простое компьютера в течение определённого времени. Это нужно, чтобы наблюдать происходящее на экране, но чтобы никто не мог производить никаких действий на компьютере.

Код:
#include <Misc.au3>
#Include <HotKey.au3>
#include <BlockInputEx.au3>

#NoTrayIcon
Global Const $sTitle = 'Locker'
_Singleton($sTitle, 0)

Opt('MustDeclareVars', 1)
Opt('TrayMenuMode', 1+2)
Opt('TrayAutoPause', 0)
Opt('TrayIconDebug', 1)
Opt('WinTitleMatchMode', 2)

;HotKeySet('x', '_Exit')
; при нажатии на клавишу F9 открывает 'временное окно', в течение которого ($nTime) можно запустить 'нежелательное приложение'
; через время $nTime после закрытия этого приложения 'временное окно' закрывается
HotKeySet('{F9}', '_Disable')
; Правый Alt блокирует компьютер:
_HotKeyAssign(0x00A5, '_Lock', $HK_FLAG_NOREPEAT)

Global $bLock = True
Global $bScreen = False
Global $hTimer = TimerInit()
Global $hWnd
; Длительность временного окна:
Global $nTime = 30000
; Время простоя, после которого блокируются клавиатура и мышь
Global $nIdleTime = 120000

While True
  If TimerDiff($hTimer) > $nTime Then
    $bLock = True
  EndIf

; Ели запускается нежелательное приложение, то компьютер блокируется
  If WinExists("[TITLE:Диспетчер задач]") Then
    If $bLock And Not WinExists("[TITLE:Screen; CLASS:AutoIt v3]") Then
	  _Warning()
    Else
	  $hTimer = TimerInit()
    EndIf
  EndIf

; После простоя в течение времени $nIdleTime блокируется клавиатура и клавиши мыши
  If Not WinExists("[TITLE:Screen; CLASS:AutoIt v3]") Then
    If _IdleWaitStart() > $nIdleTime And $bScreen == False Then
      _Screen()
    EndIf
  EndIf

  If WinExists($hWnd) And Not WinActive($hWnd) Then
    WinActivate($hWnd)
  EndIf
  Sleep(50)
WEnd

;===================================================================================================
;===================================================================================================


; Открытие 'временного окна'
Func _Disable()
  $bLock = False
  $bScreen = False
  SplashOff()
  _BlockInputEx(0)
  $hTimer = TimerInit()
EndFunc


; Блокировка компьютера
Func _Lock()
  run('rundll32.exe user32.dll,LockWorkStation')
EndFunc


; Блокировка клавиатуры и кнопок мыши
Func _Screen()
  $bScreen = True
  _BlockInputEx(1, '{F9}|{RALT}|{MMOVE}|{MWSCROLL}')
EndFunc


; Блокировка компьютера с выводом предупреждающего сообщения
Func _Warning()
  $bLock = False
  run('rundll32.exe user32.dll,LockWorkStation')
  $hWnd = SplashTextOn("Screen", "Несанкционированный доступ", @DesktopWidth, @DesktopHeight, -1, -1, 33, "", 24)
  WinSetTrans($hWnd, "", 20)
EndFunc


Func _Exit()
  Exit
EndFunc


; Определение времени простоя
Func _IdleWaitStart()
  Local $LastInputInfo = DllStructCreate("uint;dword")
  DllStructSetData($LastInputInfo, 1, DllStructGetSize($LastInputInfo))
  DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($LastInputInfo))
  Local $iSave = DllStructGetData($LastInputInfo, 2)
  DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($LastInputInfo))
  Local $aRet = DllCall("kernel32.dll", "long", "GetTickCount")
  Return $aRet[0] - DllStructGetData($LastInputInfo, 2)
EndFunc


Функция _HotKeyAssign() взята отсюда: HotKey - Установка горячих клавиш
Функция _IdleWaitStart() взята отсюда: Можно ли отследить бездействие системы?
 

rollin

Новичок
Сообщения
15
Репутация
1
Я видимо плохо разобрался:
Код:
#include <BlockInputEx.au3>

;================== Exclude usage Example ==================

HotKeySet("{ESC}", "_Quit")
HotKeySet("{F1}", "_Quit")
HotKeySet("{Pause}", "_msg")
Run(@WindowsDir & "\Notepad.exe", "", @SW_MAXIMIZE)
WinWait("[REGEXPCLASS:Notepad.*]")
$hNotepad_Wnd = WinGetHandle("[REGEXPCLASS:Notepad.*]")
ControlSetText($hNotepad_Wnd, "", "", "first row"&@CRLF&"second row"&@CRLF&"third row")
;All keyboard keys and mouse clicks are blocked except these keys: {ESC}, "{F1}", "{PAUSE}"

_BlockInputEx(1, "{ESC}|{F1}|{PAUSE}")

While 1
    Sleep(100)
WEnd

Func _Quit()
	Exit
EndFunc

Func _msg()
	MsgBox(64,"","pause pressed",5)
EndFunc


По идее, скрипт должен заблокировать весь инпут кроме ESC,F1 и PAUSE. Но стрелки, HOME, END, DEL и их сочетания с RSHIFT,RCTRL, а также ENTER,*,/ на цифровой клавиатуре, остаются рабочими.
Очень нужно заблочить любой ввод, кроме перечисленного в Exclude.
PS:про CTRL+ALT+DEL прочитал - раз невозможно, так невозможно, а тем более мне это не критично.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
rollin [?]
Очень нужно заблочить любой ввод, кроме перечисленного в Exclude
Укажи в качестве последнего параметра 1 (_BlockInputEx(1, "{ESC}|{F1}|{PAUSE}", "", "", 1)), это блокирует любой ввод, не только пользователя (включая Send, Mouse* и т.п.).
Не уверен почему, но некоторые клавиши на цифровой части клавиатуры не определяются как ввод пользователя (у меня кстати это только 3: «NumLock», «/» и «Enter».
 

rollin

Новичок
Сообщения
15
Репутация
1
CreatoR
Укажи в качестве последнего параметра 1 (_BlockInputEx(1, "{ESC}|{F1}|{PAUSE}", "", "", 1)), это блокирует любой ввод, не только пользователя (включая Send, Mouse* и т.п.)

К сожалению, это мне не подходит. Я некорректно описал задачу. Блокировать нужно только пользовательский инпут. Скрипт, в котором я хотел бы использовать вашу библиотеку, работает с приложением как-раз посредством Send и MouseClick. Фактически, блокировка нужна только для исключения возможности случайного ввода с клавиатуры или мыши, а в Exclude хотел добавить комбинации клавиш для контроля работы скрипта.
Если есть идеи, буду рад советам!
А если чего непонятно написал, прошу простить и помиловать - за помощью обращаюсь впервые.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
rollin [?]
Если есть идеи, буду рад советам!
Позже посмотрю в чём проблема с библиотекой, видимо что то не учёл при обработке хука.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
rollin
Нашёл проблему.
Замени в библиотеке
Код:
If $iBlockAllInput = 0 And $iFlags <> 0 Then

на
Код:
If $iBlockAllInput = 0 And BitAND($iFlags, 16) Then


Позже обновлю саму библиотеку.
 

rollin

Новичок
Сообщения
15
Репутация
1
CreatoR

Спасибо, теперь работает на отлично! :ok:
 

darkwhite

Знающий
Сообщения
129
Репутация
5
а только у меня в примере с usage classes, клавиши вверх и вниз продолжают работать ?
а в примере include usage - если выключить Numlock, то они разброкируются. так и должно быть ?

при полной блокировке продолжают действовать клавиши
CTRL ATL DELETE HOME END INSERT PGUP PGDOWN SHIFT LWIN RWIN NUMPADDIV NUMPADENTER APPSKEY и все стрелки
особенно, впечатлило, что деление на numpad работает ))
 

darkwhite

Знающий
Сообщения
129
Репутация
5
[Мышь, клавиатура] Не блокируются клавиши клавиатуры при использовании BlockInput

Здравствуйте, друзья.
вопрос такой: при использовании библиотеки UDF BlockInputEx сталкнулся с тем, что при блокировки клавиатуры продолжают работать клавиши стрелок, home, end, insert,delete,pgup,pgdown, деление на numlock, enter_numlock, ctrl,alt,shift, windows, и appwin
хотелось бы заблокировать и их, но никак не получается.
попробовал скан коды на эти клавиши все равно работают ((
может есть у кого идейки на этот счет )
клава USB кстати.

код
Код:
#include <BlockInputEx.au3>

Opt("GUIOnEventMode", 1)

$form=GUICreate("Блокировка клавиатуры",200,100,0,0,0x00080000,0x00000001)
	GUISetOnEvent(-3, "_Exit")
	$but_on=GUICtrlCreateButton("ВКЛ",5,5,190,20)
		GUICtrlSetState($but_on,16)
		GUICtrlSetOnEvent($but_on,"_lock_on")
	$but_off=GUICtrlCreateButton("ВЫКЛ",5,45,190,20)
		GUICtrlSetState($but_off,32)
		GUICtrlSetOnEvent($but_off,"_lock_off")
GUISetState(@SW_SHOW,$form)

Func _exit()
	Exit
EndFunc

Func _lock_on()
	AdlibRegister("_lock_off",30000)
	_blockInputEx(3,"","0x10|0x11|0x12|0x20|0x21|0x22|0x23|0x24|0x25|0x26|0x27|0x28|0x2D|0x2E|0x30"); клавиши стрелок shift ctrl atl space home end insert delete pgup pgdown 
	GUICtrlSetState($but_on,32)
	GUICtrlSetState($but_off,16)
EndFunc

Func _lock_off()
	_blockInputEx(0)
	GUICtrlSetState($but_on,16)
	GUICtrlSetState($but_off,32)
EndFunc

While 1
	Sleep(100)
WEnd
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
darkwhite
Версия точно последняя?
И какая система?
 

darkwhite

Знающий
Сообщения
129
Репутация
5
BlockInput v1.7 - 04.05.2012, 18:45
Windows XP
вот понять и не могут даже в примерах клавищи стрелок не блокируются ((
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481

darkwhite

Знающий
Сообщения
129
Репутация
5
CreatoR [?]

Это BlockInputEx.[/quote]
Да конечно не дописал ) :whistle: :-[
А какая разрядность системы/процессора?
32 конечно 64 winxp это извращение :blum: , но проц 64 разрядную поддерживает
даже в примерах клавищи стрелок не блокируются
Кстати, встроенная BlockInput блокирует нормально?

пробовал. 8) да полностью блокирует кроме taskmgr естественно ;D
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Обновление.

[v1.8 - 12.05.2013, 12:16]
* Исправлена проблема с блокировкой некоторых клавиш на числовой клавиатуре.
* Исправлена проблема с блокировкой сочетания клавиш ALT+Tab.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Здравствуйте, CreatoR я с вами как-то обсуждал баг в вашей библиотеке по поводу разблокировки пользовательского ввода тут я только сегодня вспомнил и составил видео где четко показано что при гудках курсор продолжает двигаться! видео тут
Скрипт окна:
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <blockinputex.au3>
HotKeySet("a","_biiipka")
$Form1 = GUICreate("Form1", 346, 266, 329, 250)
$Edit1 = GUICtrlCreateEdit("", 0, 0, 345, 265, BitOR($ES_AUTOVSCROLL,$ES_WANTRETURN,$WS_HSCROLL,$WS_VSCROLL))
GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
Func _biiipka()
	_BlockInputex(1)
	For $i=1 To 5
		GUICtrlSetData($Edit1,GUICtrlRead($Edit1)&@CRLF&"Биип №"&$i)
		Beep()
	Next
	_BlockInputex(0)
EndFunc



Добавлено:
Сообщение автоматически объединено:

Да и еще бага 2 нашел.
1. После разблокировки не действует функция drag&drop глобально по всей системе.(Перенос файлов и текста в полях не происходит!)
2. Также не работают некоторые кнопки на клавиатуре(Дополнительной функциональности такие как "Сон", "Плейер", "старт\стоп проигрывания", "калькулятор", "мой компьютер"... и т.д.)
Клавиатура genius kkb-2050 (не работают белые кнопки после разблокировки)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
MnM [?]
при гудках курсор продолжает двигаться
Да странно, нативная функция на это не реагирует.
Максимум что могу предложить на данный момент, это блокировать снова после Beep.


еще бага 2 нашел
Не могу подтвердить, у меня работает. Может дело в коде и использовании?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
CreatoR сказал(а):
Может дело в коде и использовании?
Скорее всего что нет, баги найдены были сразу после снятия видео.


Добавлено:
Сообщение автоматически объединено:

CreatoR сказал(а):
Максимум что могу предложить, это блокировать снова после Beep.
К счастью блокировка возобновляется после Beep(), разблокировывается только во время действия гудка=)
 

rollin

Новичок
Сообщения
15
Репутация
1
В 64-битных скриптах UDF всегда блокирует весь ввод, в т.ч. Mouse* и *Send функции скрипта (т.е. ведет себя также, как BlockInput независимо от значения последнего параметра $iBlockAllInput)
Ниже пример для наглядности: после запуска нажать Del - скрипт заканчивается, но клика нет. (Если если убрать строки Wrappaer'а, то скрипт работает так, как надо)
Код:
#Region Wrapper
#AutoIt3Wrapper_UseX64=y
#EndRegion

#include <BlockInputEx.au3>

Global $Paused

HotKeySet ("{ScrollLock}", "_ExitTest")
HotKeySet("{PAUSE}", "_TogglePause")
HotKeySet("{delete}", "_Do")

_BlockInputEx(1, "{Pause}|0x2E")
While 1
	Sleep(500)
WEnd

Func _Do()
	MouseClick("Left",10,10)
	Exit
EndFunc

Func _ExitTest()
	Exit
EndFunc ; ==> _Exit

Func _TogglePause()
    $Paused = Not $Paused
	If $Paused Then
		_BlockInputEx(0)
	Else
		_BlockInputEx(1, "{PAUSE}|0x2E")
	EndIf
    While $Paused
        Sleep(500)
        ToolTip('Script is "Paused" - Input State is "active"', 0, 0)
    WEnd
    ToolTip("")
EndFunc   ;==>TogglePause
 

rollin

Новичок
Сообщения
15
Репутация
1
Покопавшись в коде UDF и потратив день на чтение статей MSDN, вроде как поправил то, о чем писал выше.
Ниже привожу изменения, внесенные в UDF:

Код:
;Mouse hook processing function
Func __BlockInputEx_MouseHook_Proc($nCode, $wParam, $lParam)
	If $nCode < 0 Then Return _WinAPI_CallNextHookEx($ah_MouseKeyboard_WinHooks[3], $nCode, $wParam, $lParam) ;Continue processing

;~ 	Local $MOUSEHOOKSTRUCT = DllStructCreate("ptr pt;hwnd hwnd;uint wHitTestCode;ulong_ptr dwExtraInfo", $lParam) - это не та структура
	Local $MSLLHOOKSTRUCT = DllStructCreate("long pt[2];dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo", $lParam)
	Local $iFlags = DllStructGetData($MSLLHOOKSTRUCT, "flags")
	Local $iMouse_Event = BitAND($wParam, 0xFFFF)
	;Add mouse exclude/include actions support...

	Local $sInclude = $ah_MouseKeyboard_WinHooks[4]
	Local $sExclude = $ah_MouseKeyboard_WinHooks[5]
	Local $hWnds = $ah_MouseKeyboard_WinHooks[6]
	Local $iBlockAllInput = $ah_MouseKeyboard_WinHooks[7]

	If $iBlockAllInput = 0 And $iFlags <> 0 Then
		Return _WinAPI_CallNextHookEx($ah_MouseKeyboard_WinHooks[3], $nCode, $wParam, $lParam) ;Continue processing
	EndIf

	If $sInclude <> "||" Then 	;Include proc
		If StringInStr($sInclude, "|" & $iMouse_Event & "|") And ($hWnds = "||" Or StringInStr($hWnds, "|" & __BlockInputEx_WinGetHovered() & "|")) Then
			Return 1 ;Block processing!
		EndIf
	Else 						;Exclude proc
		If Not StringInStr($sExclude, "|" & $iMouse_Event & "|") And ($hWnds = "||" Or StringInStr($hWnds, "|" & __BlockInputEx_WinGetHovered() & "|")) Then
			Return 1 ;Block processing!
		EndIf
	EndIf

	Return _WinAPI_CallNextHookEx($ah_MouseKeyboard_WinHooks[3], $nCode, $wParam, $lParam) ;Continue processing
EndFunc


Под "это не та структура" подразумевал, что хук навешен на низкоуровневый ввод мыши, а та структура предназначена для работы с хуками на события мыши - т.е. была небольшая несостыковка :-[
 
Верх