Windows 获取控制台窗口句柄
详细信息
因为多个窗口可能具有相同的标题,您应该更改当前的控制台窗口标题为唯一的标题。这将有助于防止返回不正确的窗口句柄。使用 SetConsoleTitle() 来更改当前的控制台窗口标题。下面是此过程:
- 调用 GetConsoleTitle() 来保存当前的控制台窗口标题。
- 调用 SetConsoleTitle() 来将控制台标题更改为一个唯一的标题。
- 调用 Sleep(40),以确保窗口标题已更新。
- 调用 FindWindow (NULL,uniquetitle),以获取此调用的 HWND 返回 HWND,如果操作失败,则为返回NULL。
- 从步骤 1,若要恢复原始的窗口标题检索的值调用 SetConsoleTitle()。
您应该测试结果的 HWND。例如,您可以测试以查看是否返回的 HWND 对应于当前进程在 HWND 上调用 GetWindowText() 并将结果与 GetConsoleTitle() 进行比较。
不能保证得到的 HWND 适用于所有窗口句柄操作。
示例代码
下面的函数检索当前控制台应用程序的窗口句柄 (HWND)。如果此函数成功,返回值将是控制台窗口的句柄。如果函数失败,则返回值为 NULL。省略一些错误检查,为简洁起见。
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); }