找回密码
 加入
搜索
查看: 3891|回复: 6

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

  [复制链接]
发表于 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('[Class:Shell_TrayWnd]'))
$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

本帖子中包含更多资源

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

×
发表于 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[2] = [0, 1]
$mainwindow = GUICreate("窗体透明", 189, 32, @DesktopWidth - 350, @DesktopHeight - 72, BitOR($WS_POPUP, $WS_CLIPSIBLINGS), BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST), WinGetHandle('[Class:Shell_TrayWnd]'))
$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 $OnOff[BitAND(_WinAPI_GetKeyState(0x90), 1)]Then
                GUICtrlSetImage($NumStBmp, "on.gif")
        Else
                GUICtrlSetImage($NumStBmp, "off.gif")
        EndIf
        If $OnOff[BitAND(_WinAPI_GetKeyState(0x14), 1)]Then
                GUICtrlSetImage($CapStBmp, "on.gif")
        Else
                GUICtrlSetImage($CapStBmp, "off.gif")
        EndIf
        If $OnOff[BitAND(_WinAPI_GetKeyState(0x91), 1)]Then
                GUICtrlSetImage($ScrStBmp, "on.gif")
        Else
                GUICtrlSetImage($ScrStBmp, "off.gif")
        EndIf
EndFunc   ;==>keyboard
 楼主| 发表于 2012-8-5 12:18:39 | 显示全部楼层
回复 2# haijie1223


    感谢楼上,这样就没有要按第3下指示灯键才能判断的bug,而且代码也少了很多。不过当此悬浮窗处于激活状态时,同样还是不能检测键盘灯……
发表于 2012-8-5 13:04:36 | 显示全部楼层
回复 3# cjb292721


    与激活状态有什么关系么,我这里激活时一样能检测。。。
 楼主| 发表于 2012-8-5 13:41:01 | 显示全部楼层
回复 4# haijie1223


    不清楚啊,很怪,所以运行完GUI后我用了GUISetState(@SW_SHOWNA)使其处于不激活状态。但是鼠标点击悬浮窗后,指示灯键不管怎么按,悬浮窗都没反应。
 楼主| 发表于 2012-8-5 13:58:41 | 显示全部楼层
本帖最后由 cjb292721 于 2012-8-5 14:05 编辑

回复 4# haijie1223


    突然发现问题好了,而且还兼容64位,牛人就是不一样,非常感谢。果然来这边提问是正确的,在IT天空那边提问了无果……
发表于 2012-8-5 14:07:40 | 显示全部楼层
回复  haijie1223


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



    可能是it天空的高手们还没看到你的问题吧。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

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

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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