C++使用EnumDisplayMonitors输出所有monitor的hwnd
时间: 2024-10-13 14:12:54 浏览: 6
在C++中,`EnumDisplayMonitors`函数是Windows API的一部分,用于枚举系统显示监视器(显示器)。这个函数主要用于图形应用程序,它返回指定窗口下的所有监视器的信息,包括窗口句柄(HWND)。然而,直接调用该函数通常需要一些底层的MFC(Microsoft Foundation Classes)或WinAPI编程技巧,因为它是非成员函数,不能直接从普通类的对象上调用。
下面是一个简单的示例,展示了如何使用`EnumDisplayMonitors`获取每个监视器的HWND,假设已经包含了一些必要的头文件并创建了`HDC`(设备上下文):
```cpp
#include <windows.h>
#include <iostream>
LRESULT CALLBACK EnumMonitorsProc(HDC hdc, LPCRECT lprcMonitor, HDC hdcTarget, LPARAM dwData) {
// 检查是否成功获取到屏幕信息
if (hdc && lprcMonitor) {
HWND hwnd =
相关问题
C++获取当前所有monitor名字,并修改第二个monitor缩放参数
在C++中,获取计算机上所有显示器的名称并修改某个显示器的缩放比例通常涉及到系统级操作,这需要用到Windows API函数。一个常用的库如`wingdi.h`或`windowsx.h`中的`EnumDisplayMonitors`和`SetProcessDPIAwareness`。
首先,你需要创建一个回调函数(如`CallbackFunction`),这个函数会在遍历每个显示器时被调用,你可以在这个函数中记录显示器的名称和缩放设置。这里是一个基本的步骤:
1. 包含必要的头文件:
```cpp
#include <windows.h>
#include <iostream>
```
2. 定义回调函数:
```cpp
LRESULT CALLBACK CallbackFunction(HDC hdc, LPCRECT lprcClip, HWND hwnd, LPARAM lParam);
```
3. 获取显示器列表并修改指定显示器的缩放:
```cpp
int main() {
MONITORINFOEX monitorInfo;
monitorInfo.cbSize = sizeof(MONITORINFOEX);
std::vector<Monitor> monitors;
if (EnumDisplayMonitors(NULL, NULL, CallbackFunction, 0)) {
for (const Monitor& m : monitors) {
// 根据索引修改第二个显示器的缩放比例
if (m.index == 1) {
SetProcessDPIAwareness(DPI_AWARENESS_CONTEXT_SYSTEM_AWARE); // 设置缩放
// 这里假设GetMonitorInfo得到缩放信息
float desiredScale = ...; // 指定新的缩放比例
ChangeMonitorDpi(m.handle, desiredScale);
}
}
} else {
std::cerr << "Failed to enumerate monitors" << std::endl;
}
return 0;
}
LRESULT CALLBACK CallbackFunction(HDC hdc, LPCRECT lprcClip, HWND hwnd, LPARAM lParam) {
// 在这里记录显示器信息并添加到monitors vector
GetMonitorInfo(hdc, &monitorInfo);
monitors.push_back({monitorInfo.rcMonitor, monitorInfo.szDevice});
return TRUE;
}
```
注意,实际代码中可能还需要处理错误、创建全局变量`Monitor`结构以及定义`ChangeMonitorDpi`函数(可能需要使用`SetDpiScalingFactor`或`SetDpiForWindow`等API)。由于涉及的具体API细节较多,建议查阅官方文档或使用现成的库进行这类高级系统操作。
C++写个完整代码,检索所有显示监视器,输出显示器对应的句柄
在Windows平台上,你可以使用C++的`EnumDisplayMonitors()`函数来检索所有的显示器及其句柄。下面是一个简单的例子,展示了如何遍历并打印显示器的信息:
首先,确保你的程序链接了Windows API库(`windows.h`):
```cpp
#include <windows.h>
#include <tchar.h>
LRESULT CALLBACK EnumDisplayMonitorsProc(HWND hwndParent, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData) {
TCHAR szBuffer[50] = {};
DWORD dwIndex = static_cast<DWORD>(dwData);
// 将句柄转换为字符串
if (GetWindowThreadProcessId(hwndParent, &dwThreadId)) {
wsprintf(szBuffer, L"Monitor %d (PID: %u): ", dwIndex, dwThreadId);
} else {
wsprintf(szBuffer, L"Monitor %d: ", dwIndex);
}
// 打印句柄信息
printf("%sHandle: %p\n", szBuffer, GetWindowDC(hwndParent));
return TRUE; // 继续枚举
}
int main() {
// 获取第一个显示器的句柄
HMONITOR hMonitorFirst = MonitorFromWindow(NULL, MONITOR_DEFAULTTOPRIMARY);
if (hMonitorFirst == NULL) {
printf("Failed to get the first monitor handle.\n");
return 0;
}
DWORD dwCount = 0;
EnumDisplayMonitors(hMonitorFirst, NULL, NULL, (LPARAM)&dwCount, EnumDisplayMonitorsProc);
if (dwCount > 0) {
printf("Found %d monitors:\n", dwCount);
} else {
printf("No monitors found.\n");
}
return 0;
}
```
在这个代码片段中,`EnumDisplayMonitorsProc`是个回调函数,用于处理每个显示器的遍历。`MonitorFromWindow(NULL, MONITOR_DEFAULTTOPRIMARY)`用于获取主显示器的句柄作为开始点。
运行此代码会输出每个显示器的编号、所属进程ID以及句柄。注意,你需要有权限访问这些信息,而且在某些系统上可能会因为权限问题导致部分信息不可见。
阅读全文