今回は、指定したキーボードのキーのオン・オフを検知して、それに合わせてトレイアイコンを変更するサンプルコードを紹介します。
使用する主な関数:
TraySetIcon = 指定されたトレイアイコンをロード/設定します。
_WinAPI_GetKeyState = 指定された仮想キーのステータスを取得します。
BitAND = ビット単位の AND 演算を実行します。
サンプルコードと解説
※サンプルでは Caps Lock キーを指定しています。
_WinAPI_GetKeyState 関数を使用するには、WinAPIEx.au3 をインクルードする必要があります。
TraySetIcon 関数に画像を指定する場合、拡張子「.ico」を指定します。
「.jpg」や「.bmp」などの画像は使用できません。※DLLファイルを指定することも出来ます。
画像ファイルのパスは、スクリプトと同じ場所にあればフルパスを指定しなくても大丈夫です。
#include <WinAPIEx.au3>
While 1
If CapsLockState() Then
TraySetIcon("on.ico")
Else
TraySetIcon(@ScriptDir & "\off.ico")
EndIf
Sleep(250)
WEnd
Func CapsLockState()
Return BitAND(_WinAPI_GetKeyState(0x14), 1)
EndFunc ;==>CapsLockState
_WinAPI_GetKeyState 関数で指定している「0x14」が Caps Lock の仮想キーコードになります。
Caps Lock がオンの場合「1」が返され、Caps Lock がオフの場合は「0」が返されます。
アイコンファイルをダウンロードし、スクリプトと同じ場所に移動して上記のコードを実行してみてください。
Caps Lock のオン・オフに連動してアイコンが変更されていますね。
上記のコード実行して気付いたことはありませんか?
Caps Lock のオン・オフを判断してアイコンを変更していますが、このコードでは何度も TraySetIcon が実行され、トレイアイコンが点滅してしまいます。
If CapsLockState() Then
TraySetIcon("on.ico")
Else
TraySetIcon(@ScriptDir & "\off.ico")
EndIf
そこで条件を追加します。
変数 $ico が「0」ならば~、変数 $ico が「1」ならば~
#include <WinAPIEx.au3>
$ico = 0
While 1
If CapsLockState() Then
If $ico = 0 Then
TraySetIcon(@ScriptDir & "\on.ico")
$ico = 1
EndIf
Else
If $ico = 1 Then
TraySetIcon(@ScriptDir & "\off.ico")
$ico = 0
EndIf
EndIf
Sleep(250)
WEnd
Func CapsLockState()
Return BitAND(_WinAPI_GetKeyState(0x14), 1)
EndFunc ;==>_GetCapsLockState
Caps Lock がオンになれば、変数 $ico の値を確認し、「0」ならばトレイアイコンに「on.ico」をセットし、変数 $ico の値を「1」にします。
これで Caps Lock がオンの間は変数 $ico の値が「1」になっていますので、TraySetIcon(@ScriptDir & “\on.ico”) は最初の一度しか実行されません。
これにより無駄な処理を無くしてトレイアイコンの点滅も無くします。
※ループ中のスリープ時間は、あまり短くすると CPU に負荷がかかります。
これで完成したように見えますが、このコードにはまだ問題があります。
それは、プログラムを起動したときに Caps Lock がオフである場合、アイコンがセットされないことです。
ですので、初めに Caps Lock のオン・オフを判断してアイコンをセットしておきます。
#include <WinAPIEx.au3>
$ico = 0
SetTrayIcon(); 初めに Caps Lock のオン・オフを判断してアイコンをセットする
While 1
; Caps Lockがオンならば
If CapsLockState() Then
If $ico = 0 Then
;トレイアイコンにアイコン "on.ico" をセット
TraySetIcon("on.ico")
$ico = 1
EndIf
; Caps Lockがオフならば
Else
If $ico = 1 Then
;トレイアイコンにアイコン "off.ico" をセット
TraySetIcon("off.ico")
$ico = 0
EndIf
EndIf
Sleep(250)
WEnd
; Caps Lock のオン・オフを判断
Func CapsLockState()
; 「0x14」が Caps Lock の仮想キーコード
Return BitAND(_WinAPI_GetKeyState(0x14), 1)
EndFunc ;==>CapsLockState
Func SetTrayIcon()
If CapsLockState() Then
TraySetIcon("on.ico")
Else
TraySetIcon("off.ico")
EndIf
EndFunc ;==>SetTrayIcon
Caps Lock 以外の仮想キーコードでもお試しください。
コメント(降順)