zoukankan      html  css  js  c++  java
  • 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--

  • 相关阅读:
    python第八课
    python第七课
    python第六课
    python第五课
    Python基础30类-内置函数实现迭代器协议
    Python基础29类-内置函数(__format__,__slots__,__doc__,__module__,__del__,__call__)
    Python基础28类-内置函数(__getattribute__,__getitem__,__setitem__.__delittem__)
    Python基础27类-包装、组合方式授权、判断对象类型的方法
    Python基础26类-内置函数__setattr__,__getattr__,__delattr__
    Python基础25类-反射
  • 原文地址:https://www.cnblogs.com/lizi/p/2361632.html
Copyright © 2011-2022 走看看