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

简介: 原文:获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄有时候在c++调用wpf控件的时候,wpf控件想自己显示窗体,但需要设置owner属性。迂回解决办法是设置wpf的window窗体的父窗体为进程的句柄。
原文: 获取当前进程(程序)主窗体句柄并设置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();

 

 

 感谢阅读。

目录
相关文章
|
1月前
|
缓存 负载均衡 安全
在Python中,如何使用多线程或多进程来提高程序的性能?
【2月更文挑战第17天】【2月更文挑战第50篇】在Python中,如何使用多线程或多进程来提高程序的性能?
|
6月前
|
API 调度 C语言
C++实现进程调度模拟程序——哲学家进餐问题
C++实现进程调度模拟程序——哲学家进餐问题
130 0
|
4月前
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
41 1
|
1月前
|
Shell Linux 调度
【Linux】—— 进程程序替换
【Linux】—— 进程程序替换
|
1月前
|
Java Linux Shell
进程的程序替换(exec函数)【Linux】
进程的程序替换(exec函数)【Linux】
|
2月前
|
监控 Unix Linux
socket监控进程,并对程序执行有关操作。
socket监控进程,并对程序执行有关操作。
|
3月前
|
Linux
Linux——进程程序替换
Linux——进程程序替换
|
3月前
|
Linux Shell
Linux进程程序替换
Linux进程程序替换
Linux进程程序替换
|
4月前
|
监控 安全 Java
【python实操】马上毕业了,你还不懂什么是守护线程、线程、进程?(附12306抢票程序-源代码)
【python实操】马上毕业了,你还不懂什么是守护线程、线程、进程?(附12306抢票程序-源代码)
39 0
|
4月前
|
Web App开发 存储 缓存
哇~~真的是你呀!今天是LInux程序与进程操作
进程与程序的区别 程序:静态代码,存储在硬盘等介质中 进程:程序运行后在CPU及内存中运行的动态代码;父进程与子进程;
30 0

相关实验场景

更多