Button in eine fremde GUI einfügen

  • Moinsen,
    Ich habe folgendes Problem:
    Ich möchte einen Button (mit der _guictrlbutton_create() Funktion) in einer anderen GUI erstellen...
    Z.b. im Internet Explorer, und der Button soll natürlich über eine (oder mehrere) Funktionen verfügen.

    Das Erstellen des Buttons in einer fremden (<-nur dadrum gehts) Gui funktioniert wunderbar,
    nur leider das "gewohnte" belegen mit einer Funktion scheint nicht so richtig zu funktionieren ;(

    PS: Ich denke mein Vorhaben ist klar :P (falls Code benötigt wird tippe ich den noch ;) )

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

    Einmal editiert, zuletzt von XovoxKingdom (12. Juli 2009 um 12:14)

  • oder so, entweder sehr einfach....

    Spoiler anzeigen
    [autoit]

    #include <GuiButton.au3>
    #include <WindowsConstants.au3>

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

    opt("WinTitleMatchMode",2)

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

    $txt = "AutoIt v3 Window Info" ;Fenstertitel
    Run("C:\Programme\AutoIt3\Au3Info.exe") ;infotool starten
    WinWaitActive($txt) ;warten bis Fenster aktiv
    Local $handle = WinGetHandle($txt) ;handle vom Fenster holen
    Local $child = GUICreate("child", 80, 30, 320, 30, $WS_CHILD, -1, $handle) ; childwindow basteln in Buttongröße
    Local $btn = GUICtrlCreateButton("Hallo", 0, 0, 80, 30, -1, -1) ;Button ins childwindow
    Local $button1 = ControlGetHandle($child, "", $btn) ;für evtl. WM_Manipulationen
    GUISetState()
    While 1
    If Not WinExists($txt) Then Exit
    $msg = GUIGetMsg()
    If $msg = $btn Then MsgBox(262144, 0, "Hallo-Button gedrückt!")
    WEnd

    [/autoit]

    oder mit vollem Zugriff über die WindowsMessages mittels WM_Command

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiButton.au3>
    #include <WindowsConstants.au3>

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    ;GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND") ;infos

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

    $txt = "AutoIt v3 Window Info" ;Fenstertitel
    Run("C:\Programme\AutoIt3\Au3Info.exe") ;infotool starten
    WinWaitActive($txt) ;warten bis Fenster aktiv
    Local $handle = WinGetHandle($txt) ;handle vom Fenster holen
    Local $child = GUICreate("child", 80, 100, 320, 30, $WS_CHILD, -1, $handle) ; childwindow basteln in Buttongröße
    Local $btn = GUICtrlCreateButton("Hallo", 0, 0, 80, 30, -1, -1) ;Button ins childwindow
    Local $button1 = ControlGetHandle($child, "", $btn) ;für evtl. WM_Command-Manipulationen
    $btn2=_GUICtrlButton_Create($child,"Button",0,50,80,30); noch einen....
    GUISetState()
    While 1
    If Not WinExists($txt) Then Exit
    $msg = GUIGetMsg()
    If $msg = $btn Then MsgBox(262144, 0, "Hallo gedrückt!") ;die messages kommen nur an, wenn zeile 63 auskommentiert ist!
    If $msg = $btn2 Then MsgBox(262144, 0, "Button gedrückt!") ;kommt nie an, weil btn2 ein handle und keine ctrlid ist!
    WEnd

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

    ; React on a button click
    Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0x0000FFFF)
    Local $hCtrl = $lParam
    Local $sText = ""
    consolewrite("Button geklickt"&@crlf)
    Switch $hCtrl
    Case $btn2,$button1 ;wenn einer der beiden buttons geklickt wurde
    Switch $nNotifyCode
    Case $BN_CLICKED
    $sText = "$BN_CLICKED" & @CRLF
    Case $BN_PAINT
    $sText = "$BN_PAINT" & @CRLF
    Case $BN_PUSHED, $BN_HILITE
    $sText = "$BN_PUSHED, $BN_HILITE" & @CRLF
    Case $BN_UNPUSHED, $BN_UNHILITE
    $sText = "$BN_UNPUSHED" & @CRLF
    Case $BN_DISABLE
    $sText = "$BN_DISABLE" & @CRLF
    Case $BN_DBLCLK, $BN_DOUBLECLICKED
    $sText = "$BN_DBLCLK, $BN_DOUBLECLICKED" & @CRLF
    Case $BN_SETFOCUS
    $sText = "$BN_SETFOCUS" & @CRLF
    Case $BN_KILLFOCUS
    $sText = "$BN_KILLFOCUS" & @CRLF
    EndSwitch
    consolewrite($sText & _
    "-----------------------------" & @CRLF & _
    "WM_COMMAND - Infos:" & @CRLF & _
    "-----------------------------" & @CRLF & _
    "Code" & @TAB & ":" & $nNotifyCode & @CRLF & _
    "CtrlID" & @TAB & ":" & $nID & @CRLF & _
    "CtrlHWnd:" & $hCtrl & @CRLF & _
    _GUICtrlButton_GetText($hCtrl) & @CRLF)
    ;Return 0 ; Only workout clicking on the button
    EndSwitch
    ; Proceed the default Autoit3 internal message commands.
    ; You also can complete let the line out.
    ; !!! But only 'Return' (without any value) will not proceed
    ; the default Autoit3-message in the future !!!
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    $nNotifyCode = BitShift($wParam, 16)
    $nID = BitAND($wParam, 0x0000FFFF)
    $hCtrl = $lParam

    If $nID <> 2 And $nNotifyCode = 0 Then ; Check for IDCANCEL - 2
    ; Ownerdrawn buttons don't send something by pressing ENTER
    ; So IDOK - 1 comes up, now check for the control that has the current focus
    If $nID = 1 Then
    $hFocus = DllCall("user32.dll", "hwnd", "GetFocus")
    $nCtrlID = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", $hFocus[0])
    PostButtonClick($hWnd, $nCtrlID[0])
    Else
    MsgBox(0, "MY_WM_COMMAND", "GUIHWnd" & @TAB & ":" & $hWnd & @LF & _
    "MsgID" & @TAB & ":" & $Msg & @LF & _
    "wParam" & @TAB & ":" & $wParam & @LF & _
    "lParam" & @TAB & ":" & $lParam & @LF & @LF & _
    "WM_COMMAND - Infos:" & @LF & _
    "-----------------------------" & @LF & _
    "Code" & @TAB & ":" & $nNotifyCode & @LF & _
    "CtrlID" & @TAB & ":" & $nID & @LF & _
    "CtrlHWnd" & @TAB & ":" & $hCtrl)
    EndIf
    Return 0 ; Only workout clicking on the button
    EndIf
    ; Proceed the default Autoit3 internal message commands.
    ; You also can complete let the line out.
    ; !!! But only 'Return' (without any value) will not proceed
    ; the default Autoit3-message in the future !!!
    Return $GUI_RUNDEFMSG
    EndFunc ;==>MY_WM_COMMAND

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

    ; RePost a WM_COMMAND message to a ctrl in a gui window
    Func PostButtonClick($hWnd, $nCtrlID)
    DllCall("user32.dll", "int", "PostMessage", _
    "hwnd", $hWnd, _
    "int", $WM_COMMAND, _
    "int", BitAND($nCtrlID, 0x0000FFFF), _
    "hwnd", GUICtrlGetHandle($nCtrlID))
    EndFunc ;==>PostButtonClick

    [/autoit]

    In den Kommentaren findet man viele Hinweise!


    ciao
    Andy

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (2. April 2013 um 16:59)

  • Hi, ich habe versucht, den WM_Command Code an meine Bedürfnisse anzupassen.
    Allerdings tut sich nichts.


    Kann mir jemand sagen woran es liegt? Evtl. daran, dass es um eine fremde Toolbar geht? Ist halt ne Toolbar aus einem nicht-AutoIt-Prog. Buttons hinzufügen bzw. löschen geht ohne Probleme. Aber ich will auf einen Klick auf meine Buttons reagieren können.
    Das muss doch irgendwie gehen.

    PS: Im Moment wird mir in der Konsole immer "Button geklickt" ausgegeben, auch wenn der Button noch nicht mal in der Toolbar existiert.

  • Hallo,

    Zitat

    ch habe versucht, den WM_Command Code an meine Bedürfnisse anzupassen.
    Allerdings tut sich nichts.

    Du hast ja auch in der WM_Command nichts gemacht, um das Ereignis zu bearbeiten. Es wird beim Anklicken auf den Button in die Console der Text ausgegeben....aber was ausserdem noch passieren soll, das solltest du dort auch noch hinprogrammieren^^
    Allerdings sollte das Ereignis (was soll passieren, wenn der Button geklickt wird) nicht innerhalb der WM_Command-Funktion abgearbeitet werden, bzw die WM_Command "schnell" wieder verlassen werden, damit diese Funktion wieder für andere Ereignisse zur Verfügung stehen kann.

    Zitat

    Im Moment wird mir in der Konsole immer "Button geklickt" ausgegeben, auch wenn der Button noch nicht mal in der Toolbar existiert.

    Habe ich auch schon festgestellt, das ist aber ein Anzeigeproblem, welches sich mit geschicktem Setzen von Guisetstate() in den Griff bekommen lässt.
    ciao
    Andy

  • Doch, ich habe den Case geändert, auf meine Buttons halt. Komplett anpassen wollte ich es erst, wenn es mal funktioniert. Es soll halt anzeigen, dass ich geklickt habe, wenn ich geklickt habe. Irrtiert bin ich halt durch die Daueranzeige.

    Zitat

    Habe ich auch schon festgestellt, das ist aber ein Anzeigeproblem, welches sich mit geschicktem Setzen von Guisetstate() in den Griff bekommen lässt.

    Kannst Du mir das näher erklären? Wo soll ich das setzen?

    Edit: so, hab gerade den Case "Button geklickt" geändert. Eigentlich soll ne MsgBox erscheinen, aber er gibt immer noch in die Konsole aus??

  • Hi,
    da ich heute schon halb blind geworden bin durch das ewige "indieGlaskugelgucken" bleibt dir wohl nichts anderes übrig, als dein Script zu posten.....Hellsehen kann ich noch nicht, ich arbeite aber dran!
    ciao
    andy

  • Ok, hier bitte.

    Spoiler anzeigen
    [autoit]


    Global Enum $IDnew = 2500, $npp

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

    ...;hier ist nur ne kleine GUI, welches das zu manipulierende Prog starten, wartet bis das Fenster da ist und dann cs_change("Titel") ausführt

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

    Func cs_change($a)
    ;Hier wird die Toolbar des Progs gesucht und Buttons werden hinzugefügt
    $toolbar = _GUICtrlToolbar_FindToolbar($a, "")
    _GUICtrlToolbar_AddButtonSep($toolbar, 15)
    _GUICtrlToolbar_AddButton($toolbar, $IDnew, 17)
    _GUICtrlToolbar_AddButton($toolbar, $npp, 2)
    ;Bis hier funktionierts problemlos, Buttons sind in der Toolbar zu sehen
    EndFunc

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

    ; React on a button click
    Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0x0000FFFF)
    Local $hCtrl = $lParam
    Local $sText = ""
    consolewrite("Button geklickt"&@crlf)
    Switch $hCtrl
    Case $IDnew,$npp ;wenn einer der beiden buttons geklickt wurde, an meine Button-IDs angepasst
    Switch $nNotifyCode
    Case $BN_CLICKED
    geklickt() ;wenn auf einen der Buttons geklickt wurde ausführen
    Case $BN_PAINT
    $sText = "$BN_PAINT" & @CRLF
    Case $BN_PUSHED, $BN_HILITE
    $sText = "$BN_PUSHED, $BN_HILITE" & @CRLF
    Case $BN_UNPUSHED, $BN_UNHILITE
    $sText = "$BN_UNPUSHED" & @CRLF
    Case $BN_DISABLE
    $sText = "$BN_DISABLE" & @CRLF
    Case $BN_DBLCLK, $BN_DOUBLECLICKED
    $sText = "$BN_DBLCLK, $BN_DOUBLECLICKED" & @CRLF
    Case $BN_SETFOCUS
    $sText = "$BN_SETFOCUS" & @CRLF
    Case $BN_KILLFOCUS
    $sText = "$BN_KILLFOCUS" & @CRLF
    EndSwitch
    consolewrite($sText & _
    "-----------------------------" & @CRLF & _
    "WM_COMMAND - Infos:" & @CRLF & _
    "-----------------------------" & @CRLF & _
    "Code" & @TAB & ":" & $nNotifyCode & @CRLF & _
    "CtrlID" & @TAB & ":" & $nID & @CRLF & _
    "CtrlHWnd:" & $hCtrl & @CRLF & _
    _GUICtrlButton_GetText($hCtrl) & @CRLF)
    ;Return 0 ; Only workout clicking on the button
    EndSwitch
    ; Proceed the default Autoit3 internal message commands.
    ; You also can complete let the line out.
    ; !!! But only 'Return' (without any value) will not proceed
    ; the default Autoit3-message in the future !!!
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    Func geklickt()
    ;sollte ausgeführt werden, wird es aber nicht.
    MsgBox(0, "", "test")
    EndFunc

    [/autoit]


    Eventuell liegt es an den IDs, kA.

  • Hallo,
    warum so kompliziert, Toolbars lassen sich auch ohne WM_Command abfragen...

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <ButtonConstants.au3>
    #include <GuiButton.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiToolbar.au3>

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

    global $toolbar
    Global Enum $IDnew = 2500, $npp
    winactivate("Toolbar")
    WinWaitActive("Toolbar") ;warten bis Fenster aktiv
    $handle = WinGetHandle("Toolbar") ;handle vom Fenster holen
    cs_change($handle)

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

    while 1
    if _GUICtrlToolbar_IsButtonPressed($Toolbar, $idnew) then MsgBox(4096, "Information", "button "&$idnew&" pressed: " & _GUICtrlToolbar_IsButtonPressed($Toolbar, $idnew))
    if _GUICtrlToolbar_IsButtonPressed($Toolbar, $npp) then MsgBox(4096, "Information", "button "&$npp&" pressed: " & _GUICtrlToolbar_IsButtonPressed($Toolbar, $npp))
    wend

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

    ;hier ist nur ne kleine GUI, welches das zu manipulierende Prog starten, wartet bis das Fenster da ist und dann cs_change("Titel") ausführt

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

    Func cs_change($a)
    ;Hier wird die Toolbar des Progs gesucht und Buttons werden hinzugefügt
    $toolbar = _GUICtrlToolbar_FindToolbar($a, "")
    _GUICtrlToolbar_AddButtonSep($toolbar, 15)
    _GUICtrlToolbar_AddButton($toolbar, $IDnew, 17)
    _GUICtrlToolbar_AddButton($toolbar, $npp, 2)
    ;Bis hier funktionierts problemlos, Buttons sind in der Toolbar zu sehen
    EndFunc

    [/autoit]
  • Ich bin halt irgendwie für große Umwege... :whistling:
    Danke, es funktoniert. Und von allein wäre ich wohl nie auf die Idee gekommen. Ein riesen Dankeschön an dich, Andy. :thumbup: