キーボード LED を制御する (Windows-API 編)

[戻る]

以前キーボードの LED 制御について調査し, それに基づいて メール着信検出プログラムを作り, 以来愛用していました. ところが先日, 仕事で使う PC を新調したところ PS/2 ポートがありません. USB です. 残念ながら従来の方法は USB キーボードには使えませんので, なんとかならないか新たに調査を開始しました.

その結果 こちら の方にそのままずばりの回答がありました. すばらしい. というわけで, ちょっとモディファイして ライブラリ化してみました.

使い方は

#include <stdio.h> 
#include "keyLED.h"

int main(){
  keyboardLED key;

  if (key.OpenDevice()){  // キーボードデバイスを開く
    int m=key.GetToggleStatus(); // 現在のトグル状態を記憶
    for (int i=0;i < 5;i++){
      m |= 1; // Scroll LED を点灯
      key.TurnDevice(m); 
      Sleep(500);
      m &= ~1; // LED を消す
      key.TurnDevice(m); 
      Sleep(500);
    }
    key.TurnDevice(key.GetToggleStatus()); // 点滅状態を戻す
    key.CloseDevice(); // デバイスを閉じる
  }
  return 0;
}
といった感じです. TurnDevice の引数は LED の指定で 1bit 目が Scroll, 2bit 目が Num, 3bit 目が Caps です.

なお, 管理対象は OpenDevice() を実行した時点でつながっていたキーボードすべてです. 複数キーボードをつけてその中の一つのみ制御したいとか, OpenDevice() 後に接続されたキーボードも管理したいという場合は, 適当にソースを書き換えてください. また環境によっては FILE_DEVICE_KEYBOARD とか METHOD_BUFFERED, FILE_ANY_ACCESS 等が定義されてないとか, CTL_CODE がうんたらかんたらと文句 (C2065, C3861) を言うときがあるかもしれません. その際は winioctl.h を適当なところ (sadafx.h とか) で include させればいいはずです.

最後に本ライブラリの取り扱いですがコード自体は上述ページ ほとんどそのままですのでその扱いはその作者 (Gao さん) の意向に 合わせます.


2011.1