Что нового

[Автоматизация] "Press any key" - как реализовать?

akoulev

Новичок
Сообщения
169
Репутация
2
Задача: чтобы по нажатию любой клавиши, происходило "одно", а при ненажатии вообще ничего (несколько сек.) - происходило "другое";
Код:
MsgBox
был бы вполне уместен, но он тяготеет к конкретике.
Так как бы реализовать старый добрый DOS-овский "pause"? :wacko:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Re: "Press any key" - как реализовать?

или так
Код:
#include <Misc.au3>

$start = TimerInit()
While TimerDiff($start) < 3000
    For $i = 0x1 To 0xDD
		If _IsPressed($i) Then
			MsgBox(0, '', '  You''ve pressed a key')
			Exit
		EndIf
	Next
WEnd
MsgBox(0, '', 'Nothing was pressed within 3 secs')
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: "Press any key" - как реализовать?

Код:
#Include <WinAPI.au3>
#Include <WindowsConstants.au3>

Global $pKeyProc, $hHook, $Pressed, $Timer

$pKeyProc = DllCallbackRegister('_KeyProc', 'ptr', 'int;wparam;lparam')
$hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($pKeyProc), _WinAPI_GetModuleHandle(0), 0)

GUICreate('Pause', 250, 100)
GUICtrlCreateLabel('Press any key...', 20, 40, 210, 14, 1)
GUISetState()

$Pressed = 0
$Timer = TimerInit()
Do
	; 10 sec
	If ($Pressed) Or (TimerDiff($Timer) > 10000) Then
		ExitLoop
	EndIf
Until GUIGetMsg() = -3

_WinAPI_UnhookWindowsHookEx($hHook)
DllCallbackFree($pKeyProc)

Func _KeyProc($iCode, $wParam, $lParam)
    If $iCode > -1 Then
		Switch $wParam
			Case $WM_KEYDOWN, $WM_SYSKEYDOWN
				$Pressed = 1
		EndSwitch
	EndIf
    Return _WinAPI_CallNextHookEx($hHook, $iCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc
 
Автор
A

akoulev

Новичок
Сообщения
169
Репутация
2
Re: "Press any key" - как реализовать?

Круто!
Со словом "pause" 15 лет назад было явно проще. :-X
Hint: а не добавить ли "pause" в штатные функции?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: "Press any key" - как реализовать?

_IsPressedEx.au3

Код:
#include <IsPressedEx.au3>

Global $iPause_Expired = 0

_Pause_Proc()

Func _Pause_Proc()
	Local $hU32_DllOpen = DllOpen("User32.dll")
	
	;Убеждаемся что все клавиши отжаты (такие как F5 к примеру :) ) прежде чем мы отображаем окошко ожидания паузы
	While _IsPressedEx("[:ALLKEYS:]", $hU32_DllOpen)
	WEnd
	
	GUICreate('Pause Demo', 250, 100)
	GUICtrlCreateLabel('Press any key...', 20, 40, 210, 14, 1)
	GUISetState()
	
	;Через 5 сенкунд время нажатия клавиши истекает
	AdlibRegister("_Pause_Time_Expired", 5000)
	
	While GUIGetMsg() <> -3
		$Pressed = _IsPressedEx("[:ALLKEYS:]", $hU32_DllOpen)
		
		If $iPause_Expired Or ($Pressed And Not StringRegExp($Pressed, "\A0[1-6]\z")) Then
			ExitLoop
		EndIf
	WEnd
	
	DllClose($hU32_DllOpen)
EndFunc

Func _Pause_Time_Expired()
	$iPause_Expired = 1
EndFunc
 
Верх