gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:16:16 24 4
gpt4 key购买 nike

我目前正在尝试获取所有打开的窗口的列表并将它们存储在一个 vector 中。我一直在查看代码,以至于解决方案可能非常简单,但如果没有全局变量(我想避免),我似乎无法完成它。

代码如下:

#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;
}

我想将所有标题存储在 vector 中,但我不知道该怎么做,因为我无法将 vector 传递给函数...

谢谢!!!

最佳答案

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

An application-defined value to be passed to the callback function.

只需将您的容器传递给 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 接口(interface)。因此,它不理解 C++ 异常。特别是对于回调,永远不要让 C++ 异常穿过未知的堆栈帧是至关重要的。要修复代码,请应用以下更改:

关于c++ - 在 C++ 中获取所有打开窗口的列表并存储它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42589496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com