MS Word автоматизация с двухсторонней связью - PullRequest
4 голосов
/ 20 января 2011

Я делаю встраивание MS Word в свое приложение, используя функцию Win32 SetParent. Все отлично работает, но есть требование сделать обратный вызов из Word Custom Кнопка на панели инструментов для родительского приложения. Экземпляр Word встроен в пользовательский контроль, поэтому Родитель это. Ручка.

Код 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 безрезультатно.

1 Ответ

0 голосов
/ 08 марта 2011

Проблема может заключаться в том, что FindWindow уже возвращает окно верхнего уровня (то есть то, в которое вы встроили Word). ИМО нет необходимости звонить GetAncestor, это всегда возвращает окно рабочего стола ...

...