当前位置:编程学习 > C#/ASP.NET >>

老问题:winform嵌套另外的exe程序(别人开发的)

我需要实现在form中嵌套另外的exe程序,参考别人给的程序,现在做的程序有些可以,有些不能。原因很多,没有解决办法,不知道有没有高手研究过这个问题。

参考程序
添加引用:

using System.Diagnostics;

using System.Runtime.InteropServices;

 

定义:

        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;

            }

        }

 

 

调用:

 

 

            this.exeName = @"C:/Program Files/Kingview/Touchvew.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.splitContainer1.Panel2.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 splitContainer1_Panel2_Resize(object sender, EventArgs e)

        {

            if (this.appWin != IntPtr.Zero)

            {

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

            }

            base.OnResize(e);

        }

 

窗口退出时:

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)

        {

            process.Kill();

            // Stop the application

            //if (appWin != IntPtr.Zero)

            //{

 

            //    // Post a colse message

            //    //PostMessage(appWin, WM_CLOSE, 0, 0);

 

            //    // Delay for it to get the message

            //   // System.Threading.Thread.Sleep(1000);

 

            //    // Clear internal handle

            //    appWin = IntPtr.Zero;

 

            //}

 

            //base.FormClosed(e);

 

        }

--------------------编程问答-------------------- 如果把他当成dll来用不知道如何。那样就在自己的进程了。 --------------------编程问答-------------------- 既然是“exe程序”,那你直接调用!用Proccess.Start;它自己自行就行了。。。
--------------------编程问答-------------------- 围观中... ... --------------------编程问答-------------------- 围观。。。。。。。。。[align=center]*****************************
* 本内容使用CSDN 小秘书回复 *
* 每天回帖即可得10分可用分! *
*****************************[/align] --------------------编程问答-------------------- 为啥有的可以,有的不行啊 --------------------编程问答-------------------- 为啥有的可以,有的不行啊
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,