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

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。

 

http://www.cnblogs.com/qiuyi21/articles/1302732.html

你可能感兴趣的:(C#)