如何获取每个监视器的句柄?我需要知道哪个监视器句柄对应于每个物理监视器。如果我还有每个显示器的位置和编号,我就可以找到它。但我什至无法拿到显示器的手柄。
我已经阅读了 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){
}
Run Code Online (Sandbox Code Playgroud)
但是 EnumMonitorsProc 的每个参数的值都是 null。
我还按照这篇文章中的示例尝试了以下操作:https://www.autohotkey.com/boards/viewtopic.php?f=6&t=4606 但是,脚本一旦发出 DllCall("枚举显示监视器”,...
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
}
Run Code Online (Sandbox Code Playgroud)
我需要所有显示器的手柄,而不仅仅是活动显示器或主显示器的手柄。
首先,我们定义将为EnumDisplayMonitors函数提供的回调函数。
这也可以在线完成,而无需创建不必要的变量。
Callback_Func := RegisterCallback("MONITORENUMPROC")
现在我们已经做到了,我们当然还需要创建MONITORENUMPROC我们所指的函数:
MONITORENUMPROC(hMonitor, hDC, pRECT, data)
{
MsgBox, % hMonitor
return true
}
Run Code Online (Sandbox Code Playgroud)
我们只对句柄感兴趣,这是第一个参数。我们可以忽略这个小例子中的其他一切。
我们返回 true 表示我们想要继续枚举其余的显示监视器(假设有)。这是在回调函数的文档中指定的。
好的,我们的回调函数就完成了,现在我们要调用 EnumDisplayMonitors 函数并将该回调函数传递给它,以便它可以完成它的任务。
DllCall("EnumDisplayMonitors", Ptr, 0, Ptr, 0, Ptr, Callback_Func, Ptr, 0)
我们正在传递 null(AHK 中的指针 0)传递给前两个参数,如文档所示,如果想要枚举所有可用的监视器。
对于第三个参数,我们传递回调函数的指针,该指针存储在我们的Callback_Func。(AHK 的 RegisterCallback 函数返回一个指向我们函数的指针)。
对于第四个参数,我们再次传递 null,因为在这个小示例中我们不关心它。您可以通过那里传递任何您想要的数据,它会出现在我们的用户定义MONITORENUMPROC函数的第四个参数中(我将其命名为“data”)。
在您正在查看的库中,它们传递一个指向它们自己的“Monitors”对象的指针。这只是他们使该功能具有双重用途的聪明方法。
基本上就是这样。我们为每个监视器的句柄打印一个消息框。
其工作原理的最小示例。假设您可能想知道哪个句柄是哪个监视器,您可以将句柄传递给另一个函数。
如那个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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
553 次 |
| 最近记录: |