ObjGet( HWND ) - COM-Object mit Handle ermitteln ?

  • Hallo,

    wie bekomme ich mit einem HWND das COM-Object des Fensters/Programms?

    Problem bei ObjGet() ist, dass das Programm auch mehrmals laufen kann.
    Mit ObjGet() bekomme ich aber immer nur die erste Instanz.
    Mit WinGetHandle / WinList etc. bekomme ich zwar das richtige Fenster und dessen HWND, ich brauche aber
    für die weitere Steuerung das COM-Object.
    Ist das irgendwie machbar?

    Gruß
    Uling

  • Hallo,

    leider funktioniert es mit CLASS nicht, ich bekomme nicht mal mit ObjGet("","[CLASS:Excel.Application]") ein Object. :(

    Ich dachte an die Funktion _IEAttach() mit der man auch mit einen HWND das Object bekommt.
    Leider setzt das auf "Shell.Application" auf, und das sieht ja nur Explorer und IE.
    Wenn man weiter in diese Funktion geht kommt man an __IEControlGetObjFromHWND, welches die oleacc.dll anspricht:

    Spoiler anzeigen
    [autoit]

    Func __IEControlGetObjFromHWND(ByRef $hWin)
    DllCall("ole32.dll", "int", "CoInitialize", "ptr", 0)
    Local Const $WM_HTML_GETOBJECT = __IERegisterWindowMessage("WM_HTML_GETOBJECT")
    Local Const $SMTO_ABORTIFHUNG = 0x0002
    Local $lResult, $typUUID, $aRet, $oIE

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

    __IESendMessageTimeout($hWin, $WM_HTML_GETOBJECT, 0, 0, $SMTO_ABORTIFHUNG, 1000, $lResult)

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

    $typUUID = DllStructCreate("int;short;short;byte[8]")
    DllStructSetData($typUUID, 1, 0x626FC520)
    DllStructSetData($typUUID, 2, 0xA41E)
    DllStructSetData($typUUID, 3, 0x11CF)
    DllStructSetData($typUUID, 4, 0xA7, 1)
    DllStructSetData($typUUID, 4, 0x31, 2)
    DllStructSetData($typUUID, 4, 0x0, 3)
    DllStructSetData($typUUID, 4, 0xA0, 4)
    DllStructSetData($typUUID, 4, 0xC9, 5)
    DllStructSetData($typUUID, 4, 0x8, 6)
    DllStructSetData($typUUID, 4, 0x26, 7)
    DllStructSetData($typUUID, 4, 0x37, 8)

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

    $aRet = DllCall("oleacc.dll", "int", "ObjectFromLresult", "int", $lResult, "ptr", DllStructGetPtr($typUUID), _
    "int", 0, "idispatch_ptr", "")

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

    If IsObj($aRet[4]) Then
    $oIE = $aRet[4].Script ()
    ; $oIE is now a valid IDispatch object
    Return $oIE.Document.parentwindow
    Else
    SetError(1)
    Return 0
    EndIf
    EndFunc ;==>__IEControlGetObjFromHWND

    [/autoit]


    ob man das evtl. umbauen kann?
    leider habe ich mich mit den DLL calls noch nicht beschäftigt und weiss nicht, wie und was man da übergeben kann und muss.

    Konkret geht es um den BMC Remedy User Client welchen ich dann steuern möchte.
    Die verschiedenen Instanzen kann man gut mit dem visible und hidden Texten auseinander halten.
    Nur bekomme ich damit den HWND und nicht das Object ...


    Gruß
    Ulf

  • vielleicht ein anderer Ansatz:

    ich habe das Object und HWND eines embedded IE.
    wie bekomme ich das Object vom Programm, welches diesen embedded IE enthält ?


    Gruß
    Uling