此代码枚举所有窗口。
BOOL CALLBACK enumWindowsProc(
__in HWND hWnd,
__in LPARAM lParam
)
{
int length = ::GetWindowTextLength(hWnd);
if (0 == length) return TRUE;
TCHAR* buffer;
buffer = new TCHAR[length + 1];
memset(buffer, 0, (length + 1) * sizeof(TCHAR));
GetWindowText(hWnd, buffer, length + 1);
tstring windowTitle = tstring(buffer);
string ns(windowTitle.begin(), windowTitle.end());
string ns2 = "WinLister";
const char *cstr = ns.c_str();
const char *cstr2 = ns2.c_str();
delete[] buffer;
wcout << hWnd << TEXT(": ") << cstr << std::endl;
wcout.clear();
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[]) {
wcout << TEXT("All Windows!") << endl;
BOOL enumeratingWindowsSucceeded = ::EnumWindows(enumWindowsProc, NULL);
cin.get();
return 0;
}
我想做的是在enumwindows之后检查是否打开了特定的窗口。 恩。如果窗口WinLister在列表中,那么执行smth。尝试了一些方法,但我不能让它工作!
如何执行检查以查看特定窗口是否已打开?
FindWindow(classname,title)无法找到我想要的特定窗口。只有enumwidnows才能得到它!
答案 0 :(得分:2)
使用lParam
参数将用户定义的值传递给回调,就像指向HWND
变量的指针一样。在枚举期间,如果检测到所需窗口,则回调可以更新该变量的值。枚举完成后,您可以检查变量的值并相应地执行操作。例如:
BOOL CALLBACK FindTheDesiredWnd(HWND hWnd, LPARAM lParam)
{
...
if (hWnd is the one you want)
{
*(reinterpret_cast<HWND*>(lParam)) = hWnd;
return FALSE; // stop enumerating
}
return TRUE; // keep enumerating
}
int _tmain(int argc, _TCHAR* argv[])
{
HWND hFoundWnd = NULL;
::EnumWindows(&FindTheDesiredWnd, reinterpret_cast<LPARAM>(&hFoundWnd));
if (hFoundWnd != NULL)
{
...
}
return 0;
}
答案 1 :(得分:0)
EnumWindows仅枚举顶级窗口。如果您要查找的特定窗口不是顶级窗口(例如,它是对话框),则EnumWindows将无法工作。