Press to Set Hotkey - Funktion (Hotkeyset)

  • Guten 'morgen', ich nochmal :)
    uuuuund zwar (ja, ich hab gegoogelt und nein, ich habe nichts gefunden ;)): Gibt es vielleicht eine UDF, oder hat jemand schonmal so einen Sourcecode veröffentlicht, womit man ein "Press to Set Hotkey - Button" machen kann? Ich meine damit, das ein Button existiert (welcher zum Beispiel (Standart) F6 heißt) und wenn man auf ihn draufklickt eine MsgBox kommt, wo drin steht "Drücke eine Taste" (oder sowas :D ) und wenn man dann zum Beispiel "G" drückt, der Button unbennant wird zu "G" und man als Hotkey auch "G" festgelegt hat.

    Ich glaube ich wüsste wie man das programmiert, aber das wäre ne menge Aufwand, und deswegen habe ich mir gedacht, das ich einfach mal nachfrage ob sowas schon mal vorprogrammiert wurde... :rofl:

    2 Mal editiert, zuletzt von Data.dat (11. Februar 2013 um 14:50)

  • Ich setz mich mal ran, so eine UDF zu schreiben ;)

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Okay, also dann brauch ich das wohl nicht mehr zu tun ;)

    Edit: Hatte mich auf seine Google-Künste verlassen :P

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Bischen Suchen hilft immer

    Edit: Hatte mich auf seine Google-Künste verlassen :P

    Jaaa, bin nicht so der Google-meister, muss ich zugeben. :rolleyes:
    Vielen lieben dank trotzdem.

    €: So, hab mir jetzt mal alles von Bugfix angekuckt, alles nicht so das gelbe vom Ei... (oder ich bin dafür einfach zu dumm...  :S )
    Ich versuch mal so ein script zu schreiben, mache es aber wahrscheinlich viel zu kompliziert, wenn ich nicht weiter komme wende ich mich an Joriktos  ;)

    Einmal editiert, zuletzt von Data.dat (11. Februar 2013 um 14:50)

  • Sowas?

    Spoiler anzeigen


    Skript:

    [autoit]


    #include "IsPressedCallBack.au3"

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

    $hGUI = GUICreate("IsPressed-Control", 250, 250)
    $idButton = GUICtrlCreateButton("Press a key!", 50, 50, 150, 150)
    GUISetState()

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

    _IsPressed_SetCheckInterval(10)

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

    For $i = 0x00 To 0xDD
    _IsPressed_CallBackRegister(Hex($i, 2), "Print", 1)
    Next

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

    While True
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case -3
    Exit
    EndSwitch
    WEnd

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

    Func Print($iKey)
    GUICtrlSetData($idButton, "0x" & $iKey)
    EndFunc

    [/autoit]


    IsPressedCallBack.au3

    [autoit]


    Global $gaCallBacks[1][3]
    Global $ghUser32 = DllOpen("user32.dll")

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

    AdlibRegister("__IsPressed_CallBackHandler", 100)
    OnAutoItExitRegister("__IsPressed_Shutdown")

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _IsPressed_CallBackRegister
    ; Description ...:
    ; Syntax ........: _IsPressed_CallBackRegister($sHexKey, $sCallBack, $iMethod)
    ; Parameters ....: $sHexKey - A string value.
    ; $sCallBack - A string value.
    ; $iMethod - 0 = Normal _IsPressed; 1 = Just call on down; 2 = Just call on up
    ; Return values .: None
    ; Author ........: chesstiger (AutoIt.de)
    ; Modified ......:
    ; Remarks .......:
    ; Related .......:
    ; Link ..........:
    ; Example .......: No
    ; ===============================================================================================================================
    Func _IsPressed_CallBackRegister($sHexKey, $sCallBack, $iMethod = 0)
    $gaCallBacks[UBound($gaCallBacks) - 1][0] = $sHexKey
    $gaCallBacks[UBound($gaCallBacks) - 1][1] = $sCallBack
    $gaCallBacks[UBound($gaCallBacks) - 1][2] = $iMethod
    ReDim $gaCallBacks[UBound($gaCallBacks) + 1][3]
    EndFunc ;==>_IsPressed_CallBackRegister

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

    Func _IsPressed_SetCheckInterval($iMS)
    AdlibUnRegister("__IsPressed_CallBackHandler")
    AdlibRegister("__IsPressed_CallBackHandler", $iMS)
    EndFunc ;==>_IsPressed_SetCheckInterval

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

    Func __IsPressed_CallBackHandler()
    For $i = 0 To UBound($gaCallBacks) - 2 ;Last element is always empty
    If __IsPressed($gaCallBacks[$i][0], $ghUser32) Then
    Switch $gaCallBacks[$i][2]
    Case 0 ;Normal _IsPressed
    Call($gaCallBacks[$i][1], $gaCallBacks[$i][0])
    Case 1 ;DOWN
    Call($gaCallBacks[$i][1], $gaCallBacks[$i][0])
    Do
    Sleep(10)
    Until Not __IsPressed($gaCallBacks[$i][0], $ghUser32)
    Case 2 ;UP
    Do
    Sleep(10)
    Until Not __IsPressed($gaCallBacks[$i][0], $ghUser32)
    Call($gaCallBacks[$i][1], $gaCallBacks[$i][0])
    EndSwitch
    EndIf
    Next
    EndFunc ;==>__IsPressed_CallBackHandler

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

    Func __IsPressed_Shutdown()
    DllClose($ghUser32)
    EndFunc ;==>__IsPressed_Shutdown

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

    Func __IsPressed($sHexKey, $vDLL = 'user32.dll')
    ; From Misc.au3 by ezzetabi and Jon
    Local $a_R = DllCall($vDLL, "short", "GetAsyncKeyState", "int", '0x' & $sHexKey)
    If @error Then Return SetError(@error, @extended, False)
    Return BitAND($a_R[0], 0x8000) <> 0
    EndFunc ;==>__IsPressed

    [/autoit]


    chess

  • Hab den Code noch ein bischen umgeschrieben, aber jetzt ist es (fast) genau das was ich will :thumbup: danke dafür.
    Gibt es vielleicht noch eine Möglichkeit diesen ätzenden "bing" ton zu verbannen? :wacko:

  • Dann muss ich wohl mit dem "bing" leben :(
    Eine frage noch, mein code sieht jetzt so aus:

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

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <IsPressedCallBack.au3>
    $Form1 = GUICreate("Form1", 623, 441, 192, 132)
    $Hotkey = GUICtrlCreateButton("Hotkey", 8, 8, 281, 25)
    $Input1 = GUICtrlCreateInput("Input", 8, 40, 281, 24)
    GUISetState(@SW_SHOW)
    $var = 0
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Hotkey

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

    _IsPressed_SetCheckInterval(10)

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

    For $i = 0x00 To 0xDD
    _IsPressed_CallBackRegister(Hex($i, 2), "Print", 1)
    Next
    Msgbox(0,"Test","Drück eine Taste")
    $var = 0
    EndSwitch
    WEnd

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

    Func Print($iKey)
    If $var = 0 then
    GUICtrlSetData($Hotkey, Chr("0x" & $iKey))
    $var = 1
    Endif
    EndFunc

    [/autoit]


    Wie man sehen kann, habe ich versucht, dass wenn man auf den Button drückt, eine MsgBox aufploppt, welche sagt das man eine Taste drücken darf (um den Hotkey fest zu legen). Das funktioniert aber noch nicht richtig, da wenn ich das Script starte und auf den Button klicke, erst die MsgBox aufploppt und wenn ich dann auf OK drücke, kann ich dann erst eine Taste drücken.
    Also; wie kann ich den code so abändern, dass wenn man auf den Button drückt die MsgBox kommt, und wenn man eine Taste drückt, sich die MsgBox schließt und sich der Hotkey festlegt?
    hoffe, habs verständlich erklärt  :huh:

  • Ich denke, du meinst sowas?

    Spoiler anzeigen
    [autoit]


    #include "IsPressedCallBack.au3"
    #include <EditConstants.au3>

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

    $hGUI = GUICreate("IsPressed-Control", 250, 250)
    $idLabel = GUICtrlCreateLabel("Press a key!", 50, 50, 150, 20, $ES_CENTER)
    $idButton = GUICtrlCreateButton("Register Key", 50, 100, 150, 30)

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

    GUISetState()

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

    $bGetKey = False
    $sHKey = 0

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

    For $i = 0x30 To 0x5A
    _IsPressed_CallBackRegister(Hex($i, 2), "Print", 1)
    Next

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

    _IsPressed_SetCheckInterval(10)

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

    While True
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case -3
    Exit
    Case $idButton
    If Not $bGetKey Then
    $bGetKey = True
    GUICtrlSetState($idLabel, "Press a key!")
    GUICtrlSetData($idButton, "...")
    Else
    $bGetKey = False
    GUICtrlSetData($idButton, "Register Key")
    GUICtrlSetData($idLabel, Chr("0x" & $sHKey))
    EndIf

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

    EndSwitch
    WEnd

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

    Func Print($sKey)
    If $bGetKey Then
    GUICtrlSetData($idButton, Chr("0x" & $sHKey))
    $sHKey = $sKey
    EndIf
    EndFunc ;==>Print

    [/autoit]

    Mit einer normalen MsgBox funktioniert es imho nicht - Da musst du dir selber eine GUI basteln...

    chess