Autoit プログラミングWindows 10Windows 11便利機能

Autoit|指定したキーボードのキーのオン・オフを検知し、トレイアイコンを変更

スポンサーリンク

スポンサーリンク
スポンサーリンク
スポンサーリンク

今回は、指定したキーボードのキーのオン・オフを検知して、それに合わせてトレイアイコンを変更するサンプルコードを紹介します。

使用する主な関数:

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

BitAND

ユーザー定義関数

_WinAPI_GetKeyState 関数で指定している「0x14」が Caps Lock の仮想キーコードになります。

仮想キーコードとは:

OS やプログラムがキー入力を識別するための 16進数の数値です。

Caps Lock がオンの場合「1」が返され、Caps Lock がオフの場合は「0」が返されます。

アイコンファイルをダウンロードし、スクリプトと同じ場所に移動して上記のコードを実行してみてください。

ON – OFF アイコン.zip

Caps Lock のオン・オフに連動してアイコンが変更されていますね。

Caps Lock がオフ
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 以外の仮想キーコードでもお試しください。

コメント(降順)

タイトルとURLをコピーしました