cjb292721 发表于 2012-8-5 00:47:13

写了个键盘指示灯判断的悬浮窗,不过有些棘手的问题,请教高手!

本帖最后由 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:16:20

本帖最后由 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

cjb292721 发表于 2012-8-5 12:18:39

回复 2# haijie1223


    感谢楼上,这样就没有要按第3下指示灯键才能判断的bug,而且代码也少了很多。不过当此悬浮窗处于激活状态时,同样还是不能检测键盘灯……

haijie1223 发表于 2012-8-5 13:04:36

回复 3# cjb292721


    与激活状态有什么关系么,我这里激活时一样能检测。。。

cjb292721 发表于 2012-8-5 13:41:01

回复 4# haijie1223


    不清楚啊,很怪,所以运行完GUI后我用了GUISetState(@SW_SHOWNA)使其处于不激活状态。但是鼠标点击悬浮窗后,指示灯键不管怎么按,悬浮窗都没反应。

cjb292721 发表于 2012-8-5 13:58:41

本帖最后由 cjb292721 于 2012-8-5 14:05 编辑

回复 4# haijie1223


    突然发现问题好了,而且还兼容64位,牛人就是不一样,非常感谢。果然来这边提问是正确的,在IT天空那边提问了无果……

haijie1223 发表于 2012-8-5 14:07:40

回复haijie1223


    突然发现问题好了,而且还兼容64位,牛人就是不一样,非常感谢。果然来这边提问 ...
cjb292721 发表于 2012-8-5 13:58 http://www.autoitx.com/images/common/back.gif


    可能是it天空的高手们还没看到你的问题吧。
页: [1]
查看完整版本: 写了个键盘指示灯判断的悬浮窗,不过有些棘手的问题,请教高手!