如何获取 HWND (控制台窗口)
本文介绍如何获取 HWND (控制台窗口) 。
原始产品版本: Windows Server 2012 R2
原始 KB 编号: 124103
摘要
操作与控制台应用程序关联的窗口可能很有用。 Win32 API 没有提供用于获取与控制台应用程序关联的窗口句柄的直接方法。 但是,可以通过调用来获取窗口句柄 FindWindow()
。 此函数基于类名称或窗口名称检索窗口句柄。
调用 GetConsoleTitle()
以确定当前控制台标题。 然后将当前控制台标题提供给 FindWindow()
。
更多信息
由于多个窗口可能具有相同的标题,因此应该将当前控制台窗口标题更改为唯一的标题。 这有助于防止返回错误的窗口句柄。 用于 SetConsoleTitle()
更改当前控制台窗口标题。 以下是过程:
-
调用
GetConsoleTitle()
以保存当前控制台窗口标题。 -
调用
SetConsoleTitle()
以将控制台标题更改为唯一标题。 -
调用 (40) 以确保窗口标题已更新。
-
调用 (NULL,唯一) ,以获取 HWND,如果操作失败,此调用将返回
FindWindow
HWND 或 NULL。 -
调用
SetConsoleTitle()
从步骤 1 检索到的值,以还原原始窗口标题。
应测试生成的 HWND。 例如,可以通过调用 HWND 并比较结果与结果来测试返回的 HWND 是否与当前进程 GetWindowText()
对应 GetConsoleTitle()
。
生成的 HWND 不能保证适合所有窗口句柄操作。
示例代码
以下函数检索当前控制台应用程序窗口句柄 (HWND) 。 如果函数成功,则返回值是控制台窗口的句柄。 如果函数失败,则返回值为 NULL。 为简洁起见,将省略某些错误检查。
c++复制
HWND GetConsoleHwnd(void)
{
#define MY_BUFSIZE 1024 // Buffer size for console window titles.
HWND hwndFound; // This is what is returned to the caller.
char pszNewWindowTitle[MY_BUFSIZE]; // Contains fabricated
// WindowTitle.
char pszOldWindowTitle[MY_BUFSIZE]; // Contains original
// WindowTitle.
// Fetch current window title.
GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE);
// Format a "unique" NewWindowTitle.
wsprintf(pszNewWindowTitle,"%d/%d",
GetTickCount(),
GetCurrentProcessId());
// Change current window title.
SetConsoleTitle(pszNewWindowTitle);
// Ensure window title has been updated.
Sleep(40);
// Look for NewWindowTitle.
hwndFound=FindWindow(NULL, pszNewWindowTitle);
// Restore original window title.
SetConsoleTitle(pszOldWindowTitle);
return(hwndFound);
}