获取c ++中所有打开的窗口列表并存储它们

时间:2017-03-03 22:25:06

标签: c++ windows winapi

我目前正在尝试获取所有已打开窗口的列表并将其存储在矢量中。我一直在密切关注代码,以至于解决方案可能非常简单,但我似乎没有全局变量(我想避免)来完成它。

以下是代码:

#include "stdafx.h"
#include "json.h"
#include <algorithm>  

using namespace std;
vector<string> vec;


BOOL CALLBACK speichereFenster(HWND hwnd, LPARAM substring){
    const DWORD TITLE_SIZE = 1024;
    TCHAR windowTitle[TITLE_SIZE];

    GetWindowText(hwnd, windowTitle, TITLE_SIZE);
    int length = ::GetWindowTextLength(hwnd);

    wstring temp(&windowTitle[0]);
    string title(temp.begin(), temp.end());



    if (!IsWindowVisible(hwnd) || length == 0 || title == "Program Manager") {
        return TRUE;
    }

    vec.push_back(title);

    return TRUE;
}

int main() {
    EnumWindows(speichereFenster, NULL);
    cin.get();
    return 0;
}

我想将所有标题存储在向量中,但我不知道如何将该向量传递给函数...

感谢!!!

2 个答案:

答案 0 :(得分:3)

EnumWindows的第二个参数( lParam )记录为:

  

要传递给回调函数的应用程序定义值。

只需将容器传递给API调用:

int main() {
    std::vector<std::wstring> titles;
    EnumWindows(speichereFenster, reinterpret_cast<LPARAM>(&titles));
    // At this point, titles if fully populated and could be displayed, e.g.:
    for ( const auto& title : titles )
        std::wcout << L"Title: " << title << std::endl;
    cin.get();
    return 0;
}

并在回调中使用它:

BOOL CALLBACK speichereFenster(HWND hwnd, LPARAM lParam){
    const DWORD TITLE_SIZE = 1024;
    WCHAR windowTitle[TITLE_SIZE];

    GetWindowTextW(hwnd, windowTitle, TITLE_SIZE);

    int length = ::GetWindowTextLength(hwnd);
    wstring title(&windowTitle[0]);
    if (!IsWindowVisible(hwnd) || length == 0 || title == L"Program Manager") {
        return TRUE;
    }

    // Retrieve the pointer passed into this callback, and re-'type' it.
    // The only way for a C API to pass arbitrary data is by means of a void*.
    std::vector<std::wstring>& titles =
                              *reinterpret_cast<std::vector<std::wstring>*>(lParam);
    titles.push_back(title);

    return TRUE;
}

注意:

  • 展示的代码使用std::wstring代替std::string。这是必要的,以便可以表示整个字符集。
  • 如上所述,代码不正确。有(不可见的)代码路径,没有明确定义的含义。 Windows API严格公开为C接口。因此,它不了解C ++异常。特别是对于回调,永远不要让C ++异常跨越未知的堆栈帧是至关重要的。要修复代码,请应用以下更改:

答案 1 :(得分:1)

简单的代码即可获取所有具有非空标题的可见窗口

for (HWND hwnd = GetTopWindow(NULL); hwnd != NULL; hwnd = GetNextWindow(hwnd, GW_HWNDNEXT))
{   

    if (!IsWindowVisible(hwnd))
        continue;

    int length = GetWindowTextLength(hwnd);
    if (length == 0)
        continue;

    char* title = new char[length+1];
    GetWindowText(hwnd, title, length+1);

    if (title == "Program Manager")
        continue;

    std::cout << "HWND: " << hwnd << " Title: " << title << std::endl;

}