马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我看百度,有两种方式获取桌面句柄,可是我输出的句柄不同啊 ??
CString str;
HWND hDesktop = ::FindWindow(_T("Progman"), _T("Program Manager"));//获取桌面窗口句柄
str.Format(_T("hDesktop=%d\r\n"), hDesktop);
::OutputDebugString(str);
HWND hWnd = ::GetDesktopWindow();//获取桌面窗口的句柄
str.Format(_T("hWnd=%d\r\n"), hWnd);
::OutputDebugString(str);
根据你提供的代码,在获取桌面窗口句柄的方式上有一些区别。
第一个方法,使用 `FindWindow` 函数查找窗口标题为 “Program Manager” 的窗口句柄。这个方式适用于所有的 Windows 操作系统版本。因为在各个 Windows 版本中,程序管理器窗口都以相同的窗口标题显示。
第二个方法,使用 `GetDesktopWindow` 函数返回当前桌面的句柄。这种方式比较简单,但是只适用于 Windows 2000 及其后续的操作系统版本。
因此,在你的系统中,可能存在多个桌面句柄。例如,在多屏幕环境下,每个屏幕上都有一个桌面。
如果你要对桌面进行操作、或者想对打开的窗口进行分类、聚焦等操作,建议使用函数 `EnumWindows`,遍历所有窗口并查找需要的窗口。
代码示例:
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
TCHAR szTitle[MAX_PATH];
::GetWindowText(hWnd, szTitle, MAX_PATH);
if (_tcslen(szTitle) > 0) //确保窗口标题不为空
{
//执行匹配窗口或其他操作
}
return TRUE; //继续枚举
}
void FindAllWindows()
{
::EnumWindows(EnumWindowsProc, NULL);
}
以上代码可以枚举所有窗口,并在 `EnumWindowsProc` 函数中进行窗口匹配和操作。
|