Что нового

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

CreatoR

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

Категория: Мышь и клавиатура

Описание: Позволяет блокировать мышь и клавиатуру в расширенном режиме.
Эта библиотека поддерживает некоторые возможности, которых нет во встроенной BlockInput().
Вот небольшой список возможностей:

  • Отдельная блокировка мышки и клавиатуры.
  • Блокировка указанных клавиш/кнопок на клавиатуре/мышке.
    + Кроме Hex-значений, поддерживаются и строковые значение (такие как {ENTER}).
    [*]Поддержка списка исключения определённых клавиш/кнопок.
    [*]Блокирование клавиш используя т.н «CLASS Name» (см. документацию к библиотеке).
    [*]Блокировка ввода для определённого окна.
    [*]После нажатия «Ctrl+Alt+Del» ввод пользователя не возобновляется.



Примечание: Данная библиотека, как и встроенная BlockInput, не может блокировать «Ctrl+Alt+Del» (особенность системы Windows), однако при этом ввод пользователя не возобновляется.

Пример №1 - Использование ограничения по заданному(ым) окну(ам):
Код:
#include <BlockInputEx.au3>

;================== hWindows usage Example ==================

HotKeySet("{ESC}", "_Quit") ;Это вызовет выход из скрипта (на любом окне кроме блокнота (см. далее)).

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

ControlSetText($hNotepad_Wnd, "", "", _
    "Now try to input some keys in here..." & @CRLF & _
    "Well, that's the idea, you can't, don't you?" & @CRLF & @CRLF & ":)")

;Здесь мы блокируем *все* клавишы на клавиатуре для определённого окна (в этом случае окно Блокнота).
_BlockInputEx(3, "", "", $hNotepad_Wnd)

;Это только для отладки, на сллучай если что то нарушится, скрипт завершит свою работу через 10 секунд.
AdlibRegister("_Quit", 10000)

While 1
    Sleep(100)
WEnd

Func _Quit()
    Exit
EndFunc

Пример №2 - Использование классов:
Код:
#include <BlockInputEx.au3>

;================== CLASSes usage Example ==================

HotKeySet("{ESC}", "_Quit") ;Это вызовет выход из скрипта

;Здесь мы блокируем ввод клавиш нумерации, строку "Test" (каждый символ в этой группе), и клавиши стрелок UP / DOWN.
_BlockInputEx(3, "", "[:NUMBER:]|[Test]|{UP}|{DOWN}")

;Это только для отладки, на случай если что то нарушится, скрипт завершит свою работу через 10 секунд.
AdlibRegister("_Quit", 10000)

While 1
    Sleep(100)
WEnd

Func _Quit()
    Exit
EndFunc

Файл: BlockInputEx_UDF_1.8.zip

Источник:
CreatoR, http://www.autoitscript.com/forum/index.php?showtopic=87735
 

Вложения

  • BlockInputEx_UDF_1.8.zip
    10.8 КБ · Просмотры: 79
Последнее редактирование:
V

VitAl2013

Гость
Можно ли отключить все кнопки для любых приложений за исключением того с которым работаем? Зачастую выбор меню осуществляется с первичным нажатием кнопки Alt, затем буквы меню... Но если какое-либо приложение использует Alt как горячую клавишу (например Лингво, сразу мечется чего бы перевести и перехватывает ввод), то возникают проблемы. ControlSend при этом не является панацеей (Лингво всё равно куда Alt отправляют).
 
Автор
CreatoR

CreatoR

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

Код:
#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.*]")

_BlockInputEx(3)

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

While 1
	If $iMark = 0 And WinActive($hNotepad_Wnd) Then
		$iMark = 1
		_BlockInputEx(0)
	ElseIf $iMark = 1 And Not WinActive($hNotepad_Wnd) Then
		$iMark = 0
		_BlockInputEx(3)
	EndIf
	
    Sleep(10)
WEnd

Func _Quit()
	Exit
EndFunc
 
V

VitAl2013

Гость
Как теперь заставить работать её в парралель с основным текстом программы?

Проверка происходит при переключении окна по средствам while, но там программа и крутиться (между while и wend). То есть я не могу дописать мои Send или ControlSend ни до ни после while. Так? Какже мне отправлять хотябы ("!f") в ноутпад?

И это получается своего рода просто проверка на то какое окно выбрано. Нужного блока не происходит. Происходит не "блок посылки нажатий в другие приложения", а "блок нажатий при неправильно выбраном окне". То есть если окно выбрано правильное Лингво всё равно чувствует Alt и перехватаывает нажатие.

ТО что у меня получилос:
Код:
#include <BlockInputEx.au3>

HotKeySet("{ESC}", "_Quit")

Global $iMark = 0

WinActive ("[REGEXPTITLE:(Active).*Pro/ENGINEER]")
WinWaitActive ("[REGEXPTITLE:(Active).*Pro/ENGINEER]")
$hTarget_Wnd = WinGetHandle("[REGEXPTITLE:(Active).*Pro/ENGINEER]")
MsgBox (0, "WinGetHandle", $hTarget_Wnd, 2)
_BlockInputEx(3)

_check() ;тут происходит именно проверка
   ;а тут блок снимается и делай всё что хошь - всем (любой программе) всё позволено
WinWaitActive ("[REGEXPTITLE:(Active).*Pro/ENGINEER]")
MsgBox (0, "Active", "Window was selected", 2)
Send("!f")
Sleep(1000)

Func _check()
While 1
    If $iMark = 0 And WinActive($hTarget_Wnd) Then
        $iMark = 1
        _BlockInputEx(0)
    ElseIf $iMark = 1 And Not WinActive($hTarget_Wnd) Then
        $iMark = 0
        _BlockInputEx(3)
    EndIf

   ExitLoop ;если тут не сделать выход то программа бесконечно крутится между while и wend
WEnd
EndFunc

MsgBox (0, "Exitloop", "done", 2)
Exit

Func _Quit()
    Exit
EndFunc
 
Автор
CreatoR

CreatoR

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

ТО что у меня получилос:
Цикл тогда вовсе не нужен:

Код:
#include <BlockInputEx.au3>

HotKeySet("{ESC}", "_Quit")

Global $iMark = 0

$hTarget_Wnd = WinGetHandle("[REGEXPTITLE:(Active).*Pro/ENGINEER]")
WinActive($hTarget_Wnd)
WinWaitActive($hTarget_Wnd)
MsgBox(0, "WinGetHandle", $hTarget_Wnd, 2)

;Тут блокируем только если окно не активно

If Not WinActive($hTarget_Wnd) Then
     _BlockInputEx(3)
Else
     MsgBox (0, "Active", "Window was selected", 2)
     Send("!f")
     Sleep(1000)
     MsgBox (0, "Exit", "done", 2)
EndIf

Exit

Func _Quit()
    Exit
EndFunc
 
V

VitAl2013

Гость
А что именно должно выполняться?

Программа-оператор должна работать по средствам хоткеев программы-цели с программой-целью и дочерними окнами программы-цели, обходя хоткеи других программ. Другими словами - выбираем программу и работаем по ней Send'ами. Всё должно попасть в цель.

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

Думаю можно былобы соорудить какойнить SendEx(а, б) в который вкладывать проверку-блокиратор на определённую программу (а) и необходимое послание которое надо передать цели(б).

Или изменить подход и блокировать хоткеи всех программ кроме выбраной.

И ещё момент... Вот мы кинули Сэндом в программу, а получила ли она его? Есть способ узнать? ПРинимается любой вариант, даже через Пиксельсёч. Есть вероятность что в самый неподходящий момент начнёт работать антивирус и затормозит программу-цель, а программа-оператор продолжит метать Сэдали незная этого.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
VitAl2013
С описания увы почти ничего не понял, но если я всё же хоть что то понял :wacko:, то вот некое решение:

Код:
_BlockInputEx(3)

;......

_SendUnBlock("[REGEXPTITLE:(Active).*Pro/ENGINEER]", "!f")

Func _SendUnBlock($sTitle, $sSend)
	_BlockInputEx(0)
	SendKeepActive($sTitle)
	Send($sSend)
	_BlockInputEx(3)
EndFunc
 
V

VitAl2013

Гость
В принцыпе да, но что происходит:

Код:
_BlockInputEx(3) ;блокируем всё и вся

;......

_SendUnBlock("[REGEXPTITLE:(Active).*Pro/ENGINEER]", "!f")

Func _SendUnBlock($sTitle, $sSend)
    _BlockInputEx(0) ;тут идёт разблокирование и Лингво приспокойно снова ловит нажатия Альта (Лингво их ловит из бэкграунда и ему не обязательно быть активным)
    SendKeepActive($sTitle) ;полезная вещь, но Лингво всё равно какое актно активно, точнее ему бы и надо чтоб было активное окно не его
    Send($sSend) ;мы ведь отправляем "!f", что значит Alt+f, Лингво ловит Альт и начинает искать что ему перевести.
    _BlockInputEx(3)
EndFunc


В итоге мы не далеко ушли от простого блока клавишь и нажатий.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
VitAl2013
Я не пойму проблему. Функция отключает блокировку на время посылания клавиш, и затем снова включает.

Проблема в отправке Alt+F? тогда такой вопрос - какая раскладка клавиатуры в системе по умолчанию?
 
V

VitAl2013

Гость
какая раскладка клавиатуры в системе по умолчанию
Раскладка стандартная для Windows XP.

Функция отключает блокировку на время посылания клавиш, и затем снова включает.
Да действительно - это так и есть. Но она включает и выключает её для всех программ сразу, а не только конкретно для какой-то.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
VitAl2013 [?]
Раскладка стандартная для Windows XP
:smile: Русская или Английская, или ещё какая?

Но она включает и выключает её для всех программ сразу, а не только конкретно для какой-то
Так это на долю секунды, на время выполнения команды Send.
 
V

VitAl2013

Гость
на долю секунды
Для лингво этого достаточно. Он уже поймал Альт на себя и в программу которую надо он не попал, а только попал оставшийся "f".
Если тоже самое организовать со стандартным BlockInput то чем они будут отличаться?

Русская или Английская, или ещё какая?
Ааа... Язык раскладки какой? Могут быть оба, но на что это влияет?
Я было подумал Мак-102-104-фонетическая или вообще не qwerty раскладка.
 
Автор
CreatoR

CreatoR

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

Перечитал твой вопрос с начала, и вроде прояснилась ситуация - тебе нужно заблокировать ALT для лингво, т.е иметь возможность обойти его и всё же посылать куда нужно сочетание «Alt+i», или я ошибаюсь? если нет, то BlockInput тут не поможет, тут нужно либо изменить клавишу в лингво, либо найти другой метод открывать меню (вместо ALT'а).
 
V

VitAl2013

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

Вопрос изначально и был:
Можно ли отключить все кнопки для любых приложений за исключением того с которым работаем?

Ответ: нет, нельзя. Так как мы включаем и отключаем клавиши только для всех приложений сразу или для заранее известных приложений.

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
VitAl2013 [?]
Вопрос изначально и был:
Цитата
Можно ли отключить все кнопки для любых приложений за исключением того с которым работаем?
Ответ: нет, нельзя.
Ответ как раз можно, я это показал в своём примере, просто твой вопрос был немного неправилен для твоей задачи ;)


альтернативный способ передачи нажатий клавиш в программу
ControlSend? но это уже в другую тему.
 
Автор
CreatoR

CreatoR

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

[v1.4 - 03.08.2010, 12:00]
+ Поддержка AutoIt 3.3.6.1.
* Исправлена проблема с залипанием клавиш "Alt + Ctrl" после вызова "Alt + Ctrl + Del". Кроме прочего, это вызывало проблемы дальнейшего использования HotKeySet.
* Исправлены примеры для совместимости с AutoIt 3.3.6.1.
* Мелкие косметические поправки в коде.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Мелкое fix-обновление («проблема с залипанием клавиш "Alt + Ctrl"») для тех (того?) кто успел скачать последнюю версию. Номер версии остался тот же.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
А для определенного окна можно блокировать нажатия\отжатия мыши? Попробовал - с клавиатурой без проблем, с мышью - блокирует для всех окон или не блокирует вообще.
 
Автор
CreatoR

CreatoR

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

WSWR
WSWR сказал(а):
А для определенного окна можно блокировать нажатия\отжатия мыши? Попробовал - с клавиатурой без проблем, с мышью - блокирует для всех окон или не блокирует вообще.
Покажи как пробовал.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Re: BlockInputEx - Расширенная блокировка мышки и

CreatoR сказал(а):
Покажи как пробовал.

Код:
#include <BlockInputEx.au3>
Run(@WindowsDir & "\Notepad.exe", "", @SW_RESTORE)
WinWait("Безымянный — Блокнот")
$hNotepad_Wnd = WinGetHandle("Безымянный — Блокнот")
ControlSetText($hNotepad_Wnd, "", "", _
	"Now try to input some keys in here..." & @CRLF & _
	"Well, that's the idea, you can't, don't you?" & @CRLF & @CRLF & ":)")
_BlockInputEx(2, "", "", $hNotepad_Wnd)
While 1
    Sleep(100)
WEnd


В принципе, работает, но следующим образом: если окно блокнота становится активным, то мышь блокируется на всем экране, если же с помощью клавиатуры активизировать другое окно, то мышь начинает работать. Подстановка в функцию {MPDOWN}, {MPUP} и т.д. не меняет поведение скрипта
Изначально цель была запретить нажатия кнопок мыши в этом окне, чтобы его нельзя было перемещать, закрывать и т.д.
 
Верх