您的位置:首页 > 编程语言 > C#

C#将exe运行程序嵌入到自己的winform窗体中

2012-07-22 23:50 786 查看
以下例子是将Word打开,然后将它嵌入到winform窗体中,效果如下图:







注意:该方法只适用于com的exe(如word,Excel之类),.net的编的exe就不能用这用方法嵌入到窗体中。



using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Diagnostics;

using System.Runtime.InteropServices;

namespace WindowsTest

{

public partial class Form2 : Form

{

Process process = null;

IntPtr appWin;

private string exeName = "";

[DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId", SetLastError = true,

CharSet = CharSet.Unicode, ExactSpelling = true,

CallingConvention = CallingConvention.StdCall)]

private static extern long GetWindowThreadProcessId(long hWnd, long lpdwProcessId);

[DllImport("user32.dll", SetLastError = true)]

private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", SetLastError = true)]

private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

[DllImport("user32.dll", EntryPoint = "GetWindowLongA", SetLastError = true)]

private static extern long GetWindowLong(IntPtr hwnd, int nIndex);

[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]

private static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);

//private static extern int SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);

[DllImport("user32.dll", SetLastError = true)]

private static extern long SetWindowPos(IntPtr hwnd, long hWndInsertAfter, long x, long y, long cx, long cy, long wFlags);

[DllImport("user32.dll", SetLastError = true)]

private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);

[DllImport("user32.dll", EntryPoint = "PostMessageA", SetLastError = true)]

private static extern bool PostMessage(IntPtr hwnd, uint Msg, long wParam, long lParam);



private const int SWP_NOOWNERZORDER = 0x200;

private const int SWP_NOREDRAW = 0x8;

private const int SWP_NOZORDER = 0x4;

private const int SWP_SHOWWINDOW = 0x0040;

private const int WS_EX_MDICHILD = 0x40;

private const int SWP_FRAMECHANGED = 0x20;

private const int SWP_NOACTIVATE = 0x10;

private const int SWP_ASYNCWINDOWPOS = 0x4000;

private const int SWP_NOMOVE = 0x2;

private const int SWP_NOSIZE = 0x1;

private const int GWL_STYLE = (-16);

private const int WS_VISIBLE = 0x10000000;

private const int WM_CLOSE = 0x10;

private const int WS_CHILD = 0x40000000;

public string ExeName

{

get

{

return exeName;

}

set

{

exeName = value;

}

}

public Form2()

{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)

{

this.exeName = @"D:/Program Files/Microsoft Office/OFFICE11/WINWORD.exe";

try

{

// Start the process

process = System.Diagnostics.Process.Start(this.exeName);

// Wait for process to be created and enter idle condition

process.WaitForInputIdle();

// Get the main handle

appWin = process.MainWindowHandle;

}

catch (Exception ex)

{

MessageBox.Show(this, ex.Message, "Error");

}

// Put it into this form

SetParent(appWin, this.Handle);

// Remove border and whatnot

// SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);

// Move the window to overlay it on this window

MoveWindow(appWin, 0, 0, this.Width, this.Height, true);

}

private void Form2_FormClosed(object sender, FormClosedEventArgs e)

{

try

{

process.Kill();

}

catch { }

}

private void Form2_Resize(object sender, EventArgs e)

{

if (this.appWin != IntPtr.Zero)

{

MoveWindow(appWin, 0, 0, this.Width, this.Height, true);

}

//base.OnResize(e);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: