【发布时间】:2016-06-13 22:44:44
【问题描述】:
我正在尝试从 Windows 中的控制台应用程序获取 Chrome 窗口的尺寸,但我似乎无法从 Win32 API 获取它。
这是我到目前为止所做的:
BOOL CALLBACK EnumWindowsProcMy(HWND hwnd,LPARAM lParam)
{
DWORD lpdwProcessId;
GetWindowThreadProcessId(hwnd,&lpdwProcessId);
if(lpdwProcessId==lParam)
{
g_HWND=hwnd;
return FALSE;
}
return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
charArray = "chrome.exe";
// getting process id from name
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE)
{
while (Process32Next(snapshot, &entry) == TRUE)
{
CString strProcessName = entry.szExeFile;
//if (stricmp(entry.szExeFile, charArray) == 0)
if (strProcessName == charArray)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
EnumWindows(EnumWindowsProcMy, entry.th32ProcessID);
// g_HWND now has HWND for the process chrome.exe.
hWindowFromProcess = g_HWND;
int result = 0, result2 = 0;
result = GetWindowRect(g_HWND, &g_Rect);
LONG nWidth = g_Rect.right - g_Rect.left;
LONG nHeight = g_Rect.bottom - g_Rect.top;
CloseHandle(hProcess);
}
}
}
}
当我从 RECT 结构中得到结果时,我不断得到偏离的值。例如,当我在 1920 x 1080 屏幕中完全最大化窗口时,我得到 71 像素的宽度和 16 像素的高度。我还注意到,无论它改变窗口的大小,RECT 的值都保持不变。如果我使用另一个窗口(如 cmd.exe)进行测试,我会得到正确的 RECT 值。
所以我假设浏览器的呈现是由 WinAPI 以外的方法完成的。我看过一些关于使用 javascript 获取浏览器尺寸的文章,但我需要来自 Windows 应用程序的这些信息。
【问题讨论】:
-
您的方法有两个问题。首先,
EnumWindows枚举系统中的所有顶层窗口。 Chrome 可能使用了很多窗口,因此仅选择您找到的第一个窗口并不足以知道它是您想要的窗口。其次,你有没有在 Chrome 运行时查看过任务管理器?它创建了大约 4000 个不同的流程。因此,您不仅可能找到了错误的窗口,而且很可能从错误的进程中找到了错误的窗口。 -
嗨乔纳森,我认为 Process32Next() 确实经历了所有的 Chrome 进程。我检查了浏览器上的 Chrome 任务管理器 (shift-esc),并与浏览器任务管理器中报告的 while 循环中的迭代次数相匹配。 (即,当所有扩展程序都关闭时,2 个进程 + 每个额外选项卡 1 个。)此外,我计算了 Chrome 运行时运行的进程数,以及当它关闭时运行的进程数。
-
显然你没有得到正确的窗口。使用 Spy++ 找到正确的。
标签: c++ windows google-chrome winapi