C#获取进程的主窗口句柄的实现方法
C#获取进程的主窗口句柄的实现方法
发布时间:2016-12-28 来源:查字典编辑
摘要:通过调用Win32API实现。复制代码代码如下:publicclassUser32API{privatestaticHashtablepro...

通过调用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--

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新C#教程学习
热门C#教程学习
编程开发子分类