C#通过WIN32 API实现嵌入程序窗体
本文实例讲述了C#通过WIN32API实现嵌入程序窗体的方法,分享给大家供大家参考。具体如下:
这是一个不使用COM,而是通过WIN32API实现的示例,它把写字板程序嵌在了自己的一个面板中。
这么做可能没有实际意义,因为两个程序之前没有进行有价值的交互,这里仅仅是为了演示这么做到,以下是详细注释过的主要源代码。
我们把它封装到一个类中:
usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Diagnostics; usingSystem.Runtime.InteropServices; usingSystem.Windows.Forms; namespaceSystem.Windows.Forms { classInsertWindow { ///<summary> ///将程序嵌入窗体 ///</summary> ///<paramname="pW">容器</param> ///<paramname="appname">程序名</param> publicInsertWindow(PanelpW,stringappname) { this.pan=pW; this.LoadEvent(appname); pane(); } ~InsertWindow() { if(m_innerProcess!=null) { m_innerProcess.Dispose(); } } #region函数和变量声明 /* *声明Win32API */ [DllImport("user32.dll")] staticexternIntPtrSetParent(IntPtrhWndChild, IntPtrhWndNewParent ); [DllImport("user32.dll")] staticexternInt32GetWindowLong(IntPtrhWnd, Int32nIndex ); [DllImport("user32.dll")] staticexternInt32SetWindowLong(IntPtrhWnd, Int32nIndex, Int32dwNewLong ); [DllImport("user32.dll")] staticexternInt32SetWindowPos(IntPtrhWnd, IntPtrhWndInsertAfter, Int32X, Int32Y, Int32cx, Int32cy, UInt32uFlags ); /* *定义Win32常数 */ constInt32GWL_STYLE=-16; constInt32WS_BORDER=(Int32)0x00800000L; constInt32WS_THICKFRAME=(Int32)0x00040000L; constInt32SWP_NOMOVE=0x0002; constInt32SWP_NOSIZE=0x0001; constInt32SWP_NOZORDER=0x0004; constInt32SWP_FRAMECHANGED=0x0020; constInt32SW_MAXIMIZE=3; IntPtrHWND_NOTOPMOST=newIntPtr(-2); //目标应用程序的进程. Processm_innerProcess=null; #endregion #region容器 privatePanelpan=null; publicPanelpanel1 { set{pan=value;} get{returnpan;} } privatevoidpane() { panel1.Anchor=AnchorStyles.Left|AnchorStyles.Top| AnchorStyles.Right|AnchorStyles.Bottom; panel1.Resize+=newEventHandler(panel1_Resize); } privatevoidpanel1_Resize(objectsender,EventArgse) { //设置目标应用程序的窗体样式. IntPtrinnerWnd=m_innerProcess.MainWindowHandle; SetWindowPos(innerWnd,IntPtr.Zero,0,0, panel1.ClientSize.Width,panel1.ClientSize.Height, SWP_NOZORDER); } #endregion #region相应事件 privatevoidLoadEvent(stringappFile) { //启动目标应用程序. m_innerProcess=Process.Start(appFile); m_innerProcess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;//隐藏 //等待,直到那个程序已经完全启动. m_innerProcess.WaitForInputIdle(); //目标应用程序的主窗体. IntPtrinnerWnd=m_innerProcess.MainWindowHandle; //设置目标应用程序的主窗体的父亲(为我们的窗体). SetParent(innerWnd,panel1.Handle); //除去窗体边框. Int32wndStyle=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事件中加入详细代码如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Windows.Forms; usingSystem.Runtime; usingSystem.Runtime.InteropServices; usingSystem.Diagnostics; namespace将程序窗口嵌入到任务栏中 { publicpartialclassForm1:Form { privateSystem.Windows.Forms.Panelpanel1; publicForm1() { InitializeComponent(); this.panel1=newSystem.Windows.Forms.Panel(); this.SuspendLayout(); // //panel1 // this.panel1.Dock=System.Windows.Forms.DockStyle.Fill; this.panel1.Location=newSystem.Drawing.Point(0,0); this.panel1.Name="panel1"; this.panel1.Size=newSystem.Drawing.Size(292,273); this.panel1.TabIndex=0; this.Controls.Add(this.panel1); Load+=newEventHandler(Form1_Load); } privatevoidForm1_Load(objectsender,EventArgse) { //stringsPath=Environment.GetEnvironmentVariable("windir");//获取系统变量windir(windows) conststringappFile= "C:\\ProgramFiles\\WindowsNT\\Accessories\\wordpad.exe"; InsertWindowinsertwin=newInsertWindow(panel1,appFile); } } }
希望本文所述对大家的C#程序设计有所帮助。