• C#获取进程的主窗口句柄


    通过调用Win32 API实现。

    public class User32API
    {
        
    private static Hashtable processWnd = null;

        
    public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam);

        
    static User32API()
        
    {
            
    if (processWnd == null)
            
    {
                processWnd 
    = new Hashtable();
            }

        }


        [DllImport(
    "user32.dll", EntryPoint = "EnumWindows", SetLastError = true)]
        
    public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam);

        [DllImport(
    "user32.dll", EntryPoint = "GetParent", SetLastError = true)]
        
    public static extern IntPtr GetParent(IntPtr hWnd);

        [DllImport(
    "user32.dll", EntryPoint = "GetWindowThreadProcessId")]
        
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId);

        [DllImport(
    "user32.dll", EntryPoint = "IsWindow")]
        
    public static extern bool IsWindow(IntPtr hWnd);

        [DllImport(
    "kernel32.dll", EntryPoint = "SetLastError")]
        
    public static extern void SetLastError(uint dwErrCode);

        
    public static IntPtr GetCurrentWindowHandle()
        
    {
            IntPtr ptrWnd 
    = IntPtr.Zero;
            
    uint uiPid = (uint)Process.GetCurrentProcess().Id;  // 当前进程 ID
            object objWnd = processWnd[uiPid];

            
    if (objWnd != null)
            
    {
                ptrWnd 
    = (IntPtr)objWnd;
                
    if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd))  // 从缓存中获取句柄
                {
                    
    return ptrWnd;
                }

                
    else
                
    {
                    ptrWnd 
    = IntPtr.Zero;
                }

            }


            
    bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid);
            
    // 枚举窗口返回 false 并且没有错误号时表明获取成功
            if (!bResult && Marshal.GetLastWin32Error() == 0)
            
    {
                objWnd 
    = processWnd[uiPid];
                
    if (objWnd != null)
                
    {
                    ptrWnd 
    = (IntPtr)objWnd;
                }

            }


            
    return ptrWnd;
        }


        
    private static bool EnumWindowsProc(IntPtr hwnd, uint lParam)
        
    {
            
    uint uiPid = 0;

            
    if (GetParent(hwnd) == IntPtr.Zero)
            
    {
                GetWindowThreadProcessId(hwnd, 
    ref uiPid);
                
    if (uiPid == lParam)    // 找到进程对应的主窗口句柄
                {
                    processWnd[uiPid] 
    = hwnd;   // 把句柄缓存起来
                    SetLastError(0);    // 设置无错误
                    return false;   // 返回 false 以终止枚举窗口
                }

            }


            
    return true;
        }

    }

    调用User32API.GetCurrentWindowHandle()即可返回当前进程的主窗口句柄,如果获取失败则返回IntPtr.Zero。

    --EOF--

  • 相关阅读:
    sublime3 常用快捷键
    sublime3 常用插件
    前端整理——css部分
    JS数组与对象的遍历方法大全
    Javascript 异步加载详解
    五大主流浏览器内核的源起以及国内各大浏览器内核总结
    JavaScript的分支结构(switch,if..else)
    js---作用域,作用域链,立即执行函数,闭包
    js预编译
    利用js实现轮播图
  • 原文地址:https://www.cnblogs.com/lizi/p/2361632.html
Copyright © 2020-2023  润新知