我已經嘗試過這段代碼,它應該獲取所有視窗標題和位置并將它們存盤在向量中(此處列印視窗標題),但輸出似乎完全隨機:
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <vector>
std::vector<LPSTR> buffs;
std::vector<int> rectposs;
BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lParam)
{
LPSTR buff;
if (IsWindowVisible(hWnd))
{
GetWindowTextA(hWnd, buff, 254);
buffs.push_back(buff);
RECT rect;
if (GetWindowRect(hWnd, &rect))
{
rectposs.push_back(rect.left);
rectposs.push_back(rect.right);
rectposs.push_back(rect.top);
rectposs.push_back(rect.bottom);
}
}
return TRUE;
}
int main()
{
EnumWindows(EnumWindowsProc, 0);
for (LPSTR buff : buffs)
{
std::cout << buff << std::endl;
}
return 0;
}
我希望輸出包含像Settings和這樣的行,Alarms and Clock因為我打開了它們,但一切都沿著???$,如果我洗掉第 20-23 行(推回視窗的位置),問題顯然是固定的,這讓我感到困惑,不應該是這樣,因為它與GetWindowTextA我如何保存視窗標題無關。因此,我無法生成最小可重現示例,因為看似無關的代碼似乎完全改變了輸出。
我懷疑這與第 20-23 行覆寫視窗標題有關嗎?如果是這樣或其他情況,我如何確保它不會發生并且仍然擁有我想要的資料?
uj5u.com熱心網友回復:
您的buff變數是一個未初始化的指標,它沒有指向任何有意義的地方。因此,您的呼叫GetWindowTextA()是寫入隨機存盤器。要解決此問題,您需要為其寫入分配實際記憶體。
解決了這個問題后,你又遇到了另一個問題——buffs每次迭代都將相同的指標推入向量中。因此,一旦列舉完成,所有條目都將指向同一個記憶體,該記憶體將保存最后一次呼叫的結果GetWindowTextA()。要解決這個問題,您需要在每次推送時制作資料副本。buff解決這個問題的最簡單方法是將buffs向量更改為保存std::string值而不是LPSTR指標。
最后,我建議更改rectposs向量以保存實際RECT物件而不是單個int值(不過,您應該考慮定義一個新的struct/class來保存您想要的所有視窗資訊,然后使用一個vector來保存該型別的物件)。
嘗試這個:
#include <iostream>
#include <vector>
#include <string>
#include <windows.h>
std::vector<std::string> buffs;
std::vector<RECT> rectposs;
BOOL CALLBACK EnumWindowsProc(HWND hWnd, long lParam)
{
if (IsWindowVisible(hWnd))
{
CHAR buff[255]{};
GetWindowTextA(hWnd, buff, 254);
buffs.push_back(buff);
RECT rect;
GetWindowRect(hWnd, &rect);
rectposs.push_back(rect);
}
return TRUE;
}
int main()
{
EnumWindows(EnumWindowsProc, 0);
for (string& buff : buffs)
{
std::cout << buff << std::endl;
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428311.html
