如题
在http://www.codeproject.com/cs/miscctrl/AppControl.asp提供部分解决方案,但它提供的代码在目前测试条件下只能实现.net、vb开发exe程序嵌入.net窗体的某个容器控件中,由于项目需求需要,delphi开发的程序也在此列,但其开发程序不能嵌入容器控件中,查看http://www.codeproject.com/cs/miscctrl/AppControl.asp?df=100&forumid=137160&select=1047633#xx1047633xx及其跟帖,怀疑通过System.Diagnostics.Process.Start取得的hWnd有误,导致WinAPI函数SetParent不能达到要求,请各位帮助解决一下,再次先表示感谢!

解决方案 »

  1.   

    Delphi的MainForm和Application是两个不同的窗体
    通过System.Diagnostics.Process得到的估计是Application的句柄
      

  2.   

    肯定是Application的句柄
    可能把delphi的Application程序,变化成其它类型,如dll,activeform,等
      

  3.   

    //这样看看行不
    using System.Runtime.InteropServices;[DllImport("user32.dll")]
    public static extern IntPtr SetParent(IntPtr hWnd, IntPtr hWndParent);[DllImport("user32.dll")]
    public static extern IntPtr GetWindow(IntPtr hWnd, int uCmd);public const int GW_OWNER = 4;
    public const int GW_CHILD = 5;public delegate bool WNDENUMPROC(IntPtr hwnd, int lParam);[DllImport("user32.dll")]
    public static extern int EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);private IntPtr vMainFormHandle;
    public bool EnumFunc(IntPtr hwnd, int lParam)
    {
        if (GetWindow(hwnd, GW_OWNER) == (IntPtr)lParam)
        {
            vMainFormHandle = hwnd;
            return false;
        }
        return true;
    }private void button1_Click(object sender, EventArgs e)
    {
        System.Diagnostics.Process vProcess = System.Diagnostics.Process.Start(
            @"Project1.exe");
        while (vProcess.MainWindowHandle == IntPtr.Zero) vProcess.Refresh();
        vMainFormHandle = IntPtr.Zero;
        EnumWindows(EnumFunc, (int)vProcess.MainWindowHandle);
        SetParent(vMainFormHandle, Handle);
    }
      

  4.   

    Sorry,这么久才结贴多谢zswang的代码,另外在我测试过程中,使用API函数FindWindow,以指定字符串查找窗口标题获取窗口句柄,此返回的句柄也可以使用,非常感谢!