Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Разблокирование Клавиатуры и мыши по нажатию на {ESC} (http://forum.oszone.net/showthread.php?t=182018)

saavaage 03-08-2010 01:27 1465669

Разблокирование Клавиатуры и мыши по нажатию на {ESC}
 
Собственно, не срабатывает такой скрипт:

Код:

#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 1465674

Цитата:

Цитата saavaage
не срабатывает такой скрипт »

И не должен, в HotKeySet не указана клавиша для вызова функции :)

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

Код:

_BlockInputEx(1, "{ESC}")

saavaage 03-08-2010 01:54 1465675

Creat0R, это я пропустил, когда копировал. На компе, естессвенно, с {ESC}. Не работает. Уже и так и так пробЫвал.

Creat0R 03-08-2010 01:56 1465676

Цитата:

Цитата saavaage
На компе, естессвенно, с {ESC} »

Ну тогда у меня работает, а в чём проблема?

saavaage 03-08-2010 01:59 1465679

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 1465697

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

saavaage 03-08-2010 12:18 1465899

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 1465913

Цитата:

Цитата saavaage
если же сначала нажать Ctrl+Alt+Del, то потом жать на F8 бесполезно »

Получилось воспроизвести проблему. Дело в том, что по непонятным мне причинам, происходит залипание этих клавиш (Ctrl+Alt), и любые последующие попытки использовать HotKeySet заканчиваются неудачей. Для исправления ситуаций достаточно нажать на эти клавиши повторно, но вот как это сделать программно...

saavaage 03-08-2010 12:51 1465916

Creat0R, может привязать к функции разблокировки не только:

_BlockInputEx(0)

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

Цитата:

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

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

Creat0R 03-08-2010 13:02 1465920

Цитата:

Цитата saavaage
Это не поможет? »

Нет, я проверял вообще без отключения диспетчера:

Код:

#include <BlockInputEx.au3>

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

Sleep(5000)

Func _Quit()
    _BlockInputEx(0)
EndFunc

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

saavaage 03-08-2010 13:07 1465926

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

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

Creat0R 03-08-2010 13:48 1465948

Цитата:

Цитата saavaage
может вывести из-под блокировки эти клавиши »

Так и сделал.

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

saavaage 03-08-2010 13:53 1465951

Creat0R,

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

saavaage 03-08-2010 14:08 1465960

Creat0R,
Цитата:

Цитата Creat0R
нужно было просто понажимать снова клавиши Alt + Ctr »

попробЫвал смоделировать таким образом на старом скрипте. Не отлипли, зараза.

Creat0R 03-08-2010 14:47 1465994

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

saavaage 03-08-2010 15:14 1466019

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

Creat0R 03-08-2010 15:34 1466033

Цитата:

Цитата saavaage
мне достаточно подключить к своему скрипту новый файл функции »

Да.

saavaage 03-08-2010 15:40 1466039

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 1466073

Цитата:

Цитата saavaage
Что я делаю не так? »

Ничего, это моя ошибка, позже поправлю.

saavaage 03-08-2010 19:08 1466171

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

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

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

Creat0R 03-08-2010 19:45 1466196

Обновил, версия и ссылка таже.

Цитата:

Цитата saavaage
отработает ли такой код »

Я если честно затрудняюсь понять, для чего спрашивать подобные вопросы и заниматься теоретикой? Проверь сперва - и если не сработает, то спроси почему :)

saavaage 03-08-2010 20:00 1466208

Creat0R,
1. Все работает. Большое спасибо. Тема закрыта.



PS
Цитата:

Цитата Creat0R
Я если честно затрудняюсь понять, для чего спрашивать подобные вопросы и заниматься теоретикой? Проверь сперва - и если не сработает, то спроси почему »

Дело в том, что у меня сначало не пошло. Была ошибка в скрипте (не убрал кавычки вокруг $fk), а так как еще слаб в этом деле (а в справке про возможность подстановки переменной - ни гу-гу), то сразу и обратился к Вам. Немного погодя решил попробывать и все получилось.

Извини, что дергаю часто. Надеюсь, что скоро буду только по делу...


Время: 12:51.

Время: 12:51.
© OSzone.net 2001-