本文实例讲述了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实现嵌入程序窗体的更多相关文章

  1. 通过 WIN32 API 实现嵌入程序窗体

    写了一个不使用 COM, 而是通过 WIN32 API 实现的示例, 它把写字板程序嵌在了自己的一个面板中. 这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做 ...

  2. 重温 Win32 API ----- 截屏指定窗体并打印

    朋友说在一个VC++6.0开发的项目中要增加打印窗体的功能,让帮忙写个代码供其调用. 这么老的IDE当然不想碰了,并且也不喜欢MFC笨拙不清晰的封装.所以决定採用纯Win32 API,然后用C++类简 ...

  3. C# 窗体常用API函数 应用程序窗体查找

    常用的处理窗体的API函数如下(注意:API函数必须放在窗体中...): 使用C#语言,要引用DllImport,必须要添加using System.Runtime.InteropServices命名 ...

  4. MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API(转)

    转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环 ...

  5. VS中空项目、win32项目、控制台程序的区别(转)

    空项目,大多数想单纯创建c++工程的新同学,打开vs后很可能不知道选择创建什么工程,这时候请相信我,空项目是你最好的选择.因为空工程不包含任何的源代码文件,接下来你只需要在相应的源代码文件夹和头文件文 ...

  6. C# 使用Win32 API将1个EXE程序嵌入另1个程序中

    已经干到天快亮了,就不废话直接贴点儿代码吧 ; ; /// <summary> /// 查找窗口 ///第一个参数是窗口的标题,第二个参数可直接用 null ///通过窗口的标题查找对应的 ...

  7. WPF Win32 API 嵌入Form 窗体

    WIn32 API: public class Win32Native { [DllImport("user32.dll", SetLastError = true, CharSe ...

  8. exe程序嵌入Winform窗体

    1.新建winform程序,添加一个Panel控件和一个button控件,winform窗体命名为:Mainform: 2.新建一个类文件,方便引用,命名为:exetowinform: 3.Mainf ...

  9. C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部【转载】

    这是最近在做的一个项目中提到的需求,把一个现有的窗体应用程序界面嵌入到自己开发的窗体中来,看起来就像自己开发的一样(实际上……跟自己开发的还是有一点点区别的,就是内嵌程序和宿主程序的窗口激活状态问题) ...

随机推荐

  1. TWinHTTP

    TWinHTTP USES SynCrtSock procedure hget(const url: string; var ResponseCode: Integer; var ResponseHe ...

  2. 基于指定文本的百度地图poi城市检索的使用(思路最重要)

    (转载请注明出处哦)具体的百度地图权限和apikey配置以及基础地图的配置不叙述,百度地图定位可以看这个链接的http://blog.csdn.net/heweigzf/article/details ...

  3. linux Socket send与recv函数详解

    转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解   1 #include ...

  4. OpenShift应用镜像构建(4) - fabric8-maven-plugin

    适合开发的构建fabric8-maven-plugin 在项目过程中越来越多的出现在开发阶段就需要把部分微服务直接做容器化发布,然后自己的代码还需要和这些发布后的微服务进行调用的开发过程,这个阶段基本 ...

  5. exVim安装

    安装 安装必备 Vim 7.3 or higher. Vundle or Pathogen 下载/更新exVim 注意事项 安装exVim将不会覆盖你已经存在的Vim环境,这个仓库所包含的文件,变化, ...

  6. javascript 获取http头信息

    Javascript中跟response header有关的就两个方法: getResponseHeader 从响应信息中获取指定的http头 语法 strValue = oXMLHttpReques ...

  7. [转]使用VS2010的Database 项目模板统一管理数据库对象

    本文转自:http://www.cnblogs.com/shanyou/archive/2010/05/08/1730810.html Visual Studio 2010 有一个数据库项目模板:Vi ...

  8. 一步一步学RenderMonkey(3)——改良Phong光照模型 【转】

    转载请注明出处: http://blog.csdn.net/tianhai110 改良后的Phong光照模型: 上一节实现的phong镜面光照模型,如果固定光源,移动视点(及matView 关联为ma ...

  9. Solr6.6 IK 中文分词的配置和使用

    1. 首先,下载IKAnalyzer ,下载 2. 将ik的相关文件 拷贝到 webapps\solr\WEB-INF\lib 目录下 或者存放solr-6.6.0\server\solr\test\ ...

  10. hdu1227 Fast Food

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=1227 #include <iostream> #include <cstdio&g ...