Что нового

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

Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
WSWR [?]
Подстановка в функцию {MPDOWN}, {MPUP} и т.д. не меняет поведение скрипта
Для мышки $hWindows не предназначено, т.к в момент блокировния всё ровно фокус переместить на другое окно нельзя. Хотя это можно обойти если проверять окно под курсором.

Код:
#include <BlockInputEx.au3>

HotKeySet("{ESC}", "_Quit") ;This will trigger an exit (on the Notepad's window).

Global $iMark = 0

Run(@WindowsDir & "\Notepad.exe", "", @SW_MAXIMIZE)
WinWait("[REGEXPCLASS:Notepad.*]")
$hNotepad_Wnd = WinGetHandle("[REGEXPCLASS:Notepad.*]")

;This is only for testing, so if anything go wrong, the script will exit after 10 seconds.
AdlibRegister("_Quit", 10000)

While 1
	If $iMark = 0 And _WinGetHoveredHandle() = $hNotepad_Wnd Then
		$iMark = 1
		_BlockInputEx(2, "", "{MPDOWN}|{MPUP}|{MSDOWN}|{MSUP}")
	ElseIf $iMark = 1 And _WinGetHoveredHandle() <> $hNotepad_Wnd Then
		$iMark = 0
		_BlockInputEx(0)
	EndIf
	
    Sleep(10)
WEnd

Func _Quit()
	Exit
EndFunc

Func _WinGetHoveredHandle()
	Local $iOld_Opt_MCM = Opt("MouseCoordMode", 1)
	Local $aRet = DllCall("user32.dll", "int", "WindowFromPoint", "long", MouseGetPos(0), "long", MouseGetPos(1))
	Opt("MouseCoordMode", $iOld_Opt_MCM)
	$aRet = DllCall("User32.dll", "hwnd", "GetAncestor", "hwnd", $aRet[0], "uint", 2) ;$GA_ROOT
	Return HWnd($aRet[0])
EndFunc
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
CreatoR
Отличный пример, спасибо!
 

sss

Продвинутый
Сообщения
332
Репутация
96
UDF классная и полезная! Но! Какая-то странная ошибка...
Хочу сделать блокировщика экрана. Вот часть кода:
Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <BlockInputEx.au3>
$gui=GUICreate('s',0,0,0,0,$WS_POPUP,$WS_EX_COMPOSITED)
;GUICtrlCreatePic(@ScriptDir & '\bg.gif',0,0,@DesktopWidth+2,@DesktopHeight+2)
GUISetState()
WinSetOnTop('s','',1)
_BlockInputEx(1,"[:NUMBER:]|{ENTER}|{BACKSPACE}|{LCTRL}|{MPDOWN}|{MPUP}")

Я хочу заблокировать все кроме левого Ctrl, BackSpace, Enter, всех цифр и нажатия на мышку. Но! Все вроде нормально, мышь не двигается, но работают Windows-сочетания, такие как Ctrl-Alt-Delete, Win-E, Ctrl-Esc и другие, хотя эти кнопки заблочены. Потом в этом же скрипте использую цикл проверки нажатия левого Ctrl + левая мышка (да, вот такой хоткей у меня :smile:). Использую _IsPressed UDF. Вот код:
Код:
#include <IsPressed_UDF.au3>
AdlibRegister('my_Rescue',3000)
Func my_Rescue()
    if _IsAndKeyPressed('11|01') Then
	Beep(500,500)
	$var=InputBox('','Введи пароль!','','+')
    EndIf
EndFunc

Как это можно исправить? Ведь какая блокировка без блокировки системных хоткеев? :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Sky-WaLkeR [?]
Ведь какая блокировка без блокировки системных хоткеев?
Посмотрите здесь: HotKey - Установка горячих клавиш
Возможность установить абсолютно любые горячие клавиши, включая такие как CTRL+ALT+DEL*, F12, WIN+... и т.д
Попробуйте назначить на них функцию типа $i + 1.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Sky-WaLkeR [?]
работают Windows-сочетания, такие как Ctrl-Alt-Delete
«Ctrl+Alt+Del» заблокировать нельзя, это особенность системы, однако в отличий от встроенной BlockInput, тут ввод пользователя не активируется.

Использую _IsPressed UDF
Не эту версию надо полагать?

P.S
Я забыл обновить тут, но уже давненько доступна версия 1.5, и сейчас выложу 1.6...
 
Автор
CreatoR

CreatoR

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

sss

Продвинутый
Сообщения
332
Репутация
96
Creator
Нет, не эту, надо исправить ). Спасибо за быстрый ответ и обновление UDF.
madmasles
Спасибо за ссылку, поэкспериментирую...
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
А возможно сделать блокировку клавиш с разных клавиатур?
На оф форуме есть такая тема:
http://www.autoitscript.com/forum/topic/95105-hid-human-interface-device-communications-in-xp/
Получается, детектировать устройство, генерирующее нажатие, возможно, но можно ли блокировать одно и не блокировать другое? :-\
Интересно было бы и раздельное назначение горячих клавиш.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
И все-таки было бы интересно узнать мнение старших товарищей о возможности блокировки разных клавиатур\устройств ввода :laugh:
 

Alexander

Новичок
Сообщения
105
Репутация
2
А можете показать, как с минимальным количеством действий заблокировать, например, Alt (и др. кнопки (без мышки))?
Просто хочу понять как это работает, а в этой библиотеке ничего не понятно.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Alexander [?]
как с минимальным количеством действий заблокировать, например, Alt
Alt сама по себе проблематичная клавиша, по идее должно было работать так:

Код:
_BlockInputEx(3, "", "{ALT}")


но увы, оказалось что оно блокирует только отжатие клавиши, это можно увидеть например, при попытке переключения окон (Alt + Tab).

Обойти можно так:
Код:
_BlockInputEx(3, "", "[:SPECIAL:]")

но это блокирует и другие служебные клавиши.
 

Alexander

Новичок
Сообщения
105
Репутация
2
CreatoR
Я не то имел ввиду. Как без библиотеки с минимальным количеством действий заблокировать, например, Alt
То есть вытащить из библиотеки минимум действий :smile:
 

Alexander

Новичок
Сообщения
105
Репутация
2
Чтоб понять как это все работает (+ еще бывало такое, что блокировало просто так клавишу и пришлось перезагружать компьютер)...
 

La2Angel

Новичок
Сообщения
156
Репутация
1
Как избежать проблему, в вин 7 при нажатии CTRL+ALT+DEl перестает блокировать клавиатуру.
 
Сообщения
36
Репутация
-2
БЛОКИНПУТ с русской раскладкой не работает, помогите плиз.
 

jawello

Новичок
Сообщения
4
Репутация
0
отличная библиотека. спасибо.

возник вопрос. у меня скрипт создает окно с прогресс баром, и пока скрипт выполняется, хотелось бы заблокировать все окна, кроме окна самого скрипта (на него повесить кнопочки, н-р стоп, пауза, плей). я подозреваю, что можно получить список всех открытых окон и в цикле пробежать вызывая функцию блокирования окна, для каждого из открытых окон. но может быть есть уже готовое решение для подобной проблемы?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
jawello [?]
хотелось бы заблокировать все окна, кроме окна самого скрипта
Ну так в архиве последней версий есть же пример «Example - Exclude Spec Window.au3».
 

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Встроенная BlockInput блокирует действия юзера но не блокирует команды скрипта Send, MouseClick и т.д.
Возможно ли что бы BlockInputEx так же действовала, и не блокировала команды скрипта?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
rusreg79 [?]
Возможно ли что бы BlockInputEx так же действовала, и не блокировала команды скрипта?
Обновил библиотеку (ровно год и один месяц после выхода предыдущей версии :smile: ):

[v1.7 - 04.05.2012, 18:45]
* Теперь по умолчанию блокирование ввода влияет только на ввод пользователя, как и в стандартной функции BlockInput. Это можно изменить используя новый параметр $iBlockAllInput, если указать 1, то будет блокироваться любой ввод (включая от функции типа Send и MouseMove), в противном случае только ввод пользователя будет блокирован.
* Добавлен новый параметр $iBlockAllInput для возможности блокировки только пользовательского ввода (по умолчанию 0, только ввод пользователя будет блокирован).
* Мелкие поправки.
 
Верх