獲取當前進程(程序)主窗體句柄並設置wpf的父窗體為此句柄
阿新 • • 發佈:2017-10-30
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的父窗體為此句柄