DllCreateStruct Problem

  • Hi
    ich habe beim schreiben meins Progamms, das eine von einem anderen Programm, per windows api befehl "postmessage" in der user32.dll, gesendete Nachricht erhälten soll. Das Problem liegt wohl beim befehl DllStructCreate denn laut der autoit-hilfe sind die laut der msdn hilfe für die Msg Structure, die ich mit DllStructCreate erzeugen will, benötigten datentypen nicht in Autoit verwendbar und ich weiß nicht wie ich das lösen soll da nun mein Progamm beim aufruf der Dll mit einem autoit-error abstürzt.

    msdn Structure:

    Spoiler anzeigen


    struct {
    HWND hwnd;
    UINT message;
    WPARAM wParam;
    LPARAM lParam;
    DWORD time;
    POINT pt;
    }

    Hier nochmal der Link zur msdn: http://msdn.microsoft.com/en-us/library/ms644958(VS.85).aspx

    Ich wäre euch sehr dankbar für ne Antwort, ich weiß die Frage ist vermutlich net einfach da man sich erst mal in der msdn einlesen muss aber dennoch, ich baue auf euch ;)

    Danke im Vorraus
    Redclaw

  • Hi,

    hier isses ...

    Spoiler anzeigen
    [autoit]


    ; --- $_POINT
    Global Const $_POINT = _
    'long x;'& _
    'long y;'

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

    ; --- $_MSG
    Global Const $_MSG = _
    'hwnd hwnd;'& _
    'uint message;'& _
    'uint wParam;'& _
    'long_ptr lParam;'& _
    'dword time;'& _
    $POINT

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

    ; [...]

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

    $msg = DllStructCreate ($_MSG)

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

    ; [...]

    [/autoit]


  • Du willst die Nachricht auswerten und nicht senden richtig? _WinAPI_PostMessage wäre fürs abfeuern.
    Könnte sein, dass ich jetzt Blödsinn rede, aber Sendmessage wird über GUIRegisterMsg abgefangen.
    Das sollte auch für Postmessage funktionieren.

    [autoit]


    GUIRegisterMsg($WM_Command ,"WM_COMMAND")
    ;
    ;
    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    Local $iIDFrom, $iCode
    $iIDFrom = BitAND($iwParam, 0xFFFF) ; Low Word
    $iCode = BitShift($iwParam, 16) ; Hi Word

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

    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

    [/autoit]
  • Die Parameter für die Struct musst du so ändern. Mit AutoIt v3.3.2.0 werden diese Variablentypen unterstützt:

    [autoit]

    Global Const $tagMSG = "HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time;long pt[2];"

    [/autoit]

    Edit: Wobei du das gar nicht brauchst. Du musst in deinem Skript für die gewünschte Message mit GUIRegisterMessage eine Funktion registrieren in der du sie verarbeitest.
    Falls die Nachricht von dem anderen Programm keine Nummer, sondern einen Namen hat, musst du zuerst die zugehörige Nummer herausfinden:

    [autoit]

    $MY_WND_MSG = _WinAPI_RegisterWindowMessage("DER_NACHRICHTENNAME")
    GUIRegisterMsg($MY_WND_MSG, "_Meine_Funktion")
    Func _Meine_Funktion($hWnd, $iMsg, $iwParam, $ilParam)
    ...
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von progandy (15. Januar 2010 um 13:40)

  • Suuper
    danke danke danke ;)
    Morgen werd ichs ausprobieren.
    Tut mir Leid dass ich nicht wieder geantwortet habe, hatte sehr viel zu tun.
    Ich berichte dann obs geht.
    Ihr seid Spitze.
    Redclaw