相关文章推荐
善良的红茶  ·  SQLPrepare 函数 - ODBC ...·  1 周前    · 
朝气蓬勃的面包  ·  Spring ...·  1 年前    · 
心软的芒果  ·  mysql索引 大数据表 ...·  1 年前    · 
霸气的沙滩裤  ·  java - Opencsv ...·  1 年前    · 
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; 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。