Windows API MONITORINFO结构

use*_*975 4 c++ winapi

我试图从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;
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*esh 7

如果要使用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);
Run Code Online (Sandbox Code Playgroud)

然后显示使用:

 target.rcMonitor
Run Code Online (Sandbox Code Playgroud)

代替

target->rcMonitor
Run Code Online (Sandbox Code Playgroud)

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

因此,使用清单似乎比拉动更新的API更容易.

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