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#程序设计有所帮助。