窗口是不可见的,但是IsWindow + IsWindowVisible + IsWindowEnabled返回true, GetWindowRect返回可信的值

2022-01-23 00:17:13 标签 windowsapi

我在windows桌面上的所有窗口中进行迭代,以便让残疾患者能够轻松地选择并输入它们。

所有的窗户都在用

hw = GetDesktopWindow()
' It's first child is the 1st top level window
hw = GetWindow(hw, GW_CHILD)
'Now loop through all windows

等。

有许多窗口是不可见的或禁用的,我只是跳过它们,因为用户不应该能够选择它们。反正他也打不进去。

现在我面对着一扇陌生的窗户。

它的名字是“Groove Music”。

它是window Groove音乐应用的一个窗口,我可以在任务管理器中看到它。

我使用以下API调用来检查这是否是一个有效的窗口,用户应该能够选择:

IsWindow
IsWindowEnabled
IsWindowVisible

这些API调用的声明是100%完美的,我已经使用它们很多年了。

最后,我甚至检查它的GetWindowRect值来看看它是否在屏幕上。

然后我甚至检查它是否是一个分层窗口(就像一些应用程序用于不可点击的信息的覆盖):

Public Function IsWindowLayered(ByVal uHwnd As Long) As Boolean
    Dim lret&
    lret = GetWindowLong(uHwnd, GWL_EXSTYLE)
    If (lret And WS_EX_LAYERED) = WS_EX_LAYERED Then
        IsWindowLayered = True
    End If
End Function

它返回false。

有趣的是,窗户实际上是看不见的。

所以用户不应该能够选择它。

我可能错过了哪个函数来检查窗口是否真的可见?

谢谢你!

编辑:这也是计算器窗口(calc。exe)后,我打开它,并再次关闭它。

编辑2:

我也检查WS_VISIBLE像那样,但即使那个窗口返回true:

Public Function IsWindowVisibleEx(ByVal uHwnd As Long) As Boolean
    Dim lret&
    lret = GetWindowLong(uHwnd, GWL_STYLE)
    
    If (lret And WS_VISIBLE) = WS_VISIBLE Then
        IsWindowVisibleEx = True
    End If
End Function

编辑3:taskmanager显示Calculator。exe和Groove的状态为“挂起”。

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码