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

时间: 2024-11-05 10:02:00

C#通过WIN32 API实现嵌入程序窗体的相关文章

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

写了一个不使用 COM, 而是通过 WIN32 API 实现的示例, 它把写字板程序嵌在了自己的一个面板中. 这么做可能没有实际意义, 因为两个程序之前没有进行有价值的交互, 这里仅仅是为了演示这么做到, 以下是详细注释过的主要源代码. 我把它封装到一个类中: [csharp] view plaincopy using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys

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

常用的处理窗体的API函数如下(注意:API函数必须放在窗体中...): 使用C#语言,要引用DllImport,必须要添加using System.Runtime.InteropServices命名空间 (1)获得当前前台窗体句柄 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern IntPtr GetForegroundWindow(); 返回值类型

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

转自:http://www.cnblogs.com/Yahong111/archive/2007/08/16/857574.html 续上文[翻译]MSIL 教程(一) ,本文继续讲解数组.分支.循环.使用不安全代码和如何调用Win32 API 数组 本程序分配一个int型的数组并给他的元素赋值,然后打印出元素和数组的长度. 命令: newarr type— 生成一个元素类型为type 的数组.数组的大小必须在调用该命令前装入堆栈.该命令会把一个数组的引用装入堆栈. stelem.i4— 给一个

WPF Win32 API 嵌入Form 窗体

WIn32 API: public class Win32Native { [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern uint GetWindowLong(IntPtr hwnd, int nIndex); [System.Runtime.InteropServices.DllImport("user32.dll", Entr

.NET 框架程序使用 Win32 API

.NET 框架程序可以通过静态 DLL 入口点的方式来访问本机代码库.DllImport 属性用于指定包含外部方法的实现的dll 位置.       DllImport 属性定义如下:      namespace System.Runtime.InteropServices   {    [AttributeUsage(AttributeTargets.Method)]    public class DllImportAttribute: System.Attribute    {    p

基本的Windows应用程序 窗体创建

基本的Windows应用程序 转载:http://shiba.hpe.sh.cn/jiaoyanzu/WULI/Article1506 下面是一个完全可以运行的Windows程序,代码很简单,读者通过代码中的注释了解它们的含义.我们将在下一节详细讲解些代码.做为一个练习,我们建议读者在你的开发工具中创建一个工程,手工输入些代码,然后编译运行这个程序.注意,如果你使用的是Visual C++,那么在选择工程类型时必须是“Win32 application project”,而不能是“Win32 c

C语言调用WIN32 API教程之1创建窗口

本学习笔记基于VC++6.0开发环境,通过c语言编程语言,调用win32 API进行windows系统应用程序开发. 1,打开VC++6.0,点击 文件->新建->工程->Win32 Application 工程名填写example1,点击确定,选择 一个空工程,点击完成. 2,点击"新建文件" 按钮,新建一个空白文件,点击 文件->另存为 输入文件名example1.c 选择工作空间对应的文件夹,保存. 3,点击FileView,右击Source File,点

C#调用Win32 api学习总结

从.NET平台调用Win32 API Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微软留给我们直接控制Windows的接口. 一.    基础知识 Win32 API是C语言(注意,不是C++语言,尽管C语言是C++语言的子集)函数集. 1. Win32 API函数放在哪里? Win32 API函数是Windows的核心,比如我们看到的窗体.按钮.对话框什么的,都是依靠Win32函

从.NET平台调用Win32 API

小序        Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微软留给我们直接控制Windows的接口.想玩儿吗?呵呵,太难了.        C#使用非常简单,写程序就像打拱猪,Sorry  -_-! ,搭积木一样简单.想玩儿吗?呵呵,没办法直接控制Windows的核心.        难道就没有两全其美的办法吗?当然不是!要不微软的产品早就没人买了.其实从C#(或者说.NET