一个关于winsetontop函数的问题
本帖最后由 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()函数设置过置顶属性,然后取消置顶后,它还会挡住在它后面的激活的窗口
这就是问题的全部~~
检查If WinActive($scite) Then条件开关 回复 2# liongodmien
谢谢回复,开关没有问题,目前还未解决~~
其实,对比代码,只第一张图的三个窗口状态就可以看到有问题了~~可惜目前未清楚原因,路过的大侠帮帮忙~~ #include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("form1")
GUISetState()
While 1
$hMsg = GUIGetMsg()
Switch $hMsg
Case -3
Exit
EndSwitch
If WinActive("", "") Then
WinSetOnTop($Form1, '', 1)
Else
WinSetOnTop($Form1, '', 0)
EndIf
Sleep(100)
WEnd
回复 1# annybaby
Window7 32bit测试没有问题,代码如上: 回复 5# xms77
你的代码和我和完全一样,只是sleep()时间有一点长而已,所以效果肯定是一样的,都不行~
$Form1 = GUICreate("form1")
GUISetState()
While 1
If GUIGetMsg() = -3 Then
Exit
Else
If WinActive("") Then
WinSetOnTop($Form1, '', 1)
Else
WinSetOnTop($Form1, '', 0)
EndIf
EndIf
WEnd
;~ 注意/说明
;~ GUIGetMsg
;~ 本函数在执行时将自动按需闲置 CPU 因此您可以放心地在紧凑的循环中使用本函数而不必担心 CPU 的负荷问题.
你的系统可能需要设置一下WINTITLEMATCHMODE 不用这个做条件
改成
if not(bitand(wingetstate(), 8)) then
WinActive("", "")
WinSetOnTop($Form1, '', 1)
else
WinSetOnTop($Form1, '', 0)
endif
试试看 回复 1# annybaby
楼主 激活跟置顶是两个概念
你可以用个小的窗口置顶试试,再点击后面的窗口,虽然小窗口仍然置顶,但是并没有被激活
如果出现了窗口未被激活,但是又有置顶属性的,就不符合你的两种情况。 回复 8# netegg
感谢关注,不过问题依然没有解决~~{:face (229):}
由于你wingetstate()里面漏了参数,我进行了分类测试
首先,我估计你可能是想取当前的任意窗口,那就改成了
not(bitand(wingetstate(''), 8))
但这个条件似乎更不合理,因为取当前任意窗口的话,那么总是返回8,与后面的8按位与,也总是返回8,然后前面不管有没有NOT,$FORM1都是要么都置顶,要么都不置顶,然后我运行代码,证明了这个猜测,
第二种情况,判断条件改成bitand(wingetstate(''), 8),得到的结果和我原来的方法效果一样,也是要点一下窗口标题部分才行~ 回复 9# love5173
感谢关注~~
嗯,是的,激活和置顶是两码事,我知道~~
现在的实际问题并不是出在具有置顶属性窗口上,而是一个窗口被函数winsetontop()设置过置顶,然后取消置顶属性后,它没有表现出"非置顶"属性,即它本身已经没有了置顶属性,但却会挡住另外一个已经激活了的窗口 回复 11# annybaby
额,不好意思没看懂你的问题。你是说代码执行没问题。窗口也确实取消置顶属性了,但是还是挡着别的窗口是么?
这应该难不倒你吧,或许是我理解有问题 本帖最后由 netegg 于 2012-9-16 15:11 编辑
回复 10# annybaby
getstate里跟你要操作的窗口,这个不用我多说了吧,我不知道你到底要操作什么,只能给个函数,具体参数要你自己去定
getstate只是为了获取操作的窗口是否处于激活状态,没有就激活,然后取消置顶,如果已激活,直接取消,这个根本没考虑其它的操作,可能写的过于简单了 回复 12# love5173
是的,代码执行了,并且窗口的确没有了置顶属性,但是却会挡住在它后面的激活了的窗口,就像这图一样
回复 12# love5173
是的,代码执行了,并且窗口的确没有了置顶属性,但是却会挡住在它后面的激活了的窗口,就像这图一样,要点一下标题才会显示到最前台
http://www.autoitx.com/attachment.php?aid=MjI4OTV8OTY0YmJhNTV8MTM0Nzc3OTI0MHw5OTdlaGE0dFBxUFVsclBDc0psOWhWbTU3YWVmc01jZW5jbTJRNzI5TXNDTEFldw%3D%3D&noupdate=yes 回复 14# annybaby
这个应该跟windows的显示机制有关系吧!只有刷新后才能正常显示,我觉得这不算是代码的毛病吧!这个可以再设置完属性后再激活一下要激活的窗口就可以了。{:face (396):}
页:
[1]
2