找回密码
 加入
搜索
查看: 10843|回复: 15

[AU3基础] 一个关于winsetontop函数的问题

 火.. [复制链接]
发表于 2012-9-15 14:03:38 | 显示全部楼层 |阅读模式
本帖最后由 annybaby 于 2012-9-16 15:22 编辑

有点问题的代码片段看起来非常简单

If WinActive($scite) Then
                WinSetOnTop($Form1, '', 1)
        Else
                WinSetOnTop($Form1, '', 0)
        EndIf


其中两个变量$scite和$Form1分别是Scite编辑器和要操作的一个窗口的句柄,代码的功能显然也很简单,就是

检测编辑器的窗口$scite是否是激活的,如果是就将$form1"置顶"",否则"取消置顶"

置顶功能总是可以,但是,假如我正在用记事本编辑一个文件,则通过"编辑框"(而不是记事本程序的标题)来激活记事本窗口的话,这时,$Form1窗口并没有按照代码里预想的

取消置顶

即:WinSetOnTop($Form1, '', 0)

见图


为什么呢?





***************************************************************************************************************************

感谢楼下几位朋友的热心帮助,其次一句话说完就是:
一个窗口被winsetontop()函数设置过置顶属性,然后取消置顶后,它还会挡住在它后面的激活的窗口
这就是问题的全部~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-9-15 20:01:53 | 显示全部楼层
检查If WinActive($scite) Then条件开关
 楼主| 发表于 2012-9-15 21:14:24 | 显示全部楼层
回复 2# liongodmien

谢谢回复,开关没有问题,目前还未解决~~
 楼主| 发表于 2012-9-15 21:56:17 | 显示全部楼层




其实,对比代码,只第一张图的三个窗口状态就可以看到有问题了~~可惜目前未清楚原因,路过的大侠帮帮忙~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-9-16 08:50:38 | 显示全部楼层
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("form1")
GUISetState()

While 1
        $hMsg = GUIGetMsg()
        Switch $hMsg
                Case -3
                        Exit
        EndSwitch
        If WinActive("[CLASS:SciTEWindow]", "") Then
                WinSetOnTop($Form1, '', 1)
        Else
                WinSetOnTop($Form1, '', 0)
        EndIf
        Sleep(100)
WEnd
回复 1# annybaby
Window7 32bit测试没有问题,代码如上:
 楼主| 发表于 2012-9-16 10:28:58 | 显示全部楼层
回复 5# xms77


你的代码和我和完全一样,只是sleep()时间有一点长而已,所以效果肯定是一样的,都不行~


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-9-16 11:00:50 | 显示全部楼层
$Form1 = GUICreate("form1")
GUISetState()
 
While 1
        If GUIGetMsg() = -3 Then
                Exit
        Else
                If WinActive("[CLASS:SciTEWindow]") Then
                        WinSetOnTop($Form1, '', 1)
                Else
                        WinSetOnTop($Form1, '', 0)
                EndIf
        EndIf
WEnd


;~         注意/说明
;~         GUIGetMsg
;~         本函数在执行时将自动按需闲置 CPU 因此您可以放心地在紧凑的循环中使用本函数而不必担心 CPU 的负荷问题.
你的系统可能需要设置一下WINTITLEMATCHMODE
发表于 2012-9-16 13:45:11 | 显示全部楼层
不用这个做条件
改成
if not(bitand(wingetstate(), 8)) then
  WinActive("[CLASS:SciTEWindow]", "")
   WinSetOnTop($Form1, '', 1)
else
    WinSetOnTop($Form1, '', 0)
endif
试试看
发表于 2012-9-16 14:17:30 | 显示全部楼层
回复 1# annybaby
楼主 激活跟置顶是两个概念
你可以用个小的窗口置顶试试,再点击后面的窗口,虽然小窗口仍然置顶,但是并没有被激活
如果出现了窗口未被激活,但是又有置顶属性的,就不符合你的两种情况。
 楼主| 发表于 2012-9-16 14:43:05 | 显示全部楼层
回复 8# netegg

感谢关注,不过问题依然没有解决~~

由于你wingetstate()里面漏了参数,我进行了分类测试

首先,我估计你可能是想取当前的任意窗口,那就改成了
not(bitand(wingetstate(''), 8))


但这个条件似乎更不合理,因为取当前任意窗口的话,那么总是返回8,与后面的8按位与,也总是返回8,然后前面不管有没有NOT,$FORM1都是要么都置顶,要么都不置顶,然后我运行代码,证明了这个猜测,

第二种情况,判断条件改成bitand(wingetstate('[CLASS:SciTEWindow]'), 8),得到的结果和我原来的方法效果一样,也是要点一下窗口标题部分才行~
 楼主| 发表于 2012-9-16 14:48:33 | 显示全部楼层
回复 9# love5173

感谢关注~~

嗯,是的,激活和置顶是两码事,我知道~~

现在的实际问题并不是出在具有置顶属性窗口上,而是一个窗口被函数winsetontop()设置过置顶,然后取消置顶属性后,它没有表现出"非置顶"属性,即它本身已经没有了置顶属性,但却会挡住另外一个已经激活了的窗口
发表于 2012-9-16 15:02:18 | 显示全部楼层
回复 11# annybaby
额,不好意思没看懂你的问题。你是说代码执行没问题。窗口也确实取消置顶属性了,但是还是挡着别的窗口是么?
这应该难不倒你吧,或许是我理解有问题
发表于 2012-9-16 15:05:53 | 显示全部楼层
本帖最后由 netegg 于 2012-9-16 15:11 编辑

回复 10# annybaby
getstate里跟你要操作的窗口,这个不用我多说了吧,我不知道你到底要操作什么,只能给个函数,具体参数要你自己去定
getstate只是为了获取操作的窗口是否处于激活状态,没有就激活,然后取消置顶,如果已激活,直接取消,这个根本没考虑其它的操作,可能写的过于简单了
 楼主| 发表于 2012-9-16 15:14:54 | 显示全部楼层
回复 12# love5173

是的,代码执行了,并且窗口的确没有了置顶属性,但是却会挡住在它后面的激活了的窗口,就像这图一样
回复 12# love5173

是的,代码执行了,并且窗口的确没有了置顶属性,但是却会挡住在它后面的激活了的窗口,就像这图一样,要点一下标题才会显示到最前台
发表于 2012-9-16 15:20:22 | 显示全部楼层
回复 14# annybaby
这个应该跟windows的显示机制有关系吧!只有刷新后才能正常显示,我觉得这不算是代码的毛病吧!这个可以再设置完属性后再激活一下要激活的窗口就可以了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 15:14 , Processed in 0.106276 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表