Selbsterstelltes Menü reagiert nicht

  • Könnte sich mal bitte jemand diesen Code ansehen?

    Spoiler anzeigen
    [autoit]


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

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

    Global Enum $m_skript, $hilfe, $test1

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

    $obl = RegRead("HKLM\Software\Bethesda Softworks\Oblivion", "Installed Path")

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

    If FileExists($obl & "obse_loader.exe") Then
    ShellExecute($obl & "obse_loader.exe", "-editor", $obl)
    Else
    Run($obl & "TESConstructionSet.exe", $obl)
    EndIf

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

    WinWaitActive("TES Construction Set")
    $hWnd = WinGetHandle("TES Construction Set")
    $tes4 = _GUICtrlMenu_GetMenu($hWnd)

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

    $tes4bot_skript = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($tes4bot_skript, 0, "Test &1", $test1)

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

    $tes4bot = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($tes4bot, 0, "Skript &1", $m_skript, $tes4bot_skript)
    _GUICtrlMenu_InsertMenuItem($tes4bot, 1, "", 0)
    _GUICtrlMenu_InsertMenuItem($tes4bot, 2, "Hilfe &9", $hilfe)

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

    _GUICtrlMenu_InsertMenuItem($tes4, 6, "&tes4bot", 0, $tes4bot)
    _GUICtrlMenu_DrawMenuBar($hWnd)

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    Do
    Until Not WinExists("TES Construction Set")

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Switch _WinAPI_LoWord ($iwParam)
    Case $test1
    MsgBox(0, "", "1")
    Case $hilfe
    MsgBox(0, "", "2")
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]


    Er fügt zu einem Game-Editor ein (noch) minimalistisches Menü hinzu. Doch dummerweise reagiert das Menü nicht auf Eingaben. Scite spuckt keine Fehler aus und das Programm läuft in der Endlosschleife, wo es eigentlich die Eingaben abfangen sollte.

    PS: Der Code ist von einen Notepad-Beispiel aus der Hilfe kopiert und leicht angepasst. Ich habe ihn bereits verglichen, kann den Fehler aber nicht entdecken.

  • $obl endet auf \ oder ohne Backslash am Ende?

    Wird obse_loader.exegestartet bzw das andere oder wie weit kommst du?

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Zitat

    Doch dummerweise reagiert das Menü nicht auf Eingaben.

    ;)
    Was glaubst Du?
    $obl endet mit einem Backslash. Sonst würde die Pfadangabe wenig Sinn machen, das Programm nicht starten und das Menü würde gar nicht erstellt werden.
    Ich komme bis zum Ende. Der Editor startet, das Menü wird hinzugefügt. Aber ich kann es nicht nutzen. Die Untermenüs erscheinen zwar, aber bei einem Klick auf die Items passiert nichts. Im momentanen Code sollten ja zwei MessageBoxen auftauchen. Das passiert nicht.
    In der Endlosschleife selber kann ich eine Messagebox sehen(wenn ich da eine reinschreibe!!). Aus irgendeinem Grund erkennt der Code nicht, welches Item ich anklicke.

  • Ah...ja... ?(
    Ich dachte dafür wäre dieser Codeblock zuständig:

    Spoiler anzeigen
    [autoit]


    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    Do
    Until Not WinExists("TES Construction Set")

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Switch _WinAPI_LoWord ($iwParam)
    Case $test1
    MsgBox(0, "", "1")
    Case $hilfe
    MsgBox(0, "", "2")
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Das fuktioniert zumindest im Beispielcode(_GUICtrlMenu_CreateMenu) perfekt.
    Bitte um Aufklörung bzw. etwas genauerer Hilfestellung. Ich probier zwar rum, komm aber zu keinem Ergebnis.

  • Hm also das mit dem GUIRegisterMsg() scheint sich nur auf Autoit - GUI'S zu beziehen, ich habe mir da mal ein Script zusammen kopiert und mal machgeschaut, jedesmal wenn ein Control außerhalb der GUi angeklickt wird wird nichts in die console geschrieben. Insofern verstehe ich nicht, dass es die Funktion um ein Menu in einer GUI aushalb von Autoit einzufügen überhaupt gibt. Jedenfalls solltest du beim Enumerieren aufpassen das du von anfang sagen wir einen index von 10000 oder so definierst denn wenn ich ein Menuitem beim Notepad mit der ID 0x0001 öffnet sich der "Öffnen" - Dialog ;)


    Spoiler anzeigen
    [autoit]

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

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

    Global $iMemo, $hWnd
    Global Enum $idNew = 1000, $idOpen, $idSave, $idExit, $idCut, $idCopy, $idPaste, $idAbout

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

    _Main()

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

    Func _Main()
    Local $hGUI, $hFile, $hEdit, $hHelp, $hMain
    Run("Notepad.exe")
    WinWaitActive("[CLASS:Notepad]")
    $hWnd = WinGetHandle("[CLASS:Notepad]")
    $hMain = _GUICtrlMenu_GetMenu($hWnd)

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

    ; Create subitem menu
    $hItem1 = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hItem1, 0, "SubItem &1", 0x1008)
    _GUICtrlMenu_InsertMenuItem($hItem1, 1, "SubItem &2", 0x1009)

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

    ; Create menu
    $hItem2 = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hItem2, 0, "Item &1", 0x2000, $hItem1)
    _GUICtrlMenu_InsertMenuItem($hItem2, 1, "Item &2", 0x2001)
    _GUICtrlMenu_InsertMenuItem($hItem2, 2, "", 0)
    _GUICtrlMenu_InsertMenuItem($hItem2, 3, "Item &3", 0x2002)
    _GUICtrlMenu_InsertMenuItem($hItem2, 4, "Item &4", 0x2003)

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

    ; Insert new menu into Notepad
    _GUICtrlMenu_InsertMenuItem($hMain, 6, "&AutoIt", 0, $hItem2)
    _GUICtrlMenu_DrawMenuBar($hWnd)

    $hGUI = GUICreate("Menu", 400, 300)

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

    ; Create File menu
    $hFile = _GUICtrlMenu_CreateMenu ()
    _GUICtrlMenu_InsertMenuItem ($hFile, 0, "&New", $idNew)
    _GUICtrlMenu_InsertMenuItem ($hFile, 1, "&Open", $idOpen)
    _GUICtrlMenu_InsertMenuItem ($hFile, 2, "&Save", $idSave)
    _GUICtrlMenu_InsertMenuItem ($hFile, 3, "", 0)
    _GUICtrlMenu_InsertMenuItem ($hFile, 4, "E&xit", $idExit)

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

    ; Create Edit menu
    $hEdit = _GUICtrlMenu_CreateMenu ()
    _GUICtrlMenu_InsertMenuItem ($hEdit, 0, "&Cut", $idCut)
    _GUICtrlMenu_InsertMenuItem ($hEdit, 1, "C&opy", $idCopy)
    _GUICtrlMenu_InsertMenuItem ($hEdit, 2, "&Paste", $idPaste)

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

    ; Create Help menu
    $hHelp = _GUICtrlMenu_CreateMenu ()
    _GUICtrlMenu_InsertMenuItem ($hHelp, 0, "&About", $idAbout)

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

    ; Create Main menu
    $hMain = _GUICtrlMenu_CreateMenu ()
    _GUICtrlMenu_InsertMenuItem ($hMain, 0, "&File", 0, $hFile)
    _GUICtrlMenu_InsertMenuItem ($hMain, 1, "&Edit", 0, $hEdit)
    _GUICtrlMenu_InsertMenuItem ($hMain, 2, "&Help", 0, $hHelp)

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

    ; Set window menu
    _GUICtrlMenu_SetMenu ($hGUI, $hMain)

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

    ; Create memo control
    $iMemo = GUICtrlCreateEdit("", 2, 2, 396, 276, 0)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()

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

    ; Loop until user exits
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

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

    ; Loop until user exits
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    EndFunc ;==>_Main

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

    ; Handle menu commands
    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    ConsoleWrite(_WinAPI_LoWord($iwParam) & @CRLF)
    Switch _WinAPI_LoWord ($iwParam)
    Case $idNew
    MemoWrite("New")
    Case $idOpen
    MemoWrite("Open")
    Case $idSave
    MemoWrite("Save")
    Case $idExit
    Exit
    Case $idCut
    MemoWrite("Cut")
    Case $idCopy
    MemoWrite("Copy")
    Case $idPaste
    MemoWrite("Paste")
    Case $idAbout
    MemoWrite("About")
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    ; Write message to memo
    Func MemoWrite($sMessage)
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
    EndFunc ;==>MemoWrite

    [/autoit]

    Also wiegesagt, ich denke nicht dass das funktioniert. lasse mich aber gerne eines Besseren belehren :rolleyes:
    greetz DJ

  • Ja, das habe ich inzwischen auch gemerkt.
    Aber gibt es evtl. eine Möglichkeit, ein beliebiges Fenster als AutoIt-GUI zu deklarieren?
    Damit könnte man ja das Problem quasi umgehen.

  • Hi penta.phoenix,

    Fakt ist, dass alle WM_COMAND Befehle bzw. Nachrichten etc. eines Fensters immer an den dazugehörigen Prozess weitergeleitet werden, dafür ist das Betriebssystem verantwortlich. Im eigentlichen Prozess werden diese Befehle dann von eine MSG-Handler verarbeitet. Man kann sich das wie die Verarbeitung mit GUIGetMsg() vorstellen, das ganze bloß einwenig komplexer. Ich denke mal das es mit autoiteigenen Mitteln nicht machbar ist, ein fremdes Fenster als ein Autoitfenster einzubinden und so mit die Messages abzufangen. Allerdings gibt es da eine interessante API - Funktion; SetWindowsHookEx in Autoit, wäre dass dann _WinAPISetWindowsHookEx, anscheinend kann man laut Hilfe die MSG-Befehle abfangen. Wie die Autoithilfe nun mal so ist, weil Autoit auch Funktionen von PaulIA enthällt, fehlt dazu gänzlich ein Beispiel. Nach einer kleinen Rechere im Internet bin ich da auf einen C++ Code gestoßen der die vorgehensweise zumindest einwenig verdeutlicht. Leider sind meine C++ - Kenntnisse so gut alsdass ich dir dass jetzt in Autoit übersetzen könnte, dafür ist mir auch die API einwenig zu komplex :D

    Spoiler anzeigen

    Das soweit zum Code, ich habe es mal versucht irgendwie in Autoit umzusetzen aber es scheitert an der API, da ich da keinen Schimmer davon habe :pinch: Vllt kann dir ja einer den Code übersetzen, ich denke, dass du ansonsten schlechte Karten hast

    greetz DJ

  • Danke, der Code ist nicht schlecht. Mal sehen, vlt. übersetze ich in selber nach AutoIt. Dafür müssen die inkludierten Dateien(vlc.h,...) allerdings Standard-Dateien sein. Sonst hab ich ja keine Ahnung, was drinsteht.

    Zitat

    Leider sind meine C++ - Kenntnisse so gut alsdass ich dir dass jetzt in Autoit übersetzen könnte, dafür ist mir auch die API einwenig zu komplex

    Mach dir nix draus, meine reichen auch nur um C++ zu lesen und zu 75% zu verstehen. Die Programme, welche ich mit AUtoIt geschrieben habe, hätte ich mit C++ nie so schnell und gut hinbekommen.

    Sollten die inkludierten Dateien Standard sein und ich die Zeit dazu finde, wird hier eine kleine "Übersetzung"(evtl. gleich als Funktion) gepostet.