1. 程式人生 > >獲取當前進程(程序)主窗體句柄並設置wpf的父窗體為此句柄

獲取當前進程(程序)主窗體句柄並設置wpf的父窗體為此句柄

imp har class 屬性 urn etc 窗體 ssh intern

有時候在c++調用wpf控件的時候,wpf控件想自己顯示窗體,但需要設置owner屬性。迂回解決辦法是設置wpf的window窗體的父窗體為進程的句柄。

1.獲取當前進程id

 int id = Process.GetCurrentProcess().Id;

2.根據進程id獲取進程主句柄

 public static class ProcessHelper
        {
            private static class Win32
            {
                internal const uint GwOwner = 4;

                internal delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);

                [DllImport("User32.dll", CharSet = CharSet.Auto)]
                internal static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);

                [DllImport("User32.dll", CharSet = CharSet.Auto)]
                internal static extern int GetWindowThreadProcessId(IntPtr hWnd, out IntPtr lpdwProcessId);

                [DllImport("User32.dll", CharSet = CharSet.Auto)]
                internal static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);

                [DllImport("User32.dll", CharSet = CharSet.Auto)]
                internal static extern bool IsWindowVisible(IntPtr hWnd);
            }

            public static IntPtr GetProcessHandle(int processId)
            {
                IntPtr processPtr = IntPtr.Zero;

                Win32.EnumWindows((hWnd, lParam) =>
                {
                    IntPtr pid;
                    Win32.GetWindowThreadProcessId(hWnd, out pid);

                    if (pid == lParam &&
                        Win32.IsWindowVisible(hWnd) &&
                        Win32.GetWindow(hWnd, Win32.GwOwner) == IntPtr.Zero)
                    {
                        processPtr = hWnd;
                        return false;
                    }

                    return true;

                }, new IntPtr(processId));

                return processPtr;
            }
        }

3.設置wpf的window的父窗體為當前進程主窗口句柄,完整代碼如下:

  int id = Process.GetCurrentProcess().Id;
            IntPtr mainPtr = ProcessHelper.GetProcessHandle(id);
            var win = new Window();
            new WindowInteropHelper(win) { Owner = mainPtr }; 
            win.Show();

感謝閱讀。

獲取當前進程(程序)主窗體句柄並設置wpf的父窗體為此句柄