C ++ EnumWindows然后执行检查

时间:2014-06-07 17:36:47

标签: c++ winapi

此代码枚举所有窗口。

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才能得到它!

2 个答案:

答案 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将无法工作。