Как я могу вывести окно приложения слова на передний план с помощью С#?

Я разрабатываю надстройку для офисного слова, используя vsto. Я пытаюсь вывести окно слова в уменьшенном размере, перенося его на передний план. Я пытаюсь использовать функцию winapi SwitchToThisWindow, SetForegroundWindow, SetWindowPos, как это

if (handlePtr != IntPtr.Zero)
{
    Win32API.SwitchToThisWindow(handlePtr, true);
    //Win32API.ShowWindow(handlePtr, Win32API.SW_MAXIMIZE);
    ////Win32API.SetForegroundWindow(handlePtr); 
    //Win32API.SetWindowPos(handlePtr, Win32API.HWND_TOP, 0, 0, 0, 0, Win32API.SWP_NOMOVE | Win32API.SWP_NOSIZE | Win32API.SWP_SHOWWINDOW);
}

и Application.Activate(), он работает так же, как и любая другая подобная функция, и только заставляет его мигать на панели задач, а не выводить его на передний план.

Есть ли способ исправить это? Я также пытаюсь отправить клавиши «alt + tab», но я не знаю, как направить окно текстового процесса.


person asa9891    schedule 12.01.2017    source источник
comment
Как получить дескриптор окна? Обратите внимание, что ваш вопрос может быть дубликатом stackoverflow.com/questions/9099479/   -  person Dirk Vollmar    schedule 12.01.2017
comment
Вы правы, я получаю дескриптор главного окна, получая текущий процесс MainWindowHandle. Я думаю, что он изменился, когда он свернут. Но вопрос в том, как я могу получить дескриптор главного окна слова, когда выполняется функция Ribbon_Load надстройки слова.   -  person asa9891    schedule 13.01.2017
comment
Я должен попытаться вызвать winapi findow (NetUIHWND, null) и получить результат 0. Класс NetUIHWND использует для получения шпион ++.   -  person asa9891    schedule 13.01.2017
comment
MainWindowHandle может легко вызвать проблемы: он может больше не быть действительным, например. если первый документ закрыт, или вы получаете неправильное окно, если открыто несколько документов. Лучше использовать свойство Window.Hwnd, например. через Application.ActiveDocument.Window[1].Hwnd или Application.ActiveWindow.   -  person Dirk Vollmar    schedule 13.01.2017
comment
Спасибо, я финансирую другой способ работы. это мой код: WordApplication.Activate(); WordApplication.Visible = true; WordApplication.ActiveDocument.Activate(); IntPtr winfrom = IntPtr.Zero; if (GetNEClientRunningState(out winfrom)) { Win32API.SwitchToThisWindow(winfrom, true); System.Threading.Thread.Sleep(30); SendKeys.SendWait("%{TAB}"); }   -  person asa9891    schedule 17.01.2017
comment
Привет, Дирк, у меня есть еще одна серьезная проблема: он не может активировать последний активный документ при открытии многословного документа. Я попытался использовать ваш код предложения Application.ActiveDocument.Window[1].Hwnd и Application.ActiveWindow. Приносим извинения за неудобства! Это мой код IntPtr handlePtr = new IntPtr(WordApplication.ActiveDocument.Windows[1].Hwnd);Win32API.SwitchToThisWindow(handlePtr, true);Win32API.ShowWindow(handlePtr, Win32API.SW_MAXIMIZE);Win32API.SetForegroundWindow(handlePtr)   -  person asa9891    schedule 17.01.2017