1. 程式人生 > >c# wpf啟動外部exe並嵌入到啟動主視窗中執行

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); 把本視窗控制代碼與目標視窗控制代碼關聯起來