在C#应用程序中嵌入MS Word

问题描述:

我在程序中打开MS Word文档。对于面板的MS字一个在C#应用程序中嵌入MS Word

System.Diagnostics.Process pr = System.Diagnostics.Process.GetProcessById(pid); 
MainWindowHandleS = pr.MainWindowHandle; 
SetParent(MainWindowHandleS, panel.Handle); 
MoveWindow(MainWindowHandleS, 0, 0, panel.Width, panel.Height, false); 

问题:点击“文件”菜单栏上的设置父 - MS Word中打开了我的应用,不仅面板的整个区域。 任何人都可以提供一些建议吗?

+0

你会放弃这个想法。使用'SetParent'使一个进程的窗口成为另一个进程的子窗口是在16位Windows中完成的。今天仍然可以完成的纯粹是那些日子的宿醉。你没有希望将这项工作做好。找到不同的解决方案。 – 2014-10-09 08:21:15

+0

作为寻找不同解决方案的一种潜在方法,Word是否导出任何OLE对象? – andlabs 2014-10-09 15:18:37

+0

你是对的,但它必须解决 这么多遗留代码 – ars 2014-10-10 12:41:16

我解决了问题(意思是破解)。 通过Spy++ 在文件菜单中创建的搜索表单MS Office应用程序 - 具有空名称的“FullPageUiHost”类。并与winapi重新在新的领域。

IntPtr FileMenuHandle = (IntPtr)0; 
private void Timer_Tick(object sender, EventArgs e) 
{ 
    IntPtr tmpHndl = FindWindowEx(MainForm.Handle, IntPtr.Zero, "FullPageUIHost", null); 
    if (tmpHndl != IntPtr.Zero && FileMenuHandle == IntPtr.Zero) 
    { 
     FileMenuHandle = tmpHndl; 
     SetParent(FileMenuHandle, Panel.Handle); 
     MoveWindow(FileMenuHandle, 0, 0, Panel.Width, panel.Height, false); 
    } 
    else if (tmpHndl == IntPtr.Zero && FileMenuHandle != IntPtr.Zero) 
     FileMenuHandle = IntPtr.Zero; 
}