以下例子是将Word打开,然后将它嵌入到winform窗体中,效果如下图:
C将exe运行程序嵌入到自己的winform窗体中 - kingmax_res - iSport
注意:该方法只适用于com的exe(如word,Excel之类),.net的编的exe就不能用这用方法嵌入到窗体中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Runtime.InteropServices; namespace WindowsTest { public partial class Form2 : Form { Process process = null ; IntPtr appWin; private string exeName = "" ; [DllImport( "user32.dll" , EntryPoint = "GetWindowThreadProcessId" , SetLastError = true , CharSet = CharSet.Unicode, ExactSpelling = true , CallingConvention = CallingConvention.StdCall)] private static extern long GetWindowThreadProcessId( long hWnd, long lpdwProcessId); [DllImport( "user32.dll" , SetLastError = true )] private static extern IntPtr FindWindow( string lpClassName, string lpWindowName); [DllImport( "user32.dll" , SetLastError = true )] private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent); [DllImport( "user32.dll" , EntryPoint = "GetWindowLongA" , SetLastError = true )] private static extern long GetWindowLong(IntPtr hwnd, int nIndex); [DllImport( "user32.dll" , EntryPoint = "SetWindowLongA" , SetLastError = true )] private static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong); //private static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong); [DllImport( "user32.dll" , SetLastError = true )] private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags); [DllImport( "user32.dll" , SetLastError = true )] private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint); [DllImport( "user32.dll" , EntryPoint = "PostMessageA" , SetLastError = true )] private static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam); private const int SWP_NOOWNERZORDER = 0x200; private const int SWP_NOREDRAW = 0x8; private const int SWP_NOZORDER = 0x4; private const int SWP_SHOWWINDOW = 0x0040; private const int WS_EX_MDICHILD = 0x40; private const int SWP_FRAMECHANGED = 0x20; private const int SWP_NOACTIVATE = 0x10; private const int SWP_ASYNCWINDOWPOS = 0x4000; private const int SWP_NOMOVE = 0x2; private const int SWP_NOSIZE = 0x1; private const int GWL_STYLE = (-16); private const int WS_VISIBLE = 0x10000000; private const int WM_CLOSE = 0x10; private const int WS_CHILD = 0x40000000; public string ExeName { get { return exeName; } set { exeName = value; } } public Form2() { InitializeComponent(); } private void button1_Click( object sender, EventArgs e) { this .exeName = @"D:\Program Files\Microsoft Office\OFFICE11\WINWORD.exe" ; try { // Start the process process = System.Diagnostics.Process.Start( this .exeName); // Wait for process to be created and enter idle condition process.WaitForInputIdle(); // Get the main handle appWin = process.MainWindowHandle; } catch (Exception ex) { MessageBox.Show( this , ex.Message, "Error" ); } // Put it into this form SetParent(appWin, this .Handle); // Remove border and whatnot // SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE); // Move the window to overlay it on this window MoveWindow(appWin, 0, 0, this .Width, this .Height, true ); } private void Form2_FormClosed( object sender, FormClosedEventArgs e) { try { process.Kill(); } catch { } } private void Form2_Resize( object sender, EventArgs e) { if ( this .appWin != IntPtr.Zero) { MoveWindow(appWin, 0, 0, this .Width, this .Height, true ); } //base.OnResize(e); } } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步