c# wpf啟動外部exe並嵌入到啟動主視窗中執行
本文主要介紹通過c#來啟動外部exe(第三方軟體)並嵌入到主視窗執行,在自己的應用程式中執行
一、啟動外部exe相對簡單
IntPtr hcalc; //用以儲存目標視窗控制代碼
ProcessStartInfo ps = new ProcessStartInfo();
ps.FileName = Environment.ExpandEnvironmentVariables(exePath); //exePath要啟動的外部應用程式路徑
ps.WorkingDirectory = @"" ; //指定工作目錄以確定相對路徑
Process proc = Process.Start(ps);
new Thread(new ThreadStart(() =>
{
while (hcalc == IntPtr.Zero) //迴圈目標視窗啟動完成
{
Thread.Sleep(10);
hcalc = FindWindow(null, "發現目標視窗");
SetParent(hcalc, hpanel1);
//SendMessage(hcalc, WM_SYSCOMMAND, SC_MINIMIZE, 0);
}
})).Start();
二、嵌入到啟動敞口中執行 需要呼叫windows API
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); //主要用於發現外部軟體視窗的控制代碼
[DllImport("user32.dll", SetLastError = true)]
private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent); //該api用於嵌入到視窗中執行
[DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam); //對外部軟體視窗傳送一些訊息(如 視窗最大化、最小化等)
const int WM_SYSCOMMAND = 0x0112;
const int SC_CLOSE = 0xF060;
const int SC_MINIMIZE = 0xF020;
const int SC_MAXIMIZE = 0xF030;
public const uint WM_LBUTTONDOWN = 0x0201;
public const uint WM_LBUTTONUP = 0x0202;
const int BM_CLICK = 0xF5;
IntPtr hcalc = FindWindow(null, "外部視窗名稱"); 發現外部視窗控制代碼
System.Windows.Forms.Panel p = new System.Windows.Forms.Panel();
WindowsFormsHost host = new WindowsFormsHost();
host.Child = p;
addDp.Content = host; //addDp通常表示一個容器控制元件 這裡表示DevExpress.Xpf.Docking.DocumentPanel
IntPtr hpanel1 = p.Handle;
SetParent(hcalc, hpanel1); 把本視窗控制代碼與目標視窗控制代碼關聯起來