C#通过WIN32 API实现嵌入程序窗体
本文实例讲述了C#通过WIN32 API实现嵌入程序窗体的方法,分享给大家供大家参考。具体如下:
这是一个不使用COM,而是通过WIN32 API实现的示例, 它把写字板程序嵌在了自己的一个面板中。
这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做到, 以下是详细注释过的主要源代码。
我们把它封装到一个类中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
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事件中加入详细代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
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#程序设计有所帮助。
http://www.jb51.net/article/55821.htm
C#通过WIN32 API实现嵌入程序窗体的更多相关文章
- 通过 WIN32 API 实现嵌入程序窗体
写了一个不使用 COM, 而是通过 WIN32 API 实现的示例, 它把写字板程序嵌在了自己的一个面板中. 这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做 ...
- 重温 Win32 API ----- 截屏指定窗体并打印
朋友说在一个VC++6.0开发的项目中要增加打印窗体的功能,让帮忙写个代码供其调用. 这么老的IDE当然不想碰了,并且也不喜欢MFC笨拙不清晰的封装.所以决定採用纯Win32 API,然后用C++类简 ...
- C# 窗体常用API函数 应用程序窗体查找
常用的处理窗体的API函数如下(注意:API函数必须放在窗体中...): 使用C#语言,要引用DllImport,必须要添加using System.Runtime.InteropServices命名 ...
- MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)
转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...
- VS中空项目、win32项目、控制台程序的区别(转)
空项目,大多数想单纯创建c++工程的新同学,打开vs后很可能不知道选择创建什么工程,这时候请相信我,空项目是你最好的选择.因为空工程不包含任何的源代码文件,接下来你只需要在相应的源代码文件夹和头文件文 ...
- C# 使用Win32 API将1个EXE程序嵌入另1个程序中
已经干到天快亮了,就不废话直接贴点儿代码吧 ; ; /// <summary> /// 查找窗口 ///第一个参数是窗口的标题,第二个参数可直接用 null ///通过窗口的标题查找对应的 ...
- WPF Win32 API 嵌入Form 窗体
WIn32 API: public class Win32Native { [DllImport("user32.dll", SetLastError = true, CharSe ...
- exe程序嵌入Winform窗体
1.新建winform程序,添加一个Panel控件和一个button控件,winform窗体命名为:Mainform: 2.新建一个类文件,方便引用,命名为:exetowinform: 3.Mainf ...
- C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部【转载】
这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开发的一样(实际上……跟自己开发的还是有一点点区别的,就是内嵌程序和宿主程序的窗口激活状态问题) ...
随机推荐
- Ubuntu 16.04/CentOS 6.9安装Node.js 6.9.5
Ubuntu: CentOS: wget https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-x64.tar.xz tar -xvf node-v6.9. ...
- TCP协议中的重传、慢启动、SACK、窗口的概念
重传机制 慢启动相关的几个状态说明该 SACK机制 窗口在TCP传输机制中的作用
- 【转】Points To Line
原文地址 Python+Arcpy操作Points(.shp)转换至Polyline(.shp),仔细研读Points To Line (Data Management)说明,参数说明如下: Inpu ...
- win7怎么设置1440*900分辨率
右击桌面打开nvidia显卡控制面板显示一栏里面选择更改分辨率如果里面没有你要求的1440*900, 点下面的那个自定义,创建自定义分辨率,水平像素填1440,垂直扫描线填900. 创建完就可以应用了
- JQuery的get、post和ajax方法的使用
在JQuery中可以使用get,post和ajax方法给服务器端传递数据 get方法的使用(customForGet.js文件): function verify(){ //1.获取文本框的数据 // ...
- Boost.Asio c++ 网络编程翻译(21)
同步VS异步 Boost.Asio的作者做了一个非常惊艳的工作:它能够让你在同步和异步中自由选择,从而更好的适应你的应用. 在之前的章节中,我们学习了每种类型应用的框架,比方同步client,同步服务 ...
- Thinkpad 笔记本 装win7 64 位操作系统热键驱动装不上问题解决!
Thinkpad 笔记本 装win7 64 位操作系统热键驱动装不上问题解决! 一般牛人的解释如下: 问题终于搞定.是因为需要手工建%PROGRAMFILES%\Lenovo\Hotkey目录.这个写 ...
- javascript 中用到的时间戳函数
JavaScript 获取当前时间戳:第一种方法: var timestamp = Date.parse(new Date()); 例如结果:1280977330000第二种方法: var times ...
- Office 如何复印身份证正反面到一张纸上
先把身份证任意一面放到打印机扫描的一侧(不要放到正中间) 正面扫描复印好之后,身份证翻面,还放在原来的位置 纸张拿出来之后,把已经有图案的放在上面,空白的留在下面,接着扫描 最后效果如下 ...
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何在初始化的时候写入参数
最常见的是定义一个全局变量,然后跟对应的变量绑定,比如我定义了一个SINT型的变量ControlWord 数值是8,定义好之后编译一下,可以发现PLC程序中或多出来这个变量(MAIN.ControlW ...