Автор Тема: BlockInputEx - Расширенная блокировка мышки и клавиатуры  (Прочитано 59894 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
AutoIt: 3.2.12.1+
Версия: 1.8

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

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

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

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

Пример №1 - Использование ограничения по заданному(ым) окну(ам):
(нажмите для показа/скрытия)

Пример №2 - Использование классов:
(нажмите для показа/скрытия)

Файл: BlockInputEx_UDF_?.?.zip

Источник: CreatoR, http://www.autoitscript.com/forum/index.php?showtopic=87735
« Последнее редактирование: Май 12, 2013, 13:20:11 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

BlockInputEx - Расширенная блокировка мышки и клавиатуры
« Отправлен: Сентябрь 25, 2009, 01:08:30 »

VitAl2013

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
VitAl2013 [?]
Цитировать
Можно ли отключить все кнопки для любых приложений за исключением того с которым работаем?
Да, можно сделать такой трюк:

Код: AutoIt [Выделить]
#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


VitAl2013

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

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

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

ТО что у меня получилос:
Код: AutoIt [Выделить]
#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

« Последнее редактирование: Январь 22, 2010, 10:56:11 от VitAl2013 »

Русское сообщество AutoIt

Re: BlockInputEx - Расширенная блокировка мышки и клавиатуры
« Ответ #3 Отправлен: Январь 22, 2010, 10:25:55 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
VitAl2013  [?]
Цитировать
Как теперь заставить работать её в парралель с основным текстом программы?
А что именно должно выполняться?

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

Код: AutoIt [Выделить]
#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


VitAl2013

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

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

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

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

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

И ещё момент... Вот мы кинули Сэндом в программу, а получила ли она его? Есть способ узнать? ПРинимается любой вариант, даже через Пиксельсёч. Есть вероятность что в самый неподходящий момент начнёт работать антивирус и затормозит программу-цель, а программа-оператор продолжит метать Сэдали незная этого.
« Последнее редактирование: Январь 22, 2010, 12:16:55 от VitAl2013 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
VitAl2013
С описания увы почти ничего не понял, но если я всё же хоть что то понял :wacko:, то вот некое решение:

Код: AutoIt [Выделить]
_BlockInputEx(3)

;......

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

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


VitAl2013

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

Код: AutoIt [Выделить]
_BlockInputEx(3) ;блокируем всё и вся

;......

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

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


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

Русское сообщество AutoIt

Re: BlockInputEx - Расширенная блокировка мышки и клавиатуры
« Ответ #7 Отправлен: Январь 26, 2010, 07:53:28 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
VitAl2013
Я не пойму проблему. Функция отключает блокировку на время посылания клавиш, и затем снова включает.

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

VitAl2013

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

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
VitAl2013  [?]
Цитировать
Раскладка стандартная для Windows XP
:) Русская или Английская, или ещё какая?

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

VitAl2013

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

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

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
VitAl2013
Теперь я совсем запутался :wacko:.

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

VitAl2013

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

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

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

Мне надо найти не "другой метод открывать меню" (так как я нашёл давно их, и они меня не устраивают), а действительно альтернативный способ передачи нажатий клавиш в программу.
« Последнее редактирование: Январь 28, 2010, 08:16:53 от VitAl2013 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
VitAl2013  [?]
Цитировать
Вопрос изначально и был:
Цитата
Цитировать
Можно ли отключить все кнопки для любых приложений за исключением того с которым работаем?
Ответ: нет, нельзя.
Ответ как раз можно, я это показал в своём примере, просто твой вопрос был немного неправилен для твоей задачи ;)


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

Русское сообщество AutoIt

Re: BlockInputEx - Расширенная блокировка мышки и клавиатуры
« Ответ #14 Отправлен: Январь 28, 2010, 10:38:06 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
9 Ответов
12660 Просмотров
Последний ответ Май 20, 2010, 17:51:50
от Detka.i.alex
11 Ответов
6481 Просмотров
Последний ответ Октябрь 12, 2017, 17:11:51
от Tyr
2 Ответов
2664 Просмотров
Последний ответ Ноябрь 14, 2012, 17:20:51
от cthutq
1 Ответов
1715 Просмотров
Последний ответ Апрель 13, 2014, 16:35:59
от madmasles
15 Ответов
4528 Просмотров
Последний ответ Декабрь 03, 2014, 10:45:02
от be4hoctb
0 Ответов
1674 Просмотров
Последний ответ Май 19, 2015, 08:56:36
от jslby
0 Ответов
1071 Просмотров
Последний ответ Май 19, 2015, 10:28:18
от Yashied
11 Ответов
2173 Просмотров
Последний ответ Апрель 26, 2016, 16:25:05
от Vovsla
2 Ответов
461 Просмотров
Последний ответ Сентябрь 01, 2017, 11:50:23
от gerkuless
6 Ответов
428 Просмотров
Последний ответ Февраль 08, 2018, 17:08:29
от yl3d