2015-06-14 7 views
2

Я использую SetParent для размещения внешнего приложения в своем приложении (используя WindowsFormHost).
Течение так:SetParent окна перед открытием окна

  1. Я открываю мое приложение
  2. открыть внешнее приложение programmaticly
  3. я использую SetParent, чтобы разместить его в мое приложение.

Из-за потока выше, когда открывается внешнее приложение, я могу увидеть его в панели задач/диспетчере задач на долю секунды (пока не будет установлен родительский элемент).

Могу ли я как-то изменить порядок, в котором он сначала установит родительский элемент, а затем откройте приложение? все, что я хочу, - это избегать того, что я только что описал.
Если у вас есть какие-либо другие решения для моей проблемы, я с радостью приму это.


EDIT:
Это мой код

string strPres = @"C:\Users\Ron\Desktop\Create an Office Mix.pptx"; 
oPPT = new Microsoft.Office.Interop.PowerPoint.Application(); 
oPPT.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; 
objPresSet = oPPT.Presentations; 
objPres = objPresSet.Open(strPres, MsoTriState.msoFalse, 
      MsoTriState.msoFalse, MsoTriState.msoTrue); 
objPres.SlideShowSettings.ShowType = Microsoft.Office.Interop.PowerPoint.PpSlideShowType.ppShowTypeWindow; 
objPres.SlideShowSettings.Run(); 

objPres.Windows[1].Close(); 
objPres.Saved = MsoTriState.msoTrue; 

uint oPPTID; 
GetWindowThreadProcessId(new IntPtr(oPPT.HWND), out oPPTID); 
_process = Process.GetProcessById((int)oPPTID); 
_process.WaitForInputIdle(); 
SetParent(_process.MainWindowHandle, _panel.Handle); 
+0

Я не уверен, что вы можете скрыть этот значок, прежде чем открывать приложение. Как открыть приложение программно? – DavidG

ответ

2

Вы не можете позвонить SetParent(), пока вы не знаете дескриптор окна. Приложение, создающее его окно, неизбежно также приводит к созданию кнопки панели задач, и это не позволяет переопределить это. ProcessStartInfo.WindowStyle может быть обходным путем, когда вы запрашиваете Hidden, за исключением того, что подавляющее большинство приложений игнорируют этот запрос.

Вы можете только об этом быстро и использовать тот же механизм, что оболочка использует, чтобы заметить, что созданное окно создается. И опередить его, что требует SetWindowsHookEx(). Крайне больно делать из приложения .NET, крючок WH_SHELL требует наличия библиотеки DLL, которая может быть введена в процесс, поэтому она не может быть записана на C#. Есть проект Codeproject.com, который помогает, located here. Это довольно датировано, YMMV.