【问题标题】:Trying to get the height and width of Chrome application window from Windows API?试图从 Windows API 获取 Chrome 应用程序窗口的高度和宽度?
【发布时间】: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


【解决方案1】:

Chrome 使用了几个不可见的窗口,您应该跳过这些窗口。 Chrome窗口有自己的类名"Chrome_WidgetWin_1",可以用来查找窗口(你可以从Spy++工具中找到这个信息)

还要尽量避免使用T 宏和全局变量。下面是一个 Unicode 示例:

int wmain()
{
    HWND hwnd = NULL;
    for (;;)
    {
        hwnd = FindWindowEx(0, hwnd, L"Chrome_WidgetWin_1", 0);
        if (!hwnd) 
            break;

        if (!IsWindowVisible(hwnd))
            continue;                     

        RECT rect;
        GetWindowRect(hwnd, &rect);
        int w = rect.right - rect.left;
        int h = rect.bottom - rect.top;
        cout << w << ", " << h << "\n";
        break;
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2018-10-23
    • 2015-10-31
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多