我目前正在尝试获取所有已打开窗口的列表并将其存储在矢量中。我一直在密切关注代码,以至于解决方案可能非常简单,但我似乎没有全局变量(我想避免)来完成它。
以下是代码:
#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;
}
我想将所有标题存储在向量中,但我不知道如何将该向量传递给函数...
感谢!!!
答案 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
。这是必要的,以便可以表示整个字符集。答案 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;
}