我试图从Windows API获取监视器数据.该GetSystemMetrics()命令以像素为单位返回错误的宽度.根据微软的网站,这是因为我需要SetProcessDPIAware()
这意味着我最好能够创建一个我不理解的应用程序清单.
在寻找同样低级别的替代方案时,我发现多显示器监视功能和结构.我必须通过HMONITOR访问我想要的rect结构,但得到的HMONITOR是我遇到问题的地方.
MonitorFromWindow(hwnd,MONITOR_DEFAULTTOPRIMARY)
这个命令超出范围 - 奇怪,因为GetMonitorInfo()[我需要HMONITOR]不会导致任何问题.我已经拥有windows.h并windowsx.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)
如果要使用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函数和适当的回调例程.
| 归档时间: |
|
| 查看次数: |
5830 次 |
| 最近记录: |