"Drücken sie eine beliebige Taste"

  • Hallo Alle,
    ich komm wieder mal mit einer dummen Frage.
    Ich hab in meinem Programm einen "About"-Menüpunkt, der in einem Splash geöffnet wird.
    Nun möchte ich sowas wie "Drücken sie eine beliebige Taste um Fortzufahren".
    Dass man eine beliebige Taste drücken kann, und dann weiterkommt. Muss doch anders gehen, als alle Tasten in einer While-Schleife mit If _ispressed("15") oder so
    abzufragen, muss doch eleganter gehen.

    Hoffe mir kann einer Helfen!
    Viele Grüße,
    stayaway

    Einmal editiert, zuletzt von stayawayknight (24. Juni 2010 um 20:36)

  • Ja geht mit Hooks aber mein beispiel schmiert ab

    Spoiler anzeigen
    [autoit]


    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hHook, $hStub_KeyProc, $buffer = "", $Clicked = 0
    $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    $hmod = _WinAPI_GetModuleHandle(0)
    $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(10)
    If $Clicked Then MsgBox(0, 0, "Sie haben eine Taste gedrückt")
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _KeyProc($nCode, $wParam, $lParam)
    $Clicked = 1

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_KeyProc)
    EndFunc ;==>_KeyProc

    [/autoit]

    sonst wür ich eigentlich das hier empfehlen (Link)

  • Spoiler anzeigen
    [autoit]


    Global Const $WM_KEYDOWN = 0x0101

    [/autoit] [autoit][/autoit] [autoit]

    $gui= GUICreate("",500,500)
    GUIRegisterMsg($WM_KEYDOWN, "_KeyDown")
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _KeyDown($gui,$msg,$wParam,$lParam)
    GuiDelete($gui)
    Exit
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    i2c: Nanu, seit wann geht das denn?

    Das dürfte (lt. Hilfe) eigentlich nicht funktionieren:

    Zitat

    Some controls consume internally specific Windows Message ID, so registrating them will have no effect, e.g; WM_CHAR, WM_KEYDOWN, WM_KEYUP are consumed by an edit control.

    Aber Dein Beispiel funktioniert. :)

  • Spoiler anzeigen
    [autoit]

    Global $iOldHex

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Sleep(50)
    Until _CheckKey()
    MsgBox(0, "", "Key pressed.")

    [/autoit] [autoit][/autoit] [autoit]

    Func _CheckKey()
    For $i = 1 To 165
    $iValue = StringTrimLeft(Hex($i), 6)
    $iHex = "0x" & $iValue
    $aResult = DllCall("user32.dll", "short", "GetAsyncKeyState", "int", $iHex)
    If @error Then Return SetError(@error, @extended, 0)
    If BitAND($aResult[0], 32768) <> 0 And $iHex <> $iOldHex Then
    $iOldHex = $iHex
    Return True
    EndIf
    Next
    EndFunc ;==>_CheckKey

    [/autoit]

    Meine Wenigkeit bietet diese Lösung :D

  • i2c: Nanu, seit wann geht das denn?

    Das dürfte (lt. Hilfe) eigentlich nicht funktionieren:

    Aber Dein Beispiel funktioniert. :)


    Auf GUI's mit z.B. Buttons oder Inputfeldern funktioniert es auch nicht. Aber auf einer About Box hat man ja i.d.R. nur ein paar Labels und vlt. ein Bildchen.

  • Hey, danke euch allen für die schnellen Lösungen!

    Meine Func sieht momentan so aus:

    [autoit]

    Func about()
    SplashTextOn("Über ...", "Hallo das ist das Aboutsplash!")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    EndFunc ;==>about

    [/autoit]

    Leider bekomm ich da eure Lösungen irgendwie nicht rein....
    Sry kann mir jemand da nochmals helfen?

    Die Lösung mit der For-Schleife funktioniert nicht, ich denk mal weil es unmöglich ist die richtige Taste zum richtigen Zeitpunkt zu treffen!

  • Spoiler anzeigen
    [autoit]


    Global $iOldHex

    [/autoit] [autoit][/autoit] [autoit]

    Func About()
    SplashTextOn("Über ...", "Hallo das ist das Aboutsplash!")
    Do
    Sleep(50)
    Until _CheckKey()
    SplashOff()
    EndFunc ;==>About

    [/autoit] [autoit][/autoit] [autoit]

    Func _CheckKey()
    For $i = 1 To 165
    $iValue = StringTrimLeft(Hex($i), 6)
    $iHex = "0x" & $iValue
    $aResult = DllCall("user32.dll", "short", "GetAsyncKeyState", "int", $iHex)
    If @error Then Return SetError(@error, @extended, 0)
    If BitAND($aResult[0], 32768) <> 0 And $iHex <> $iOldHex Then
    $iOldHex = $iHex
    Return True
    EndIf
    Next
    EndFunc ;==>_CheckKey

    [/autoit]
  • Wenn man bei mir den Namen der Taste haben will, einfach diese Funktion hinzufügen:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _GetKeyName($iKey)
    Local $aKey[116][2] = [ _
    [0x01, "Linke Maustaste"],[0x02, "Rechte Maustaste"],[0x04, "Mittlere Maustaste"],[0x05, "X1 Maus-Taste"],[0x06, "X2 Maus-Taste"], _
    [0x08, "Löschtaste rückwärts"],[0x09, "Tabulator-Taste"],[0x0C, "Entf-Taste"],[0x0D, "Enter/Return-Taste"],[0x10, "Shift/Umschalt-Taste"], _
    [0x11, "Ctrl/Strg-Taste"],[0x12, "Alt-Taste"],[0x13, "Pause-Taste"],[0x14, "Feststelltaste"],[0x1B, "Esc-Taste"],[0x20, "Leertaste"],[0x21, "Bild-auf Taste"], _
    [0x22, "Bild-ab Taste"],[0x23, "Ende-Taste"],[0x24, "Pos 1-Taste"],[0x25, "Pfeiltaste nach links"],[0x26, "Pfeiltaste nach oben"], _
    [0x27, "Pfeiltaste nach rechts"],[0x28, "Pfeiltaste nach unten"],[0x29, "Auswahltaste"],[0x2A, "Druck"],[0x2B, "Ausführentaste"], _
    [0x2C, "Drucktaste"],[0x2D, "Einfg-Taste"],[0x2E, "Entf-Taste"],[0x30, "0"],[0x31, "1"],[0x32, "2"],[0x33, "3"],[0x34, "4"],[0x35, "5"], _
    [0x36, "6"],[0x37, "7"],[0x38, "8"],[0x39, "9"],[0x41, "A"],[0x42, "B"],[0x43, "C"],[0x44, "D"],[0x45, "E"],[0x46, "F"],[0x47, "G"],[0x48, "H"], _
    [0x49, "I"],[0x4A, "J"],[0x4B, "K"],[0x4C, "L"],[0x4D, "M"],[0x4E, "N"],[0x4F, "O"],[0x50, "P"],[0x51, "Q"],[0x52, "R"],[0x53, "S"],[0x54, "T"],[0x55, "U"], _
    [0x56, "V"],[0x57, "W"],[0x58, "X"],[0x59, "Y"],[0x5A, "Z"],[0x5B, "Linke Windows-Taste"],[0x5C, "Rechte Windows-Taste"],[0x60, "rechter Nummerblock Taste 0"], _
    [0x61, "rechter Nummerblock Taste 1"],[0x62, "rechter Nummerblock Taste 2"],[0x63, "rechter Nummerblock Taste 3"],[0x64, "rechter Nummerblock Taste 4"], _
    [0x65, "rechter Nummerblock Taste 5"],[0x66, "rechter Nummerblock Taste 6"],[0x67, "rechter Nummerblock Taste 7"],[0x68, "rechter Nummerblock Taste 8"], _
    [0x69, "rechter Nummerblock Taste 9"],[0x6A, "rechter Nummerblock Malzeichen"],[0x6B, "rechter Nummerblock Pluszeichen"],[0x6C, "Eingabetaste"], _
    [0x6D, "rechter Nummerblock Minuszeichen"],[0x6E, "rechter Nummerblock Kommazeichen"],[0x6F, "rechter Nummerblock Geteiltzeichen"],[0x70, "F1"], _
    [0x71, "F2"],[0x72, "F3"],[0x73, "F4"],[0x74, "F5"],[0x75, "F6"],[0x76, "F7"],[0x77, "F8"],[0x78, "F9"],[0x79, "F10"],[0x7A, "F11"],[0x7B, "F12"], _
    [0x7C, "F13"],[0x7D, "F14"],[0x7E, "F15"],[0x7F, "F16"],[0x80, "F17"],[0x81, "F18"],[0x82, "F19"],[0x83, "F20"],[0x84, "F21"],[0x85, "F22"], _
    [0x86, "F23"],[0x87, "F24"],[0x90, "Num-Taste"],[0x91, "Rollen-Taste"],[0xA0, "linke Shift/Umschalt/Feststelltaste"], _
    [0xA1, "rechte Shift/Umschalt/Feststelltaste"],[0xA2, "linke Ctrl/Strg-Taste"],[0xA3, "rechte Ctrl/Strg-Taste"], _
    [0xA4, "(linke) Alt-Taste"],[0xA5, "(rechte) Alt Gr-Taste"]]
    Local $Index = _ArraySearch($aKey, $iKey)
    If Not @error Then
    Return $aKey[$Index][1]
    Else
    Return "Error, can't evaluate key."
    EndIf
    EndFunc ;==>_GetKeyName

    [/autoit]

    und bei _CheckKey den Return True zu "Return _CheckKey($iHex)" ändern, dann bekommt man den Namen der Taste :D

  • so, hab mal schnell was gebastelt...

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <StructureConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $hHook, $_vWait = 0
    ;mit grafischer Anzeige...
    _WaitPushButton("drücken Sie eine beliebige Taste...")
    MsgBox(262144, '', 'es wurde eine Taste gedrückt')

    [/autoit] [autoit][/autoit] [autoit]

    ;ohne grafischer Anzeige... bei Aufruf in einer eigenen GUI...
    _WaitPushButton()
    MsgBox(262144, '', 'es wurde eine Taste gedrückt')

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _WaitPushButton($s_WPB="")
    Local $hStub_KeyProc, $buffer = "", $hmod = _WinAPI_GetModuleHandle(0), $gp_WPB = BitOR($WS_EX_TRANSPARENT,$WS_EX_TOPMOST)
    If $s_WPB <> "" Then $gp_WPB = BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST)
    $hStub_KeyProc = DllCallbackRegister("_WPB_KP", "long", "int;wparam;lparam")
    $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
    $g_WPB = GUICreate("",300,40,-1,-1,$WS_POPUP,$gp_WPB)
    $l1_WPB = GUICtrlCreateLabel($s_WPB,10,10,280)
    GUICtrlSetFont(-1,12,600)
    GUISetState()
    Do
    Sleep(10)
    WinActivate($g_WPB)
    Until $_vWait = 1
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_KeyProc)
    GUIDelete($g_WPB)
    $_vWait = 0
    EndFunc ;==>_WaitPushButton

    [/autoit] [autoit][/autoit] [autoit]

    Func _WPB_KP($nCode, $wParam, $lParam)
    If $wParam = $WM_KEYDOWN And $nCode >= 0 Then
    $_vWait = 1
    Else
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
    EndFunc ;==>_KeyProc

    [/autoit]

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

  • Und was ist an GetAsyncKeyState schlechter? :D


    Mit GetKeyboardState bekommt man alle Tasten auf einmal , GetAsyncKeySate ist das gleiche wie _IsPressed und muss mehrmals aufgerufen werden. Wenn man einen DLLCall statt 255 macht, ist das deutlich weniger Ressourcenbelastend.