Windows 如何使用AHK确定窗口在屏幕上是否可见?
我正在尝试从此处运行此脚本,但如果窗口顶部边框未接触屏幕顶部,则此脚本不起作用:Windows 如何使用AHK确定窗口在屏幕上是否可见?,windows,autohotkey,Windows,Autohotkey,我正在尝试从此处运行此脚本,但如果窗口顶部边框未接触屏幕顶部,则此脚本不起作用: ^F2:: If(ID:=WinExist(“计算器”)) { Wingtpos,X,Y,ahk_id%id% If(DllCall(“WindowFromPoint”,Int,X+5,Int,Y+5)=ID) MsgBox,计算器在屏幕上 } 回来 由于Windows API中的函数WindowFromPoint使用不正确,因此无法正常工作 它只接受1个参数,而不是传递的2个参数。此函数用于从2到1的正确转换。如
^F2::
If(ID:=WinExist(“计算器”))
{
Wingtpos,X,Y,ahk_id%id%
If(DllCall(“WindowFromPoint”,Int,X+5,Int,Y+5)=ID)
MsgBox,计算器在屏幕上
}
回来
由于Windows API中的函数WindowFromPoint
使用不正确,因此无法正常工作
它只接受1个参数,而不是传递的2个参数。此函数用于从2到1的正确转换。如果您需要:
WindowFromPoint(x,y)
{
可变容量(第8点)
Numput(x,点,0,“int”)
Numput(y,点,4,“int”)
返回DllCall(“WindowFromPoint”,int64,NumGet(POINT,0,int64”))
}
完整示例:
暂停::
窗口标识符=ahk\U类媒体播放器Classicw
Wingtitle,窗口标题,%window\u标识符%
是否可见:=IsWindowVisible(窗口标识符)
如果(是否可见>0){
MsgBox,窗口%Window\u title%可见!
}
否则{
如果(u是否可见<0){
MsgBox,找不到窗口%Window\u标识符%!
}否则
{
MsgBox,窗口%Window\u title%不可见!
}
}
IsWindowVisible(窗口名称){
ID:=WinExist(窗口名称)
如果(错误级别!=0){
;MsgBox,找不到窗口%Window_name%!
返回-1
}
如果(ID>0){
Wingtpos,X,Y,ahk_id%id%
活动窗口id=WindowFromPoint(X,Y)
;MsgBox,%X%,%Y%,%active\u window\u id\u hwnd%
如果(活动窗口id=id){
;MsgBox,窗口%Window_name%可见!
返回1
}
否则{
;MsgBox,窗口%Window_name%不可见!
返回0
}
}
;MsgBox,找不到窗口%Window_name%!
返回-1
}
WindowFromPoint(x,y)
{
可变容量(第8点)
Numput(x,点,0,“int”)
Numput(y,点,4,“int”)
返回DllCall(“WindowFromPoint”,int64,NumGet(POINT,0,int64”))
}
回来
参考资料:
作为检查窗口是否可见的替代方法,您可以随时间比较窗口文本内容,并确定它是否足够 在本例中,我正在检查
媒体播放器家庭影院
窗口的播放时间,以确定是否应按媒体播放/停止
按钮,或聚焦于媒体播放器家庭影院
窗口并按空格
(直接播放/停止):
暂停::
窗口标识符=ahk\U类媒体播放器Classicw
Wingtitle,窗口标题,%window\u标识符%
如果(!窗口标题){
发送{Media\u Play\u Pause}
}
否则{
WinWaitActive,%window\u title%,0.1
_window_focused:=真
if(错误级别){
;MsgBox,WinWait超时。
是否聚焦于窗口:=错误
}
否则{
PlayPauseVideo()
回来
}
计数器:=5
第一个结果:=GetRunningWindowText(窗口标题)
而(计数器>0){
睡吧,200
计数器:=计数器-1
第二个结果:=GetRunningWindowText(窗口标题)
如果(第一个结果!=第二个结果){
PlayPauseVideo()
回来
}
}
如果(是窗口聚焦的){
PlayPauseVideo()
}
否则{
发送{Media\u Play\u Pause}
}
}
GetRunningWindowText(窗口标题){
WinGetText,窗口文本,%window\u标题%
;FoundPos:=RegExMatch(窗口文本,“O”(?:\d\d:)+(?\d\d)”,第一个结果)
FoundPos:=RegExMatch(窗口文本,“O”)绘制:(?\d+),第一个结果)
;Msgbox%first_result.Count()“:“first_result.Name(1)”=“first_result[“frames”]
返回第一个结果[“帧”]
}
PlayPauseVideo(){
;Msgbox,正在运行视频。。。
WinActivate,ahk_类媒体播放器经典
发送{Space}
}
回来
参考资料:
额外的 重写函数中的主代码以实现更大的泛化/重用:
Pause::CheckForPlayerWindow(“ahk_class MediaPlayerClassicW”,
“{Media\u Play\u Pause}”,“{Space}”,“false”)
^!左::checkforplayerWindows(“ahk_class MediaPlayerClassicW”,“{Media_Prev}”,“^p”)
^!右::CheckForPlayerWindow(“ahk_class MediaPlayerClassicW”,“{Media_Next}”,“^n”)
; https://stackoverflow.com/questions/55670223/how-to-determine-whether-a-window
CheckForPlayerWindow(窗口标识符、媒体键、播放器键,被动=真){
Wingtitle,窗口标题,%window\u标识符%
如果(!窗口标题){
发送%media\u密钥
}
else{
WinWaitActive,%window\u title%,0.1
_window_focused:=真
如果(错误级别){
;MsgBox,WinWait超时。
是否聚焦于窗口:=错误
}
否则{
PlayPauseVideo(窗口标识符、播放器键、反应式)
回来
}
计数器:=5
第一个结果:=GetRunningWindowText(窗口标题)
而(计数器>0){
睡吧,200
计数器:=计数器-1
第二个结果:=GetRunningWindowText(窗口标题)
如果(第一个结果!=第二个结果){
PlayPauseVideo(窗口标识符、播放器键、反应式)
回来
}
}
如果(是窗口聚焦的){
PlayPauseVideo(窗口标识符、播放器键、反应式)
}
否则{
发送%media\u密钥
}
}
}
GetRunningWindowText(窗口标题){
WinGetText,窗口文本,%window\u标题%
;FoundPos:=RegExMatch(窗口文本,“O”(?:\d\d:)+(?\d\d)”,第一个结果)
FoundPos:=RegExMatch(窗口文本,“O”)绘制:(?\d+),第一个结果)
;Msgbox%first_result.Count()“:“first_result.Name(1)”=“first_result[“frames”]
返回第一个结果[“帧”]
}
普拉帕