C++ 将显示器上的大数字与MonitorInfo中的szDevice匹配
我正在实现一个应用程序,它可以按用户截取选定的监视器。用户界面的设计与“监视器显示”完全相同 我一直在寻找如何获取大数字,我发现官方不支持这一点,但我在测试EnumDisplayMonitors时发现了一些可能性 Enumertaion回调提供了位于MonitorInfo中的szDevice,该设备与“监视器显示”匹配。ie)szDevice:///DISPLAY1匹配的大数字“1”C++ 将显示器上的大数字与MonitorInfo中的szDevice匹配,c++,winapi,C++,Winapi,我正在实现一个应用程序,它可以按用户截取选定的监视器。用户界面的设计与“监视器显示”完全相同 我一直在寻找如何获取大数字,我发现官方不支持这一点,但我在测试EnumDisplayMonitors时发现了一些可能性 Enumertaion回调提供了位于MonitorInfo中的szDevice,该设备与“监视器显示”匹配。ie)szDevice:///DISPLAY1匹配的大数字“1” 我测试了两台机器,结果总是一样的。我是否可以假定szDevice的这个数字端始终与“监视器显示”的相同?任何帮
我测试了两台机器,结果总是一样的。我是否可以假定szDevice的这个数字端始终与“监视器显示”的相同?任何帮助都将受到感谢。谢谢。您似乎试图复制用于在控制面板屏幕分辨率小程序中排列监视器的显示器,该小程序使用大量数字来识别显示器。这似乎只是将这些监视器作为附加到
MONITORINFOEX
结构的szDevice字段的数字进行枚举的顺序,该结构由GetMonitorInfo()
使用不同的数字返回
在我连接了两个显示器的笔记本电脑上,我们得到了如下所示的UI显示
注意主监视器在中间,有3号。此监视器的左上角将为0,0
下面的程序显示EnumDisplayMonitors
以相同的数字顺序(1、2、3)返回这些监视器:
测试程序(C语言)。我们必须自己跟踪显示索引(在这种情况下,主要功能中的计数器变量:
/* Print out information about the connected monitors
*
* To compile:
* (MSVC++): cl -nologo -W3 -MDd -Zi -Od lsmonitor.c
*/
#define UNICODE
#define _UNICODE
#define WIN32
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#pragma comment(lib, "user32")
static void PrintError(LPCTSTR szPrefix, DWORD dwError);
static BOOL CALLBACK
MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT prcMonitor, LPARAM pData)
{
int *pCounter = (int *)pData;
MONITORINFOEX mi;
mi.cbSize = sizeof(mi);
*pCounter += 1;
_tprintf(_T("%d %p %dx%d+%d+%d"),
*pCounter,
hMonitor,
prcMonitor->left, prcMonitor->top,
prcMonitor->right, prcMonitor->bottom);
if (GetMonitorInfo(hMonitor, (LPMONITORINFO)&mi))
{
_tprintf(_T("%.*s"), CCHDEVICENAME, mi.szDevice);
if (mi.dwFlags == MONITORINFOF_PRIMARY)
_tprintf(_T(" (primary)"));
}
else
{
PrintError(_T("GetMonitorInfo"), GetLastError());
}
_puttchar('\n');
return TRUE;
}
int
_tmain(int argc, TCHAR *argv)
{
HDC hdc = NULL; /* NULL means all screens */
LPRECT prcClip = NULL; /* No clipping */
int counter = 0;
BOOL br = EnumDisplayMonitors(hdc, prcClip, MonitorEnumProc, (LPARAM)&counter);
if (!br)
{
PrintError(_T("EnumDisplayMonitors"), GetLastError());
return 1;
}
}
static void
PrintError(LPCTSTR szPrefix, DWORD dwError)
{
LPTSTR lpsz = NULL;
DWORD cch = 0;
cch = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, dwError, LANG_NEUTRAL,
(LPTSTR)&lpsz, 0, NULL);
if (cch < 1) {
cch = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_STRING
| FORMAT_MESSAGE_ARGUMENT_ARRAY,
"Code 0x%1!08x!",
0, LANG_NEUTRAL, (LPTSTR)&lpsz, 0,
(va_list*)&dwError);
}
_ftprintf(stderr, _T("%s (0x%08x): %s"), szPrefix, dwError, lpsz);
LocalFree((HLOCAL)lpsz);
}
/*打印有关所连接监视器的信息
*
*汇编:
*(MSVC++):cl-nologo-W3-MDd-Zi-odlsmonitor.c
*/
#定义UNICODE
#定义UNICODE
#定义WIN32
#定义严格
#定义WIN32_精益_和_平均值
#包括
#包括
#包括
#pragma注释(lib,“user32”)
静态无效打印错误(LPCTSTR szPrefix,DWORD dwError);
静态布尔回调
监控程序(HMONITOR HMONITOR、HDC hdcMonitor、LPRECT prcMonitor、LPARAM pData)
{
int*pCounter=(int*)pData;
监测信息;
mi.cbSize=sizeof(mi);
*pCounter+=1;
_tprintf(_T(“%d%p%dx%d+%d+%d”),
*pCounter,
hMonitor,
PRC监视器->左侧,PRC监视器->顶部,
PRC监视器->右侧,PRC监视器->底部);
if(GetMonitorInfo(hMonitor,(LPMONITORINFO)&mi))
{
_tprintf(_T(“%s”),CCHDEVICENAME,mi.szDevice);
if(mi.dwFlags==MONITORINFOF_PRIMARY)
_tprintf(_T(“(primary)”);
}
其他的
{
打印错误(_T(“GetMonitorInfo”)、GetLastError();
}
_puttchar('\n');
返回TRUE;
}
int
_tmain(内部argc,TCHAR*argv)
{
HDC HDC=NULL;/*NULL表示所有屏幕*/
LPRECT prcClip=NULL;/*无剪辑*/
int计数器=0;
BOOL br=EnumDisplayMonitors(hdc、prcClip、MonitorEnumProc、(LPRAM)和计数器);
如果(!br)
{
PrintError(_T(“EnumDisplayMonitors”),GetLastError();
返回1;
}
}
静态空隙
打印错误(LPCTSTR szPrefix,DWORD dwError)
{
LPTSTR lpsz=NULL;
DWORD cch=0;
cch=格式化消息(格式化消息分配缓冲区
|格式化来自\u系统的\u消息\u
|格式化\u消息\u忽略\u插入,
NULL,dwError,LANG_中性,
(LPTSTR)和lpsz,0,空);
如果(cch<1){
cch=格式化消息(格式化消息分配缓冲区
|格式化来自字符串的消息
|格式化\u消息\u参数\u数组,
“代码0x%1!08x!”,
0,LANG_空档(LPTSTR)和lpsz,0,
(va_列表*)&dwError);
}
_ftprintf(stderr,_T(“%s(0x%08x):%s”)、szPrefix、dwError、lpsz;
本地自由((本地)lpsz);
}
大数字是什么意思?数字的准确值当然无关紧要。在您的情况下,也不应该有令人信服的理由在实际显示器上显示数字,就像您使用“识别显示器”时的显示小程序一样。无论如何,使用颜色来表示所选的显示器也可以。钉子可以被多种锤子敲打。谢谢!我怀疑枚举顺序是否总是有保证的,是吗?MSDN没有记录订购情况,因此没有保证,但我怀疑在硬件更改之前,它将保持不变。显示卡将被枚举ted是一些顺序(我这里有2个,intel和nvidia),然后对于每个卡,必须枚举附加的监视器。我的1和2在一个卡上,然后主(3)在第二个显示卡上。为了保证您需要匹配设备名称,并使用它们来索引您选择使用的任何编号系统。
/* Print out information about the connected monitors
*
* To compile:
* (MSVC++): cl -nologo -W3 -MDd -Zi -Od lsmonitor.c
*/
#define UNICODE
#define _UNICODE
#define WIN32
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#pragma comment(lib, "user32")
static void PrintError(LPCTSTR szPrefix, DWORD dwError);
static BOOL CALLBACK
MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT prcMonitor, LPARAM pData)
{
int *pCounter = (int *)pData;
MONITORINFOEX mi;
mi.cbSize = sizeof(mi);
*pCounter += 1;
_tprintf(_T("%d %p %dx%d+%d+%d"),
*pCounter,
hMonitor,
prcMonitor->left, prcMonitor->top,
prcMonitor->right, prcMonitor->bottom);
if (GetMonitorInfo(hMonitor, (LPMONITORINFO)&mi))
{
_tprintf(_T("%.*s"), CCHDEVICENAME, mi.szDevice);
if (mi.dwFlags == MONITORINFOF_PRIMARY)
_tprintf(_T(" (primary)"));
}
else
{
PrintError(_T("GetMonitorInfo"), GetLastError());
}
_puttchar('\n');
return TRUE;
}
int
_tmain(int argc, TCHAR *argv)
{
HDC hdc = NULL; /* NULL means all screens */
LPRECT prcClip = NULL; /* No clipping */
int counter = 0;
BOOL br = EnumDisplayMonitors(hdc, prcClip, MonitorEnumProc, (LPARAM)&counter);
if (!br)
{
PrintError(_T("EnumDisplayMonitors"), GetLastError());
return 1;
}
}
static void
PrintError(LPCTSTR szPrefix, DWORD dwError)
{
LPTSTR lpsz = NULL;
DWORD cch = 0;
cch = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, dwError, LANG_NEUTRAL,
(LPTSTR)&lpsz, 0, NULL);
if (cch < 1) {
cch = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_STRING
| FORMAT_MESSAGE_ARGUMENT_ARRAY,
"Code 0x%1!08x!",
0, LANG_NEUTRAL, (LPTSTR)&lpsz, 0,
(va_list*)&dwError);
}
_ftprintf(stderr, _T("%s (0x%08x): %s"), szPrefix, dwError, lpsz);
LocalFree((HLOCAL)lpsz);
}