| C# サンプル集 | 
Visual Basic 中学校 > C# サンプル集 > C# サンプル集目次 >
NumLock を判定する
2023/11/11
→ Visual Basic のサンプルに切り替える → Python のサンプルに切り替える
NumLock を判定する
if (OperatingSystem.IsWindows() && Console.NumberLock)
{
    System.Diagnostics.Debug.WriteLine("NumLockされています。");
}
else
{
    System.Diagnostics.Debug.WriteLine("NumLockされていません。");
}
					
					メモ:この例はWindowsでのみ動作します。Windowsかの確認(OperatingSystem.IsWindows()) を省いてもWindowsでは実行できますが、Linuxなどで実行すると System.PlatformNotSupportedException の例外が発生します。
Windowsフォームアプリの場合、これでもできます。
if (Control.IsKeyLocked(Keys.NumLock))
{
    MessageBox.Show("NumLockされています。");
}
else
{
    MessageBox.Show("NumLockされていません。");
}
WPFの場合、これでもできます。
if (Keyboard.IsKeyToggled(Key.NumLock))
{
    MessageBox.Show("NumLockされています。");
}
else
{
    MessageBox.Show("NumLockされていません。");
}
参考:Windows APIで NumLock を判定する
まず、次のように KeyboardUtilクラスを記述します。
public class KeyboardUtil
{
    [System.Runtime.InteropServices.DllImport("User32.dll")]
    private static extern short GetKeyState(int keyCode);
    ///<summary>
    ///キーボードのNumLockがロック状態を取得します。ロックされている場合 true を返します。
    ///</summary>
    public static bool IsNumLock()
    {
        //144はNumLockキーを表します。
        if ((GetKeyState(144) & 0x8001) != 0)
        {
            return true; //NumLockされています。
        }
        else
        {
            return false; //NumLockされていません。
        }
    }
}
					そして、呼び出したい個所で次のように呼び出します。
if (KeyboardUtil.IsNumLock())
{
    System.Diagnostics.Debug.WriteLine("NumLockされています。");
}
else
{
    System.Diagnostics.Debug.WriteLine("NumLockされていません。");
}
					
					メモ:この例はWindowsでのみ動作します。Linuxなどで実行すると System.DllNotFoundException の例外が発生します。
メモ:0x8001の根拠はSystem.Windows.Forms.Control.IsKeyLockedの実装。私は上位ビットの意味を理解していません。
参考:ロックキーの状態を取得する方法の比較
| 方法 | Consoleクラス | Controlクラス (Windowsフォーム) | Keyboardクラス (WPF) | WindowsAPIの GetKeyState | 
|---|---|---|---|---|
| 使用例 | 使用例 | 使用例 | 使用例 | |
| 判定できるキー | ||||
| NumLock | ○ | ○ | ○ | ○ | 
| CapsLock | ○ | ○ | ○ | ○ | 
| ScrollLock | × | ○ | ○ | ○ | 
| Insert | × | ○ | ○ | ○ | 
| 使用できるアプリケーションの種類 | ||||
| コンソール | ○ | × | × | ○ | 
| Windowsフォーム | ○ | ○ | × | ○ | 
| WPF | ○ | × | ○ | ○ | 
| クラスライブラリ | ○ | × | × | ○ | 
| 使用できるOS | ||||
| Windows | ○ | ○ | ○ | ○ | 
| Windows以外 | × | × | × | × | 
どのような場合でも推奨できる手段の決め手がない状況です。やりたいことによって手段を決定しましょう。
ヒント
- コンソールやクラスライブラリでも、WindowsフォームやWPFを使用できるようにフレームワークを構成すればControlクラスやKeyboardクラスを呼び出せます。→ その方法の例
- WindowsAPIのGetKeyStateは最も汎用性が高い方法ですが、記述量が多いので手軽さがありません。自作のクラスを作って機能を簡単に呼び出せるようにしておけば便利に使用できます。
- Windows以外のOSでキーを判定する方法は不明です。