Rechtsklick auf Controls auswerten

  • Hab heute eine einfache Möglichkeit entdeckt, wie man einfach Rechtsklicks auf verschiedene Controls auswerten kann.

    Spoiler anzeigen
    [autoit]

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

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

    Opt('GUIOnEventMode', 1)

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

    Global $LV_FirstClick = 0

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

    Global $hGUI = GUICreate("Test Rechtsklick", 210, 300)
    GUISetOnEvent(-3, '_Exit')
    GUIRegisterMsg($WM_CONTEXTMENU, "WM_RECHTSKLICK")

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

    Global $Btn1 = GUICtrlCreateButton('Testbutton 1', 20,40)
    Global $Btn2 = GUICtrlCreateButton('Testbutton 2', 120,40)
    Global $Lbl1 = GUICtrlCreateLabel('Testlabel 1', 20,140)
    Global $Lbl2 = GUICtrlCreateLabel('Testlabel 2', 120,140)

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

    Global $LV = GUICtrlCreateList('Zeile1', 20, 180, 170, 80)
    GUICtrlSetData(-1, "Zeile2")
    GUICtrlSetData(-1, "Zeile3")

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

    GUISetState()

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

    While 1
    Sleep(100000)
    WEnd

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

    Func _Exit()
    Exit
    EndFunc

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

    Func WM_RECHTSKLICK($hWnd, $iMsg, $iwParam, $ilParam)
    Local $IDCtrl = _WinAPI_GetDlgCtrlID($iwParam)
    Local $x = BitAND($ilParam, 0x0000FFFF), $y = BitShift($ilParam, 16)

    Switch $IDCtrl
    Case $Btn1, $Btn2, $Lbl1, $Lbl2
    MsgBox(64, GUICtrlRead($IDCtrl), "Klickposition: " & $x & " / " & $y)
    Case $LV
    If Not $LV_FirstClick Then
    MouseClick('left', $x, $y, 1, 0)
    $LV_FirstClick = 1
    MouseClick('right', $x, $y, 1, 0)
    Else
    $LV_FirstClick = 0
    MsgBox(64, GUICtrlRead($IDCtrl), "Klickposition: " & $x & " / " & $y)
    EndIf
    EndSwitch
    EndFunc ;==>WM_CONTEXTMENU

    [/autoit]
    • Offizieller Beitrag

    Hab auch eine gaaanz einfache Möglichkeit. ;)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)

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

    $Form1 = GUICreate("Form1", 377, 275, 192, 114)
    GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
    GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "Right_click")
    $Button1 = GUICtrlCreateButton("Button1", 32, 24, 81, 25, $WS_GROUP)
    $Button2 = GUICtrlCreateButton("Button2", 32, 64, 81, 25, $WS_GROUP)
    $Input1 = GUICtrlCreateInput("Input1", 136, 24, 137, 21)
    $Input2 = GUICtrlCreateInput("Input2", 136, 64, 137, 21)
    $Label1 = GUICtrlCreateLabel("Label1", 296, 24, 36, 17)
    $Label2 = GUICtrlCreateLabel("Label2", 296, 64, 36, 17)
    $ListView1 = GUICtrlCreateListView("Sp. 1|Sp. 2|Sp. 3", 32, 104, 305, 113)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 50)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 50)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 50)
    GUISetState(@SW_SHOW)

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

    While 1
    Sleep(100)
    WEnd

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

    #cs Im GUIGetMsg-Mode:
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_CLOSE
    Form1Close()
    Case $GUI_EVENT_SECONDARYDOWN
    Right_click()
    EndSwitch
    WEnd
    #ce

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

    Func Form1Close()
    Exit
    EndFunc

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

    Func Right_click()
    $cursor = GUIGetCursorInfo($Form1)
    ConsoleWrite('Rechtsklick auf Control' & @LF & 'ID: ' & $cursor[4] & @LF & _
    'Text: ' & ControlGetText($Form1, '', $cursor[4]) & @CRLF)
    EndFunc

    [/autoit]
  • PrideRage: Natürlich ist das nützlich. Ich habe das schon öfters gebraucht. Habe dann immer die Version, die Bugfix gepostet hat hergenommen, aber die Variante mit GUIRegisterMsg($WM_CONTEXTMENU..) gefällt mir besser (obwohl es im Pronzip eh ziemlich gleich ist).

    BugFix : Danke dass du eine andere Variante gepostet hast, somit kann unter diesem Thread mehr als eine Möglichkeit gefunden werden eine Rechtsklick-Auswertung einzubauen und jeder kann dann wählen was ihm lieber ist.

    • Offizieller Beitrag

    Und noch mal zum Sinn:
    Somit kann man auch jedem Control ein Kontextmenü zuordnen (das geht nämlich standardmäßig nur bei wenigen) und das macht sehr viel Sinn.
    Bsp.: Individuelle Gestaltung einer GUI durch den User
    - Rechtsklick auf den Hintergrund: wird ihm Farbwechsel oder Hintergrundbild angeboten
    - Rechtsklick auf Button: Farbwechsel oder Image
    usw.