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

当サイトでは、Windows 10/11 関連の情報、問題解決法やカスタマイズ方法などを紹介しています。皆様にとって、少しでもお役に立てれば幸いです。

コメント(降順)

OSの不具合に関する質問の場合は、明確かつ迅速に解決するために、以下の情報を分かる範囲で質問に含めてください。

1. 使用しているOSのバージョン

  • 例:Windows 10 Home 22H2、Windows 11 Pro 21H2 など

2. 発生している具体的な症状

  • 具体的な症状をできるだけ詳しく説明してください。
  • エラーメッセージが表示される場合は、その内容を正確に記載してください。
  • いつ、どのような操作中に問題が発生したのかを明記してください。

3. 症状が出たのはいつからですか?

  • 症状が出始めた時期をできるだけ具体的に教えてください。

4. 症状が出る前に何か特別な操作をしましたか?

  • 以下のような操作を行った場合は、教えてください。
    • アプリのインストール
    • システムの設定を変更するツールを使用した
    • ファイルの削除
    • レジストリの編集
    • その他

5. 症状が出た後に試したことはありますか?

  • 問題解決のために試したことを分かる範囲でリストアップしてください。
  • インターネットで調べた解決策を試したかどうか、その結果も記載してください。

6. Windows Updateは定期的に行っていますか?

  • 最近インストールした更新プログラムを教えてください。
  • 例:KB5034441

7. セキュリティソフトをご利用されていますか?

  • セキュリティソフトの種類(名称)を教えてください。

8. PCの型番

  • PCの型番がわかれば教えてください。
  • わからない場合は、「デスクトップ」または「ノート」と記入してください。
タイトルとURLをコピーしました