5

我正在尝试从 Windows API 获取监控数据。该GetSystemMetrics()命令返回错误的像素宽度。根据微软的网站,这是因为我需要SetProcessDPIAware()

这意味着我最好能够创建一个我不理解的应用程序清单。

在寻找同样低级的替代方案时,我发现了多个显示监视器的功能和结构。我必须通过HMONITOR才能访问我想要的 rect 结构,但获取HMONITOR是我遇到问题的地方。

MonitorFromWindow(hwnd,MONITOR_DEFAULTTOPRIMARY) 此命令超出范围 - 很奇怪,因为GetMonitorInfo()[我需要HMONITOR的] 不会导致任何问题。我已经拥有windows.hwindowsx.h包括在内。我错过了图书馆还是有什么问题?

在单独的说明中,在查看那里之后很明显,使用户可调节使用的显示器也可能很好。 SM_CMONITORS应该返回一个计数,但我想知道如何将这些数字转换为HMONITOR我需要获取监视器特定信息的数据。

::编辑::

我将编辑放在这里是因为“评论”功能没有为我提供足够的空间来放置所请求的代码剪辑

另外,我将 GNU GCC 与 MinGW 一起使用

#include <iostream>//using these libraries
#include <Windowsx.h>
#include <windows.h>

using namespace std;

int main()
{
    //should print screen width in pixels

    LPMONITORINFO target;
        //create a monitor info struct to store the data to
    HMONITOR Hmon = MonitorFromWindow(hwnd,MONITOR_DEFAULTTOPRIMARY);
        //create a handle to the main monitor
        //(should start at top left of screen with (0,0) as apposed to other monitors i believe)
        //if i could gather aditional info on what monitors are available that might be           useful
    GetMonitorInfo(Hmon, target);
        //Get the necessary data and store it to target

    cout << "bottom of selected monitor in pixels: " << target->rcMonitor.bottom
         << "Top of the selected monitor" << target->rcMonitor.top
         << "right extreme of selected monitor" << target->rcMonitor.right
         << "left extreme of selected monitor" << target->rcMonitor.left;

    return 0;
}
4

1 回答 1

9

如果要使用 Windows 95/Windows NT 4 之后出现的功能,则必须在编译前指定 WINVER。

Windows 2000 是WINVER 0x0500,所以需要添加编译行-DWINVER=0x500才能看到MONITOR_DEFAULTTOPRIMARY常量。

您需要分配一个MONITORINFO结构,而不是指向结构的指针MONITORINFO,并初始化该cbSize字段,以便 Windows 知道要填充哪些信息,因此在您的代码中:

MONITORINFO target;
target.cbSize = sizeof(MONITORINFO);

HMONITOR hMon = MonitorFromWindow(GetDesktopWindow(), MONITOR_DEFAULTTOPRIMARY);
GetMonitorInfo(hMon, &target);

然后使用显示:

 target.rcMonitor

代替

target->rcMonitor

使用SetProcessDPIAware(), 是 Windows Vista 的一项功能,因此WINVER需要设置为0x0600,但 MinGW 附带的标头似乎不是 Windows Vista 的完整标头集 - 缺少该函数定义,但存在于 Windows 7 SDK 标头(我手头没有 Windows Vista SDK 来检查它)。

因此,使用清单似乎比使用更新的 API 更简单。

监视器句柄是监视器的不透明表示 - 即您获得的值不应用于其他监视器功能以外的任何内容。如果要遍历监视器结构,则应使用该EnumDisplayMonitors函数和适当的回调例程。

于 2013-02-02T00:14:20.097 回答