Что нового

vkCode как отловить сочитание клавиш?

S

sh01u

Гость
Уважаемые форумчане есть код

Код:
#include <WinAPI.au3>


Global $pStub_KeyProc = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr")
Global $hHookKeyboard = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($pStub_KeyProc), _WinAPI_GetModuleHandle(0), 0)

While 1
    Sleep(100)
WEnd


Func _KeyProc($nCode, $wParam, $lParam)

    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)

    Local $KBDLLHOOKSTRUCT = DllStructCreate("dword vkCode;dword scanCode;dword flags;dword time;ptr dwExtraInfo", $lParam)

    Local $vkCode = DllStructGetData($KBDLLHOOKSTRUCT, "vkCode")

	Return $vkCode

EndFunc


Как отловить, нажатие не одной клавиши, допустим 2-х ctrl + c, 3-х ctrl + alt + y?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Может проще реализовать через функцию "_IsPressed()" , например для сочетания трёх клавиш - Левый CTRL+ALT+Y :
Код:
#include <Misc.au3>

Local $hDLL = DllOpen("user32.dll")

While 1
    If _IsPressed("A2", $hDLL) And _IsPressed("12", $hDLL) And _IsPressed("59", $hDLL) Then
        ConsoleWrite('Было нажато сочетание клавиш ctrl+alt+Y' & @CRLF)
        ; Цикл ожидания, пока клавиша не будет отпущена.
        While _IsPressed("A2", $hDLL) And _IsPressed("12", $hDLL) And _IsPressed("59", $hDLL)
            Sleep(250)
        WEnd
        MsgBox(0,'Внимание ','Было нажато и отпущено сочетание клавиш ctrl+alt+Y')
    ElseIf _IsPressed("1B", $hDLL) Then
        MsgBox(4096, "_IsPressed", "Нажата клавиша Esc, поэтому скрипт завершает работу.")
        ExitLoop
    EndIf
    Sleep(250)
WEnd

DllClose($hDLL)
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
#include <WinAPI.au3>
#include <WinAPIvkeysConstants.au3>
#include <WindowsConstants.au3>

Global $fCtrl, $fShift, $fAlt
Global $hKeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
Global $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hKeyProc), _WinAPI_GetModuleHandle(0))
OnAutoItExitRegister("_OnExit")

While 1
	Sleep(10)
WEnd

Func _KeyProc($iCode, $wParam, $lParam)
	If $iCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $iCode, $wParam, $lParam)
	Local $tKBDLLHOOKSTRUCT = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
	Local $iVK = "0x" & Hex(DllStructGetData($tKBDLLHOOKSTRUCT, "vkCode"), 2)
	Switch $wParam
		Case $WM_KEYDOWN, $WM_SYSKEYDOWN
			Switch $iVK
				Case $VK_CONTROL, $VK_LCONTROL, $VK_RCONTROL
					$fCtrl = True
				Case $VK_MENU, $VK_LMENU, $VK_RMENU
					$fAlt = True
				Case $VK_SHIFT, $VK_LSHIFT, $VK_RSHIFT
					$fShift = True
				Case $VK_C
					If $fCtrl Then ToolTip("CTRL + C")
				Case $VK_Y
					If $fCtrl And $fAlt Then ToolTip("CTRL + ALT + Y")
			EndSwitch
		Case $WM_KEYUP, $WM_SYSKEYUP
			Switch $iVK
				Case $VK_CONTROL, $VK_LCONTROL, $VK_RCONTROL
					$fCtrl = False
				Case $VK_MENU, $VK_LMENU, $VK_RMENU
					$fAlt = False
				Case $VK_SHIFT, $VK_LSHIFT, $VK_RSHIFT
					$fShift = False
			EndSwitch
			ToolTip(Null)
	EndSwitch
	Return _WinAPI_CallNextHookEx($hHook, $iCode, $wParam, $lParam)
EndFunc   ;==>_KeyProc

Func _OnExit()
	DllCallbackFree($hKeyProc)
	_WinAPI_UnhookWindowsHookEx($hHook)
EndFunc   ;==>_OnExit
 
Верх