zoukankan      html  css  js  c++  java
  • 获取当前进程(程序)主窗体句柄并设置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();
    

     感谢阅读。

  • 相关阅读:
    线段树练习两题
    DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)
    线段树和树状数组问题补充
    一些常见的优化:读入优化,滚动数组
    单调队列应用--BZOJ 3831 Little Bird
    单调队列练习之广告印刷
    详解--单调队列 经典滑动窗口问题
    数据结构--栈 codevs 1107 等价表达式
    离散化+线段树 POJ 3277 City Horizon
    求次短路 codevs 1269 匈牙利游戏
  • 原文地址:https://www.cnblogs.com/congqiandehoulai/p/7755617.html
Copyright © 2011-2022 走看看