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”]
    返回第一个结果[“帧”]
    }
    普拉帕