如何处理所有活动监视器



如何获取每个监视器的句柄?我需要知道哪个监视器句柄对应于每个物理监视器。如果我也有每个显示器的位置和编号,我就能找到这个。但我连显示器的把手都拿不动。

我已经读了几十遍EnumDisplayMonitors的文档,但我尝试过的都不起作用。

我试过这样做:

oEnumDisplayMonitors := RegisterCallback("EnumMonitorsProc")
DllCall("EnumDisplayMonitors", "Ptr", 0, "Ptr", 0, "Ptr", oEnumDisplayMonitors, "Ptr", 0)
omh := oEnumDisplayMonitors.monitorHandle
h := oEnumDisplayMonitors.hdc
olpr := oEnumDisplayMonitors.lpRect
EnumMonitorsProc(monitorHandle, hdc, lpRect, lParam){
}

但是EnumMonitorsProc的每个参数的值都为null。

我还尝试了以下内容,以本文中的示例为例:https://www.autohotkey.com/boards/viewtopic.php?f=6&t=4606然而,一旦生成DllCall("EnumDisplayMonitors",…

Monitors := MDMF_Enum("")
For HMON, M In Monitors {
l := M.Left
t := M.Top
h := HMON
}
MDMF_Enum(HMON := "") {
Static EnumProc := RegisterCallback("MDMF_EnumProc")
Static Monitors := {}
If (HMON = "") ; new enumeration
Monitors := {}
If (Monitors.MaxIndex() = "") ; enumerate
DllCall("EnumDisplayMonitors", "Ptr", 0, "Ptr", 0, "Ptr", EnumProc, "Ptr", &Monitors, "UInt")
Return (HMON = "") ? Monitors : Monitors.HasKey(HMON) ? Monitors[HMON] : False
}

我需要所有监视器的句柄,而不仅仅是活动监视器或显示器的句柄。

首先,我们定义将为EnumDisplayMonitors函数提供的回调函数
Callback_Func := RegisterCallback("MONITORENUMPROC")
这可以在不创建不必要的变量的情况下在线完成。

既然我们已经完成了,我们当然还需要创建我们所指的MONITORENUMPROC函数:

MONITORENUMPROC(hMonitor, hDC, pRECT, data)
{
MsgBox, % hMonitor
return true
}

我们只对句柄感兴趣,它是第一个参数。在这个小例子中,我们可以忽略其他一切
我们返回true表示我们希望继续枚举其余的显示监视器,假设有。这是在回调函数的文档中指定的。

好的,我们的回调函数都完成了,现在我们想调用EnumDisplayMonitors函数,并将该回调函数传递给它,这样它就可以完成它的任务了
DllCall("EnumDisplayMonitors", Ptr, 0, Ptr, 0, Ptr, Callback_Func, Ptr, 0)

如果要枚举所有可用的监视器,我们将向前两个参数传递null(AHK中的指针0(,正如文档所建议的那样。

对于第三个参数,我们传递回调函数的指针,该指针存储在Callback_Func变量中。(AHK的RegisterCallback函数返回一个指向我们函数的指针(。

对于第四个参数,我们只是再次传递null,因为在这个小例子中我们不关心它。你可以通过那里传递任何你想要的数据,它会出现在我们用户定义的MONITORENUMPROC函数的第四个参数中(我称之为"data"(
在您正在查看的库中,它们传递一个指向自己的"监视器"对象的指针。这只是一个聪明的方法,使功能具有双重用途。


基本上就是这样。我们为每个监视器的句柄打印一个消息框
它如何工作的最小示例。假设您可能想知道哪个句柄是哪个监视器,那么您可以将句柄转发给另一个函数
例如GetMonitorInfo函数,与您正在查看的库中的函数完全一样。

下面是我为您制作的示例脚本:

Callback_Func := RegisterCallback("MONITORENUMPROC")
DllCall("EnumDisplayMonitors", Ptr, 0, Ptr, 0, Ptr, Callback_Func, Ptr, 0)
MONITORENUMPROC(hMonitor, hDC, pRECT, data)
{
MsgBox, % hMonitor
return true
}

最新更新