写了个键盘指示灯判断的悬浮窗,不过有些棘手的问题,请教高手!
本帖最后由 cjb292721 于 2012-8-5 01:11 编辑如题,因为有些笔记本的指示灯不是很全,也不显眼,特别是数字键盘指示灯,一没有了,连有开还是没开都不知道,所以就突发奇想写了这么个程序。
但是出现了如下的问题:
1、当此程序处于激活状态时,无法判断指示灯,所以使用GUISetState(@SW_SHOWNA)让其运行时不激活窗口。
2、处于非激活状态时,开始得按两下指示灯控制键后,第3下之后才正确判断。
3、鼠标点击此程序窗口后(即激活窗口),则前两下按指示灯控制键能正常判断,第3下之后便无法判断指示灯;回到非激活状态时,同样得第3下之后才正确判断。
4、在64位环境下只能判断大小写锁定,其余两个则不行,必须在32位环境下运行。
请高手解决下,源码和图片已经打包在附件里。
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIEx.au3>
#Include <Constants.au3>
#NoTrayIcon
$mainwindow=GUICreate("窗体透明", 189, 32, @DesktopWidth-350, @DesktopHeight-72, BitOR($WS_POPUP,$WS_CLIPSIBLINGS),BitOR($WS_EX_LAYERED,$WS_EX_TOPMOST),WinGetHandle(''))
$Label = GUICtrlCreateLabel("标签", 0, 0, 189, 32,$SS_BLACKFRAME,$GUI_WS_EX_PARENTDRAG)
$Pic = GUICtrlCreatePic("tu.jpg", 0, 0, 189, 32)
$Contextmenu = GUICtrlCreateContextMenu (3)
$infoitem = GUICtrlCreateMenuitem ("退出",$contextmenu)
;数字锁定键检测
If_WinAPI_GetKeyState(0x90) Then
GUICtrlCreatePic("on.gif",13,10,12,12)
Else
GUICtrlCreatePic("off.gif",13,10,12,12)
EndIf
;大小写锁定键检测
If_WinAPI_GetKeyState(0x14) Then
GUICtrlCreatePic("on.gif",70,10,12,12)
Else
GUICtrlCreatePic("off.gif",70,10,12,12)
EndIf
;滚动锁定键检测
If_WinAPI_GetKeyState(0x91) Then
GUICtrlCreatePic("on.gif",128,10,12,12)
Else
GUICtrlCreatePic("off.gif",128,10,12,12)
EndIf
GUISetState(@SW_SHOWNA)
While 1
$NumLock = _WinAPI_GetKeyState(0x90)
$CapsLock = _WinAPI_GetKeyState(0x14)
$ScrollLOCK = _WinAPI_GetKeyState(0x91)
HotKeySet("{NUMLOCK}", "SNUMLOCK")
HotKeySet("{CAPSLOCK}", "SCAPSLOCK")
HotKeySet("{SCROLLLOCK}","SSCROLLLOCK")
$nMsg = GUIGetMsg()
Switch $nMsg
Case $infoitem
Exit
EndSwitch
WEnd
Func SNUMLOCK() ;数字锁定键检测
If $NumLock Then
GUICtrlCreatePic("on.gif",13,10,12,12)
Else
GUICtrlCreatePic("off.gif",13,10,12,12)
EndIf
EndFunc
Func SCAPSLOCK() ;大小写锁定键检测
If $CapsLock Then
GUICtrlCreatePic("on.gif",70,10,12,12)
Else
GUICtrlCreatePic("off.gif",70,10,12,12)
EndIf
EndFunc
Func SSCROLLLOCK() ;滚动锁定键检测
If $ScrollLOCK Then
GUICtrlCreatePic("on.gif",128,10,12,12)
Else
GUICtrlCreatePic("off.gif",128,10,12,12)
EndIf
EndFunc
本帖最后由 haijie1223 于 2012-8-5 09:19 编辑
楼主是不是想要这种效果,就是能实时显示三个键盘灯的状态?
#NoTrayIcon
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIEx.au3>
Global $OnOff =
$mainwindow = GUICreate("窗体透明", 189, 32, @DesktopWidth - 350, @DesktopHeight - 72, BitOR($WS_POPUP, $WS_CLIPSIBLINGS), BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST), WinGetHandle(''))
$Label = GUICtrlCreateLabel("标签", 0, 0, 189, 32, $SS_BLACKFRAME, $GUI_WS_EX_PARENTDRAG)
$Pic = GUICtrlCreatePic("tu.jpg", 0, 0, 189, 32)
$NumStBmp = GUICtrlCreatePic("", 13, 10, 12, 12)
$CapStBmp = GUICtrlCreatePic("", 70, 10, 12, 12)
$ScrStBmp = GUICtrlCreatePic("", 128, 10, 12, 12)
$Contextmenu = GUICtrlCreateContextMenu(3)
$infoitem = GUICtrlCreateMenuItem("退出", $Contextmenu)
GUISetState(@SW_SHOWNA)
AdlibRegister("keyboard")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $infoitem
Exit
EndSwitch
WEnd
Func keyboard()
If $OnOffThen
GUICtrlSetImage($NumStBmp, "on.gif")
Else
GUICtrlSetImage($NumStBmp, "off.gif")
EndIf
If $OnOffThen
GUICtrlSetImage($CapStBmp, "on.gif")
Else
GUICtrlSetImage($CapStBmp, "off.gif")
EndIf
If $OnOffThen
GUICtrlSetImage($ScrStBmp, "on.gif")
Else
GUICtrlSetImage($ScrStBmp, "off.gif")
EndIf
EndFunc ;==>keyboard
回复 2# haijie1223
感谢楼上,这样就没有要按第3下指示灯键才能判断的bug,而且代码也少了很多。不过当此悬浮窗处于激活状态时,同样还是不能检测键盘灯…… 回复 3# cjb292721
与激活状态有什么关系么,我这里激活时一样能检测。。。 回复 4# haijie1223
不清楚啊,很怪,所以运行完GUI后我用了GUISetState(@SW_SHOWNA)使其处于不激活状态。但是鼠标点击悬浮窗后,指示灯键不管怎么按,悬浮窗都没反应。 本帖最后由 cjb292721 于 2012-8-5 14:05 编辑
回复 4# haijie1223
突然发现问题好了,而且还兼容64位,牛人就是不一样,非常感谢。果然来这边提问是正确的,在IT天空那边提问了无果…… 回复haijie1223
突然发现问题好了,而且还兼容64位,牛人就是不一样,非常感谢。果然来这边提问 ...
cjb292721 发表于 2012-8-5 13:58 http://www.autoitx.com/images/common/back.gif
可能是it天空的高手们还没看到你的问题吧。
页:
[1]