annybaby 发表于 2012-9-15 14:03:38

一个关于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()函数设置过置顶属性,然后取消置顶后,它还会挡住在它后面的激活的窗口
这就是问题的全部~~

liongodmien 发表于 2012-9-15 20:01:53

检查If WinActive($scite) Then条件开关

annybaby 发表于 2012-9-15 21:14:24

回复 2# liongodmien

谢谢回复,开关没有问题,目前还未解决~~

annybaby 发表于 2012-9-15 21:56:17





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

xms77 发表于 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("", "") Then
                WinSetOnTop($Form1, '', 1)
        Else
                WinSetOnTop($Form1, '', 0)
        EndIf
        Sleep(100)
WEnd
回复 1# annybaby
Window7 32bit测试没有问题,代码如上:

annybaby 发表于 2012-9-16 10:28:58

回复 5# xms77


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


liongodmien 发表于 2012-9-16 11:00:50


$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

netegg 发表于 2012-9-16 13:45:11

不用这个做条件
改成
if not(bitand(wingetstate(), 8)) then
WinActive("", "")
   WinSetOnTop($Form1, '', 1)
else
    WinSetOnTop($Form1, '', 0)
endif
试试看

love5173 发表于 2012-9-16 14:17:30

回复 1# annybaby
楼主 激活跟置顶是两个概念
你可以用个小的窗口置顶试试,再点击后面的窗口,虽然小窗口仍然置顶,但是并没有被激活
如果出现了窗口未被激活,但是又有置顶属性的,就不符合你的两种情况。

annybaby 发表于 2012-9-16 14:43:05

回复 8# netegg

感谢关注,不过问题依然没有解决~~{:face (229):}

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

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

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

第二种情况,判断条件改成bitand(wingetstate(''), 8),得到的结果和我原来的方法效果一样,也是要点一下窗口标题部分才行~

annybaby 发表于 2012-9-16 14:48:33

回复 9# love5173

感谢关注~~

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

现在的实际问题并不是出在具有置顶属性窗口上,而是一个窗口被函数winsetontop()设置过置顶,然后取消置顶属性后,它没有表现出"非置顶"属性,即它本身已经没有了置顶属性,但却会挡住另外一个已经激活了的窗口

love5173 发表于 2012-9-16 15:02:18

回复 11# annybaby
额,不好意思没看懂你的问题。你是说代码执行没问题。窗口也确实取消置顶属性了,但是还是挡着别的窗口是么?
这应该难不倒你吧,或许是我理解有问题

netegg 发表于 2012-9-16 15:05:53

本帖最后由 netegg 于 2012-9-16 15:11 编辑

回复 10# annybaby
getstate里跟你要操作的窗口,这个不用我多说了吧,我不知道你到底要操作什么,只能给个函数,具体参数要你自己去定
getstate只是为了获取操作的窗口是否处于激活状态,没有就激活,然后取消置顶,如果已激活,直接取消,这个根本没考虑其它的操作,可能写的过于简单了

annybaby 发表于 2012-9-16 15:14:54

回复 12# love5173

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

是的,代码执行了,并且窗口的确没有了置顶属性,但是却会挡住在它后面的激活了的窗口,就像这图一样,要点一下标题才会显示到最前台
http://www.autoitx.com/attachment.php?aid=MjI4OTV8OTY0YmJhNTV8MTM0Nzc3OTI0MHw5OTdlaGE0dFBxUFVsclBDc0psOWhWbTU3YWVmc01jZW5jbTJRNzI5TXNDTEFldw%3D%3D&noupdate=yes

love5173 发表于 2012-9-16 15:20:22

回复 14# annybaby
这个应该跟windows的显示机制有关系吧!只有刷新后才能正常显示,我觉得这不算是代码的毛病吧!这个可以再设置完属性后再激活一下要激活的窗口就可以了。{:face (396):}
页: [1] 2
查看完整版本: 一个关于winsetontop函数的问题