c#调用 windows api实现WinForm中嵌入EXE程序

添加引用:



using System.Diagnostics;



using System.Runtime.InteropServices;



 



定义:



Process process = null;



IntPtr appWin;



private string exeName =""; 



[DllImport("user32.dll", EntryPoint ="GetWindowThreadProcessId", SetLastError = true,



CharSet = CharSet.Unicode, ExactSpelling =true,



CallingConvention = CallingConvention.StdCall)]



private staticextern long GetWindowThreadProcessId(long hWnd,long lpdwProcessId); 



[DllImport("user32.dll", SetLastError =true)]



private staticextern IntPtr FindWindow(string lpClassName,string lpWindowName); 



[DllImport("user32.dll", SetLastError =true)]



private staticextern long SetParent(IntPtr hWndChild,IntPtr hWndNewParent); 



[DllImport("user32.dll", EntryPoint ="GetWindowLongA", SetLastError = true)]



private staticextern long GetWindowLong(IntPtr hwnd,int nIndex); 



[DllImport("user32.dll", EntryPoint ="SetWindowLongA", SetLastError = true)]



private staticextern 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 staticextern long SetWindowPos(IntPtr hwnd,long hWndInsertAfter, long x,long y, long cx, long cy, long wFlags); 



[DllImport("user32.dll", SetLastError =true)]



private staticextern bool MoveWindow(IntPtr hwnd,int x, int y, int cx, int cy, bool repaint); 



[DllImport("user32.dll", EntryPoint ="PostMessageA", SetLastError = true)]



private staticextern bool PostMessage(IntPtr hwnd,uint Msg, long wParam,long lParam); 



private constint SWP_NOOWNERZORDER = 0x200;



 private const int SWP_NOREDRAW = 0x8;



private constint SWP_NOZORDER = 0x4;



private constint SWP_SHOWWINDOW = 0x0040;



private constint WS_EX_MDICHILD = 0x40;



private constint SWP_FRAMECHANGED = 0x20;



private constint SWP_NOACTIVATE = 0x10;



private constint SWP_ASYNCWINDOWPOS = 0x4000;



private constint SWP_NOMOVE = 0x2;



private constint SWP_NOSIZE = 0x1;



private constint GWL_STYLE = (-16);



private constint WS_VISIBLE = 0x10000000;



private constint WM_CLOSE = 0x10;



private constint WS_CHILD = 0x40000000;



 



public string ExeName



{



get



{



return exeName;



}



set



{



exeName = value;



}



} 







调用:



 this.exeName = @"C:/Program Files/Kingview/Touchvew.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.splitContainer1.Panel2.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 splitContainer1_Panel2_Resize(object sender,EventArgs e)



{



if (this.appWin !=IntPtr.Zero)



{



MoveWindow(appWin, 0, 0, this.splitContainer1.Panel2.Width,this.splitContainer1.Panel2.Height, true);



}



base.OnResize(e);



}



 



窗口退出时:



private void Form1_FormClosed(object sender,FormClosedEventArgs e)



{



process.Kill();



// Stop the application



//if (appWin != IntPtr.Zero)



//{ 



//// Post a colse message



////PostMessage(appWin, WM_CLOSE, 0, 0); 



//// Delay for it to get the message



//// System.Threading.Thread.Sleep(1000); 



//// Clear internal handle



//appWin = IntPtr.Zero; 



//} 



//base.FormClosed(e); 



} 

 

你可能感兴趣的:(windows)