モニタに連動してキーボードのバックライトを消す方法
ロジクールの G610 キーボードを使っているのですがPCの電源を切らないので、夜間ディスプレイが消灯してもキーボードが光っててちょっと眩しい…
普通ならキーボードも消えるはずなのでが何故かこのPCでは消えません…
ということでディスプレイの消灯に合わせてバックライトも消灯させるアプリを作ってみました。
ミソはキーボードのバックライトを消す部分とディスプレイの消灯を検出する部分です。
キーボードのバックライトを消す
ロジクールGデベロッパーラボ で LEDイルミネーションSDK が公開されています。
ライブラリは C++ ですが c#、Java、UDK のラッパーがあります。今回は c# の Winform で作ってみました。
基本的にはこんな感じでOKです。簡単ですね。Init()のあとちょっと待たないといけないので実際にはタイマーで保存と消灯を行っています。
// motinor off if (LogitechGSDK.LogiLedInit()){ // (wait here) LogitechGSDK.LogiLedSaveCurrentLighting(); LogitechGSDK.LogiLedSetLighting(0,0,0); } // monitor on LogitechGSDK.LogiLedRestoreLighting(); LogitechGSDK.LogiLedShutdown();
ディスプレイの消灯を検出する
WndProc を override してもそのままでは WM_POWERBROADCAST が来ません。 (32ミリ秒ぐらい悩みました)
RegisterPowerSettingNotification(Handle, ref GUID_CONSOLE_DISPLAY_STATE, DEVICE_NOTIFY_WINDOW_HANDLE);
することで WM_POWERBROADCAST を拾えるようになります。
protected override void WndProc(ref Message m) { const int WM_POWERBROADCAST = 0x0218; const int PBT_POWERSETTINGCHANGE = 0x8013; if (m.Msg == WM_POWERBROADCAST){ if (m.WParam.ToInt32() == PBT_POWERSETTINGCHANGE){ var pbs = (POWERBROADCAST_SETTING)Marshal.PtrToStructure(m.LParam, typeof(POWERBROADCAST_SETTING)); if (pbs.PowerSetting == GUID_CONSOLE_DISPLAY_STATE) { if (pbs.Data == 0){ OnScreenStateChanged(false); }else if (pbs.Data == 1){ OnScreenStateChanged(true); }else{ //DIMM? //OnScreenStateChanged(false); } } } } base.WndProc(ref m); }
DIMMはディスプレイが暗くなった時かな? でも最近暗くなったところを見た記憶がありません。
ソースと実行ファイル
ソースコードは Githubで公開しています。Releaseページ からx64用バイナリをダウンロードすることも出来ます。
キーボードが Logitech Gaming Software か GHUB に認識されている必要があります。(GHUB は古いキーボードに対応していないようです)
G610、G710+ で動作確認しています。カラフルなやつは持ってないので試した方は結果を教えてください。
G710+ は WASD だけ独立して輝度を変えられるのですが復帰時に他のキーと同じ輝度になってしまうようです。
G15 も対応しているはずなのですが手元の環境では消灯しませんでした。