使用EnumWindows

时间:2016-01-16 06:23:08

标签: c++ windows list pointers winapi

我试图用' Window"填充列表所有活动Windows的对象,但我无法找到在windowList中保存Window信息的方法。 windowList通过lParam参数传递给回调函数。

这是我目前的代码:

std::list <Window> windowList; //in center.h


//in center.cpp:

void Center :: detectWindows()
{
    EnumWindows(detectWindowsProc, (LPARAM)&windowList);
}

BOOL CALLBACK detectWindowsProc(HWND hwnd, LPARAM inputList)
{
    if (IsWindow(hwnd) && IsWindowEnabled(hwnd) && IsWindowVisible(hwnd))
    {
        TCHAR TCharTitle[100];
        GetWindowText(hwnd, TCharTitle, 100);

        std::string title = convertTCharToStr(TCharTitle);

        Window * windowPtr;
        windowPtr = (Window*)inputList;

        Window newWindow((int)hwnd, title, true);
        *windowPtr = newWindow;

        std::cout << (int)hwnd << "  -  " << title << std::endl;
    }
    return true;
}

当我尝试通过for循环打印出windowList中的每个元素时,会弹出一条错误消息,说&#34; Debug Assertion失败!表达式:列表迭代器不兼容&#34;

这是for循环:

void Center::printWindowList()
{
    for (std::list<Window>::iterator it = windowList.begin(); it != windowList.end(); ++it)
        std::cout << ' ' << it->getTitle();
}

希望有人可以提供帮助

1 个答案:

答案 0 :(得分:0)

在您的回调函数中,您将inputList参数视为Window*而不是list<Window>*。试试这个:

BOOL CALLBACK detectWindowsProc(HWND hwnd, LPARAM inputList)
{
    if (IsWindow(hwnd) && IsWindowEnabled(hwnd) && IsWindowVisible(hwnd))
    {
        TCHAR TCharTitle[100];
        GetWindowText(hwnd, TCharTitle, 100);

        std::string title = convertTCharToStr(TCharTitle);

        auto windowPtr = reinterpret_cast<std::list<Window>*>(inputList);
        windowPtr->push_back(Window((int)hwnd, title, true));

        std::cout << (int)hwnd << "  -  " << title << std::endl;
    }
    return true;
}