Войти

Показать полную графическую версию : [решено] Разблокирование Клавиатуры и мыши по нажатию на {ESC}


Страниц : [1] 2

saavaage
03-08-2010, 01:27
Собственно, не срабатывает такой скрипт:

#include <BlockInputEx.au3>

;================== Block All Example ==================

HotKeySet("", "_Quit") ; отработка функции _Quit при нажатии на ескей

;Блокирует клавиатуру и мышь. Исключение - нажатие на клавишу Ескей
_BlockInputEx(1, "0x1B")

;на всякий случай, разблокировка в любом случае через 15 seconds.
Sleep(15000)
_BlockInputEx(0)

Func _Quit() ; задание самой функции _Quit (разблокирования)
_BlockInputEx(0)
EndFunc


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

Скрипт -немного модифицированный пример из _BlockInputEx_UDF_1.3 (от MrCreator).

Creat0R
03-08-2010, 01:50
не срабатывает такой скрипт »
И не должен, в HotKeySet не указана клавиша для вызова функции :)

Кстати можно и так:

_BlockInputEx(1, "{ESC}")

saavaage
03-08-2010, 01:54
Creat0R, это я пропустил, когда копировал. На компе, естессвенно, с {ESC}. Не работает. Уже и так и так пробывал.

Creat0R
03-08-2010, 01:56
На компе, естессвенно, с {ESC} »
Ну тогда у меня работает, а в чём проблема?

saavaage
03-08-2010, 01:59
Creat0R, может быть в моей функции? у меня версия 1.3

Вот получившийся скрипт:

#include <BlockInputEx.au3>

;================== Block All Example ==================

HotKeySet("{ESC}", "_Quit") ; отработка функции _Quit при нажатии на ескей

;Блокирует клавиатуру и мышь. Исключение - нажатие на клавишу Ескей
_BlockInputEx(1, "{ESC}")

;на всякий случай, разблокировка в любом случае через 15 seconds.
Sleep(15000)
_BlockInputEx(0)

Func _Quit() ; задание самой функции _Quit (разблокирования)
_BlockInputEx(0)
EndFunc

лежит у меня в одной директории с функцией (ее прикрепил к шапке топика). Разблокировка не отрабатывает.

На всякий, прикрепил сам скомпилированный файл. Разблокировка по любому через 15 сек

saavaage
03-08-2010, 03:39
Creat0R, не знаю, в чем было дело, но после перезагрузки ПК, все отработало на ура. Спасибо. Тема закрыта.

saavaage
03-08-2010, 12:18
Creat0R, рано я обрадовался.. Обнаружил такой косячок:
если просто нажимаешь F8, то блокировка снимается;
если же сначала нажать Ctrl+Alt+Del, то потом жать на F8 бесполезно. Даже и не знаю, как это "объехать"...

Код:
;Предотвращение появление процесса-клона
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)

;Блокирование ПК
#include <BlockInputEx.au3>
Opt("WinWaitDelay", 1)
$sTaskMgr_Title = "[CLASS:#32770;REGEXPTITLE:(Диспетчер задач|Task Manager)]"
;Disable Task Manager
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "1")

HotKeySet("{F8}", "_Quit") ; отработка функции _Quit при нажатии на F8

;Блокирует клавиатуру и мышь. Исключение - нажатие на клавишу F8
_BlockInputEx(1, "{F8}")

Func _Quit() ; задание самой функции _Quit (разблокирования)
_BlockInputEx(0)
EndFunc

; в случае, если скрипт запускается из батника, то первый параметр ком . строки передаетс в $line (задаем время отработки прогресс-бара)
if $CmdLine[0] > 0 Then
$line = $CmdLine[1]
Else
;иначе идет считывание из finish.cmd времени отработки прогрессбара и передача этого значения в переменную $line
$line = FileReadLine(@ScriptDir & "\finish.cmd", 2)
EndIf


$iPID = Run(@COMSPEC & ' /c %SYSTEMDRIVE%\finish.cmd', "", @SW_HIDE)
While ProcessExists($iPID)
$Title = "Пожалуйста, подождите..." ; Заголовок
$SubTitle = "Происходит финализация установки" ; Суб-заголовок
$Message = "После удаления мусора, оставшегося от установки" & @CRLF ; Сообщение. Записано в таком виде для удобства
$Message &= "XP и создания/перемещения ярлыков, Система" & @CRLF
$Message &= "будет перезагружена. Осталось времени: "

$Time = $line ; Время здесь хранится в миллескундах. 1 с = 1000 мс

$Sleep = 0.01 * 100000 ; 10 мс. Меньше 1 мс ставить не рекомундуется. Впрочем, тут и 100 мс хватает.

$Timer = TimerInit() ; Инициализация таймера.

ProgressOn($Title, $SubTitle, $Message & $Time) ; Параметры: заголовок, суб-заголовок, сообщение. Включаем окно прогресса.
While TimerDiff($Timer) < $Time ; Пока прошло времени меньше чем нужно - повторять:
ProgressSet(TimerDiff($Timer) / $Time * 100, $Message & Round(($Time - TimerDiff($Timer)) / 1000, 0) & " секунд")
; ProgressSet ( percent [, "subtext" [, "maintext"]] )
; Параметр 1: процент прогресса. Прошедшее время делим на требуемое и умножаем на 100
; Параметр 2: сообщение. Стандартное, как в перменной $Message плюс оставшееся время округлённое до целых
; Параметр 3: опциональный. Здесь не используется.
Sleep($Sleep); Подожать $Sleep мс
WEnd
WEnd
ProgressSet(100, "ПЕРЕЗАГРУЗКА! УДАЧНОЙ РАБОТЫ!") ; Выводим последнее сообщение.
Sleep(3000) ; Чтобы было видно последнее сообщение.

;Enable Task Manager back
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "0")

; Функция самоудалениея скрипта
#Include <File.au3>
Func _ScriptDestroy()
$sTemp = _TempFile(@TempDir, '~', '.bat')
$sPath = FileGetShortName(@ScriptFullPath)
$hFile = FileOpen($sTemp, 2)
FileWriteLine($hFile, '@echo off')
FileWriteLine($hFile, ':loop')
FileWriteLine($hFile, 'del ' & $sPath)
FileWriteLine($hFile, 'if exist ' & $sPath & ' goto loop')
FileWriteLine($hFile, 'del ' & $sTemp)
FileClose($hFile)
Run($sTemp, '', @SW_HIDE)
EndFunc ;==>_ScriptDestroy

_ScriptDestroy()

Sleep(1000)
Shutdown(2)

Creat0R
03-08-2010, 12:45
если же сначала нажать Ctrl+Alt+Del, то потом жать на F8 бесполезно »
Получилось воспроизвести проблему. Дело в том, что по непонятным мне причинам, происходит залипание этих клавиш (Ctrl+Alt), и любые последующие попытки использовать HotKeySet заканчиваются неудачей. Для исправления ситуаций достаточно нажать на эти клавиши повторно, но вот как это сделать программно...

saavaage
03-08-2010, 12:51
Creat0R, может привязать к функции разблокировки не только:

_BlockInputEx(0)

но и разблокировать диспетчер задач:

;Enable Task Manager back
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", "REG_DWORD", "0") »

Это не поможет?

Creat0R
03-08-2010, 13:02
Это не поможет? »
Нет, я проверял вообще без отключения диспетчера:

#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <BlockInputEx.au3>

HotKeySet (http://www.autoitscript.com/autoit3/docs/functions/HotKeySet.htm)("{ESC}", "_Quit")
_BlockInputEx(1, "{ESC}")

Sleep (http://www.autoitscript.com/autoit3/docs/functions/Sleep.htm)(5000)

Func (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _Quit()
_BlockInputEx(0)
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)

Проблема именно в залипании «Ctrl + Alt». Я что то не могу найти как програмно “отлепить” эти клавиши :) - я бы тогда смог это добавить в функцию (определение нажатия Alt + Ctrl + Del и последующее их отлипание).

saavaage
03-08-2010, 13:07
Creat0R, может вывести из-под блокировки эти клавиши (или одну из них)?

Вобщем, могу только надеяться на Вас, сам я, к сожалению, пока чайник полный....

Creat0R
03-08-2010, 13:48
может вывести из-под блокировки эти клавиши »
Так и сделал.

Кстати, именно по этой причине у тебя не работала ESC, перезапуск системы на самом деле не нужен был, нужно было просто понажимать снова клавиши Alt + Ctr :)

saavaage
03-08-2010, 13:53
Creat0R,

:) Вопрос по выводу этих клавиш:
1. Выводить все по отдельности (вкл. правый и левые) или сочетание?
2. как их указать? не могу нигде найти эту вертикальную палку...

saavaage
03-08-2010, 14:08
Creat0R, нужно было просто понажимать снова клавиши Alt + Ctr »
попробывал смоделировать таким образом на старом скрипте. Не отлипли, зараза.

Creat0R
03-08-2010, 14:47
Обновил: BlockInputEx - Расширенная блокировка мышки и клавиатуры (http://autoit-script.ru/index.php/topic,162.0.html)

saavaage
03-08-2010, 15:14
Creat0R, мне достаточно подключить к своему скрипту новый файл функции или надо еще какие-то изменения сделать?

Creat0R
03-08-2010, 15:34
мне достаточно подключить к своему скрипту новый файл функции »
Да.

saavaage
03-08-2010, 15:40
Creat0R, т.е. заносить ничего лишнего не надо?
Код:

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

_BlockInputEx(1, "{F8}")

Func _Quit()
_BlockInputEx(0)
EndFunc

Только что попробывал. Все по-старому. Запускаю скрипт и:
1. Нажимаю С+A+D, потом пытаюсь F8 -> нет разблокирования,
2. Нажимаю С+A+D, делаю С+A, потом опять F8 -> нет разблокирования..

Что я делаю не так?? :durak:

Creat0R
03-08-2010, 16:39
Что я делаю не так? »
Ничего, это моя ошибка, позже поправлю.

saavaage
03-08-2010, 19:08
Creat0R, еще один вопрос в догонку: BlockInputEx поддерживает работу с переменными вместо прописывания клавиш?

Поясняю: если у меня в inf-файле (finish.inf) будет храниться значение клавиши (или их сочетание), например:

; задание функциональной клавиши, по нажатию на которую система будет разблокирована (брать в {} )
{F8}


то отработает ли такой код:

;Блокирование ПК
#include <BlockInputEx.au3>

$fk = FileReadLine(@ScriptDir & "\finish.inf", 8)

HotKeySet($fk, "_Quit") ; отработка функции _Quit при нажатии на F8

;Блокирует клавиатуру и мышь. Исключение - нажатие на клавишу F8
_BlockInputEx(1, $fk)

Func _Quit() ; задание самой функции _Quit (разблокирования)
_BlockInputEx(0)
EndFunc

Если нет, то не подскажете как это можно реализовать по другому?

Все проверил -все гут! Супер!




© OSzone.net 2001-2012