C#通过WIN32 API实现嵌入程序窗体
程序员文章站
2023-12-19 14:23:22
本文实例讲述了c#通过win32 api实现嵌入程序窗体的方法,分享给大家供大家参考。具体如下:
这是一个不使用com,而是通过win32 api实现的示例, 它把写字板...
本文实例讲述了c#通过win32 api实现嵌入程序窗体的方法,分享给大家供大家参考。具体如下:
这是一个不使用com,而是通过win32 api实现的示例, 它把写字板程序嵌在了自己的一个面板中。
这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做到, 以下是详细注释过的主要源代码。
我们把它封装到一个类中:
using system; using system.collections.generic; using system.linq; using system.text; using system.diagnostics; using system.runtime.interopservices; using system.windows.forms; namespace system.windows.forms { class insertwindow { /// <summary> /// 将程序嵌入窗体 /// </summary> /// <param name="pw">容器</param> /// <param name="appname">程序名</param> public insertwindow(panel pw,string appname) { this.pan = pw; this.loadevent(appname); pane(); } ~insertwindow() { if (m_innerprocess!=null) { m_innerprocess.dispose(); } } #region 函数和变量声明 /* * 声明 win32 api */ [dllimport("user32.dll")] static extern intptr setparent(intptr hwndchild, intptr hwndnewparent ); [dllimport("user32.dll")] static extern int32 getwindowlong(intptr hwnd, int32 nindex ); [dllimport("user32.dll")] static extern int32 setwindowlong(intptr hwnd, int32 nindex, int32 dwnewlong ); [dllimport("user32.dll")] static extern int32 setwindowpos(intptr hwnd, intptr hwndinsertafter, int32 x, int32 y, int32 cx, int32 cy, uint32 uflags ); /* * 定义 win32 常数 */ const int32 gwl_style = -16; const int32 ws_border = (int32)0x00800000l; const int32 ws_thickframe = (int32)0x00040000l; const int32 swp_nomove = 0x0002; const int32 swp_nosize = 0x0001; const int32 swp_nozorder = 0x0004; const int32 swp_framechanged = 0x0020; const int32 sw_maximize = 3; intptr hwnd_notopmost = new intptr(-2); // 目标应用程序的进程. process m_innerprocess = null; #endregion #region 容器 private panel pan = null; public panel panel1 { set { pan = value; } get { return pan; } } private void pane() { panel1.anchor = anchorstyles.left | anchorstyles.top | anchorstyles.right | anchorstyles.bottom; panel1.resize += new eventhandler(panel1_resize); } private void panel1_resize(object sender, eventargs e) { // 设置目标应用程序的窗体样式. intptr innerwnd = m_innerprocess.mainwindowhandle; setwindowpos(innerwnd, intptr.zero, 0, 0, panel1.clientsize.width, panel1.clientsize.height, swp_nozorder); } #endregion #region 相应事件 private void loadevent(string appfile) { // 启动目标应用程序. m_innerprocess = process.start(appfile); m_innerprocess.startinfo.windowstyle = processwindowstyle.hidden; //隐藏 // 等待, 直到那个程序已经完全启动. m_innerprocess.waitforinputidle(); // 目标应用程序的主窗体. intptr innerwnd = m_innerprocess.mainwindowhandle; // 设置目标应用程序的主窗体的父亲(为我们的窗体). setparent(innerwnd, panel1.handle); // 除去窗体边框. int32 wndstyle = getwindowlong(innerwnd, gwl_style); wndstyle &= ~ws_border; wndstyle &= ~ws_thickframe; setwindowlong(innerwnd, gwl_style, wndstyle); setwindowpos(innerwnd, intptr.zero, 0, 0, 0, 0, swp_nomove | swp_nosize | swp_nozorder | swp_framechanged); // 在resize事件中更新目标应用程序的窗体尺寸. panel1_resize(panel1, null); } #endregion } }
然后在窗口的load事件中加入详细代码如下:
using system; using system.collections.generic; using system.componentmodel; using system.data; using system.drawing; using system.linq; using system.text; using system.windows.forms; using system.runtime; using system.runtime.interopservices; using system.diagnostics; namespace 将程序窗口嵌入到任务栏中 { public partial class form1 : form { private system.windows.forms.panel panel1; public form1() { initializecomponent(); this.panel1 = new system.windows.forms.panel(); this.suspendlayout(); // // panel1 // this.panel1.dock = system.windows.forms.dockstyle.fill; this.panel1.location = new system.drawing.point(0, 0); this.panel1.name = "panel1"; this.panel1.size = new system.drawing.size(292, 273); this.panel1.tabindex = 0; this.controls.add(this.panel1); load += new eventhandler(form1_load); } private void form1_load(object sender, eventargs e) { //string spath = environment.getenvironmentvariable("windir");//获取系统变量 windir(windows) const string appfile = "c:\\program files\\windows nt\\accessories\\wordpad.exe"; insertwindow insertwin = new insertwindow(panel1, appfile); } } }
希望本文所述对大家的c#程序设计有所帮助。