Искал информацию по эмуляции через порт пс/2 устройств, нашел в прикрепленной в разделе теме ( http://autoit-script.ru/index.php/topic,14307.0.html ) вот это:
*извините, вам запрещено оставлять внешние ссылки*
Скачал, посмотрел, запустил, запутался.
В архиве приложен скрипт "IOKeyboardExamples", текст которого вы можете увидеть под спойлером. Ничего ценного там нет, там просто вызываются функции из соседнего скрипта.
Наблюдается явление: метод _IO_KeySendCtrlAltDel() иногда работает, а иногда - нет. И я не знаю, от чего это зависит, иногда не происходит вообще ничего, иногда зажимается (и не отжимается) ctrl или alt, иногда все работает как нужно и таки выкидывает в специальный экран семерки для этой комбинации клавиш.
Ради эксперимента менял задержки в методе с 20 до 100 мс, ничего не изменилось. Кто-нибудь знает, что это такое и почему оно себя так ведет?
p.s Поскольку, ссылку в тему прикрепил некто lirikmel, хотел написать ему в личку, но увидел огромный красный баннер "не используйте личку для вопросов - создайте тему", и вот, я здесь.
*извините, вам запрещено оставлять внешние ссылки*
Скачал, посмотрел, запустил, запутался.
В архиве приложен скрипт "IOKeyboardExamples", текст которого вы можете увидеть под спойлером. Ничего ценного там нет, там просто вызываются функции из соседнего скрипта.
Код:
;~ #include "[Includes]\_IOFunctions.au3"
#include "[Includes]\_IOKeyboardFunctions.au3"
; ===============================================================================================================================
; <IOKeyboardExamples.au3>
;
; Example use of _IOFunctions in relation to the PS/2 keyboard & controller.
; NOTE: Functions are specific to PS/2 Keyboards and will not affect USB keyboards!
;
; Functions:
; _IO_KeyboardLEDFlash() ; Randomly lights/unlights the LED's on the keyboard before restoring them
; _IO_UACThwartExample() ; Attempts to thwart the UAC prompt (doesn't seem to work all the time..)
; _IO_KeySendCtrlAltDel() ; Sends the CTRL-ALT-DEL key sequence that is otherwise impossible to do
; _IO_KeyboardBlockTemporarily() ; Temporarily blocks PS/2 keyboard input (for x ms)
;
; References:
; Keyboard scancodes (and commands)
; @ http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html
; & http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html
;
; Author: Ascend4nt
; ===============================================================================================================================
; ===================================================================================================================
; MAIN CODE
; ===================================================================================================================
If Not _IO_Initialize() Then Exit _
MsgBox(48,"DLL or IO Driver failed to load","DLL or IO Driver failed to load, possibly due to an install issue."&@CRLF& _
"If this is the first time using the DLL/Driver, please run the driver install."&@CRLF&"(Either IOInstallx86 or IOInstallx64)")
;ConsoleWrite("0x64: "&Hex(_IO_InB(0x64))&@CRLF)
MsgBox(0,"LED Flashing","Watch the LED lights go nuts on the PS/2 keyboard")
_IO_KeyboardLEDFlash()
MsgBox(0,"UAC Thwart Example","If all goes well this will run a script requiring elevation and automatically 'press' Yes")
If Not _IO_UACThwartExample() Then MsgBox(0,"Failed","Failed to catch UAC window"&@CRLF&"This can be finicky in certain setups.")
MsgBox(48,"Disabling PS/2 Keyboard Temporarily!","PS/2 Keyboard will be disabled for 5 seconds when you hit OK")
_IO_KeyboardBlockTemporarily(5000)
MsgBox(0,"Ctrl-Alt-Delete send","Ctrl-Alt-Delete will now be sent.")
_IO_KeySendCtrlAltDel()
; ===================================================================================================================
; Func _IO_KeyboardLEDFlash()
;
; Mucks about with the LED's on a PS/2 keyboard before restoring them.
; Note that no status-change messages are sent to the O/S (it still retains previous settings)
; Therefore the _IO_KeyboardLEDRestore() call is important to restore the LED's to reflect the current O/S setting
;
; Author: Ascend4nt
; ===================================================================================================================
Func _IO_KeyboardLEDFlash()
; Now just randomly flash them
For $i=0 To 7
_IO_KeyboardLED($i)
Sleep(350)
Next
_IO_KeyboardLEDRestore()
EndFunc
; ===================================================================================================================
; Func _IO_UACThwartExample()
;
; Thwart Windows UAC.
; NOTE: Doesn't always seem to work, as the system setup may make it work a bit fickle..
; - I've seen it hide under other windows in some cases??
; Most of the time however, it is brought front and center.
;
; Author: Ascend4nt
; ===================================================================================================================
Func _IO_UACThwartExample()
Run(@ComSpec&' /c start IOInstallx64.au3',@ScriptDir,@SW_HIDE)
ProcessWait("consent.exe",5000)
; In some weird situations, the window isn't brought front-and-center, and I haven't yet figured out how
; to catch those situations and figure a way to bring it forward. (perhaps Alt-Tab..)
; Weird thing is, when I've seen it 'hide' under other windows, it pauses execution of the program!
If Not ProcessExists("consent.exe") Then Return False
Sleep(250)
_IO_KeySend(0x38) ; ALT-Down
Sleep(20) ; Putting in sleeps between key-sends decreases the chance that the O/S will miss certain keypresses
_IO_KeySend(0x15) ; Y
Sleep(30)
_IO_KeySend(0xB8) ; ALT-Up (0x38+0x80)
Return True
EndFunc
; ===================================================================================================================
; Func _IO_KeySendCtrlAltDel()
;
; Sends CTRL-ALT-DEL using I/O ports. This would otherwise be impossible to emulate using AutoIt.
;
; Author: Ascend4nt
; ===================================================================================================================
Func _IO_KeySendCtrlAltDel()
;~ Send("{NUMLOCK on}") ; Not needed - NumLock state doesn't matter in this case - just the basic Numpad key
_IO_KeySend(0x1D) ; CTRL-Down
Sleep(20)
_IO_KeySend(0x38) ; ALT-Down
Sleep(20)
_IO_KeySend(0x53) ; Keypad Delete or '.' (in NumLock-off mode)
Sleep(20)
_IO_KeySend(0x38+0x80) ; ALT-Up
Sleep(20)
_IO_KeySend(0x1D+0x80) ; CTRL-Up
EndFunc
; ===================================================================================================================
; Func _IO_KeyboardBlockTemporarily($iTime)
;
; Temporarily blocks keyboard input (for x ms)
;
; Author: Ascend4nt
; ===================================================================================================================
Func _IO_KeyboardBlockTemporarily($iTime)
_IO_KeyboardDisable()
Sleep($iTime)
_IO_KeyboardReEnable()
EndFunc
Наблюдается явление: метод _IO_KeySendCtrlAltDel() иногда работает, а иногда - нет. И я не знаю, от чего это зависит, иногда не происходит вообще ничего, иногда зажимается (и не отжимается) ctrl или alt, иногда все работает как нужно и таки выкидывает в специальный экран семерки для этой комбинации клавиш.
Ради эксперимента менял задержки в методе с 20 до 100 мс, ничего не изменилось. Кто-нибудь знает, что это такое и почему оно себя так ведет?
p.s Поскольку, ссылку в тему прикрепил некто lirikmel, хотел написать ему в личку, но увидел огромный красный баннер "не используйте личку для вопросов - создайте тему", и вот, я здесь.