none
ユーザーフォームのウィンドウハンドルからユーザーフォームのオブジェクトを取得する方法 RRS feed

  • 質問

  • Excel VBA にて WindowFromAccessibleObject を使えばユーザーフォームのオブジェクトから
    ユーザーフォームのウィンドウハンドルを取得できますがその逆、つまりはユーザーフォームの
    ウィンドウハンドルからユーザーフォームのオブジェクトを取得するにはどうしたらいいのでしょうか。

    おそらくは AccessibleObjectFromWindow を使うと思うのですが情報が少なく、試行錯誤したものの
    引数の dwId と riid になにを指定すればいいのかまったく分かりません。

    ちなみにワークブックのウィンドウハンドルから Window オブジェクトを取得することはできました。

    Private Declare PtrSafe Function IIDFromString Lib "ole32" ( _
        ByVal lpsz As Any, lpiid As Any) As Long
    Private Declare PtrSafe Function AccessibleObjectFromWindow Lib "oleacc" ( _
        ByVal hWnd As LongPtr, ByVal dwId As Long, _
        riid As Any, ppvObject As Any) As Long
    Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
        ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, _
        ByVal lpsz1 As String, ByVal lpsz2 As String _
        ) As LongPtr
    
    Private Const OBJID_NATIVEOM = &HFFFFFFF0
    
    Const IID_IDISPATCH = "{00020400-0000-0000-C000-000000000046}"
    
    Private Type GUID
        lData1 As Long
        iData2 As Integer
        iData3 As Integer
        aBData4(0 To 7) As Byte
    End Type
    
    Sub test()
        Dim IDispatch As GUID
        Dim win As Window
    
        IIDFromString StrPtr(IID_IDISPATCH), IDispatch
        AccessibleObjectFromWindow FindWindowEx(FindWindowEx(ThisWorkbook.Windows(1).hWnd, 0, "XLDESK", vbNullString), 0&, "EXCEL7", vbNullString), OBJID_NATIVEOM, IDispatch, win
        Debug.Print win.Caption
    End Sub


    • 編集済み infade 2019年3月29日 4:40 Excel の頭文字が小文字になってた
    2019年3月29日 4:38