C# 具有双向通信的MS Word自动化

C# 具有双向通信的MS Word自动化,c#,winapi,ms-word,automation,C#,Winapi,Ms Word,Automation,我正在使用Win32 SetParent函数在我的应用程序中嵌入MS Word。 一切正常,但需要从Word custom执行回调 父应用程序的工具栏按钮。Word实例嵌入到用户控件中,因此 父对象是这个.Handle VBA代码如下所示: Sub Submit() Dim hwnd As Long hwnd = FindWindow("Opusapp", vbNullString) hwnd = GetAncestor(hwnd, GA_PARENT) If hwnd = 0 Then

我正在使用Win32 SetParent函数在我的应用程序中嵌入MS Word。 一切正常,但需要从Word custom执行回调 父应用程序的工具栏按钮。Word实例嵌入到用户控件中,因此 父对象是这个.Handle

VBA代码如下所示:

Sub Submit()
Dim hwnd As Long
hwnd = FindWindow("Opusapp", vbNullString)
hwnd = GetAncestor(hwnd, GA_PARENT)
If hwnd = 0 Then
    MsgBox "Failed to callback!"
    Exit Sub
End If
OutputDebugString ("Parent window " + CStr(hwnd))
Dim id As Long
id = RegisterWindowMessage("__CALLBACK_FROM_WORD__")
If hwnd = 0 Then
    MsgBox "Failed to callback. Message not registered"
    Exit Sub
End If
OutputDebugString ("Message " + CStr(id))
End Sub
在C#中,代码如下:

        protected override void OnHandleCreated(EventArgs e)
    {
        submitMessageId_ = RegisterWindowMessage("__CALLBACK_FROM_WORD__");
        base.OnHandleCreated(e);
    }

    protected override void OnHandleDestroyed(EventArgs e)
    {
        base.OnHandleDestroyed(e);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == submitMessageId_)
        {
            Logger.Instance().Write("WndProc: Submit event");
            return;
        }
        base.WndProc(ref m);
    }
问题似乎是VBA无法找到正确的窗口句柄。
我尝试使用GetParent没有任何效果。

问题可能是,
FindWindow
已经返回了一个顶级窗口(即您嵌入Word的窗口)。在我看来,没有必要调用
getconsent
,这将始终返回桌面窗口…

也许我可以使用SetWindowText将正确的hwnd传递给VBA