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)
}
}
}
exe运行程序嵌入到自己的winform窗体中 - kingmax_res - iSport
注意:该方法只适用于com的exe(如word,Excel之类),.net的编的exe就不能用这用方法嵌入到窗体中。
意思是要通过点击panel调用外部程序?panel的click事件里加上,system.run("*.exe")应该就可以,是否system.run()我不清楚,类似的方法
你这个要求是做不到的。解决方案是 在PANEL 里自己放一个文本框,改成黑色,然后输入命令,执行时,你Process.Start cmd ,此时CMD窗口不显示,然后,将CMD的返回值,再取出来,设回文本框。
只能这种变 通方式
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)