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); 

} 

 

转载于:https://www.cnblogs.com/jiangguang/archive/2012/11/08/2761132.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值