Winform嵌入exe程序

 


  1using System;
  2using System.Collections.Generic;
  3using System.ComponentModel;
  4using System.Data;
  5using System.Drawing;
  6using System.Text;
  7using System.Windows.Forms;
  8//先添加如下引用:
  9using System.Diagnostics;
 10using System.Runtime.InteropServices;
 11
 12namespace WindowsApplication1
 13{
 14    public partial class Form1 : Form
 15    {
 16        public Form1()
 17        {
 18            InitializeComponent();
 19        }

 20
 21        #region WIN API---引入系统API,用于把程序打开的窗口整合到SHOW页面中
 22        #region  宏定义
 23        private const int SWP_NOOWNERZORDER = 0x200;
 24        private const int SWP_NOREDRAW = 0x8;
 25        private const int SWP_NOZORDER = 0x4;
 26        private const int SWP_SHOWWINDOW = 0x0040;
 27        private const int WS_EX_MDICHILD = 0x40;
 28        private const int SWP_FRAMECHANGED = 0x20;
 29        private const int SWP_NOACTIVATE = 0x10;
 30        private const int SWP_ASYNCWINDOWPOS = 0x4000;
 31        private const int SWP_NOMOVE = 0x2;
 32        private const int SWP_NOSIZE = 0x1;
 33        private const int GWL_STYLE = (-16);
 34        private const int WS_VISIBLE = 0x10000000;
 35        private const int WM_CLOSE = 0x10;
 36        private const int WS_CHILD = 0x40000000;
 37        #endregion

 38        [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true,
 39             CharSet = CharSet.Unicode, ExactSpelling = true,
 40             CallingConvention = CallingConvention.StdCall)]
 41        private static extern long GetWindowThreadProcessId(long hWnd, long lpdwProcessId);
 42
 43        [DllImport("user32.dll", SetLastError = true)]
 44        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 45
 46        [DllImport("user32.dll", SetLastError = true)]
 47        private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
 48
 49        [DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]
 50        private static extern long GetWindowLong(IntPtr hwnd, int nIndex);
 51
 52        [DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
 53        private static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);
 54        //private static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
 55
 56
 57        [DllImport("user32.dll", SetLastError = true)]
 58        private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags);
 59
 60        [DllImport("user32.dll", SetLastError = true)]
 61        private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
 62
 63        [DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]
 64        private static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);
 65
 66
 67        #endregion

 68
 69        Process process = null;
 70        IntPtr appWin;
 71        private string exeName = "";
 72        //在控件改变大小的时候,调用:
 73        private void splitContainer1_Panel2_Resize(object sender, EventArgs e)
 74        {
 75            if (this.appWin != IntPtr.Zero)
 76            {
 77                MoveWindow(appWin, 00this.splitContainer1.Panel2.Width, this.splitContainer1.Panel2.Height, true);
 78            }

 79            base.OnResize(e);
 80        }

 81
 82        // 3 用Process执行其它程序,传入打开窗口命令,运行进程并放入C#窗口中
 83        private void Form1_Load(object sender, EventArgs e)
 84        {
 85            exeName = @"C:\WINDOWS\system32\notepad.exe";
 86            try
 87            {
 88                // Start the process 
 89                process = System.Diagnostics.Process.Start(this.exeName);
 90
 91                // Wait for process to be created and enter idle condition 
 92                process.WaitForInputIdle();
 93
 94                // Get the main handle
 95                appWin = process.MainWindowHandle;
 96            }

 97            catch (Exception ex)
 98            {
 99                MessageBox.Show(this, ex.Message, "Error");
100            }

101
102            // Put it into this form
103            SetParent(appWin, this.splitContainer1.Panel2.Handle);
104
105            // Remove border and whatnot
106            // SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);
107            // Move the window to overlay it on this window
108            MoveWindow(appWin, 00this.Width, this.Height, true);
109        }

110
111        //窗口退出时:
112        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
113        {
114            if (process != null && !process.HasExited)
115                process.Kill();
116
117          
118        }

119
120
121    }

122}

 

posted @ 2011-08-31 11:07  therockthe  阅读(1091)  评论(0)    收藏  举报