获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄

有时候在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();

 

 

 感谢阅读。

转载于:https://www.cnblogs.com/chlm/p/7755617.html

在WinForms应用程序中,你可以使用Win32 API函数来获取当前进程窗口句柄。最常用的函数是`GetForegroundWindow()`,它返回当前前台窗口句柄,通常这个窗口是用户当前与之交互的窗口。如果你需要确保获取的是自己的WinForms应用程序窗口句柄,可以结合进程信息来判断。以下是实现这一功能的基本步骤: 1. 使用`GetCurrentProcessId()`获取当前进程的ID。 2. 使用`GetWindowThreadProcessId()`获取目标窗口进程ID。 3. 比较两个进程ID,如果它们相同,那么这个窗口就是当前进程窗口。 4. 使用`GetForegroundWindow()`获取前台窗口句柄。 示例代码如下(使用C#): ```csharp using System; using System.Runtime.InteropServices; public class WindowHandleFinder { [DllImport("user32.dll")] private static extern IntPtr GetForegroundWindow(); [DllImport("kernel32.dll")] private static extern uint GetCurrentProcessId(); [DllImport("user32.dll")] private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); public IntPtr GetAppForegroundWindowHandle() { uint currentProcessId = GetCurrentProcessId(); IntPtr foregroundWindow = GetForegroundWindow(); uint windowProcessId; GetWindowThreadProcessId(foregroundWindow, out windowProcessId); if (windowProcessId == currentProcessId) { // 这是当前进程窗口句柄 return foregroundWindow; } else { // 不是当前进程窗口 return IntPtr.Zero; } } } ``` 使用此类的`GetAppForegroundWindowHandle`方法将返回当前WinForms应用程序的前台窗口句柄,如果当前前台窗口不属于该应用程序,则返回`IntPtr.Zero`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值