ヘッダー
C# サンプル集
 

ScrollLock を判定する

2024/4/13

→ Visual Basic のサンプルに切り替える → Python のサンプルに切り替える

 

Windowsフォームアプリで ScrollLock を判定する

if (Control.IsKeyLocked(Keys.Scroll))
{
    MessageBox.Show("ScrollLockされています。");
}
else
{
    MessageBox.Show("ScrollLockされていません。");
}

 

 

WPF で ScrollLock を判定する

if (Keyboard.IsKeyToggled(Key.Scroll))
{
    MessageBox.Show("ScrollLockされています。");
}
else
{
    MessageBox.Show("ScrollLockされていません。");
}

 

 

汎用的に ScrollLock を判定する

まず、次のように KeyboardUtilクラスを記述します。

public class KeyboardUtil
{
    [System.Runtime.InteropServices.DllImport("User32.dll")]
    private static extern short GetKeyState(int keyCode);

    ///<summary>
    ///キーボードのScrollLockがロック状態を取得します。ロックされている場合 true を返します。
    ///</summary>
    public static bool IsScrollLock()
    {
        //145はScrollLockキーを表します。
        if ((GetKeyState(145) & 0x8001) != 0)
        {
            return true; //ScrollLockされています。
        }
        else
        {
            return false; //ScrollLockされていません。
        }
    }
}

そして、呼び出したい個所で次のように呼び出します。

if (KeyboardUtil.IsScrollLock())
{
    System.Diagnostics.Debug.WriteLine("ScrollLockされています。");
}
else
{
    System.Diagnostics.Debug.WriteLine("ScrollLockされていません。");
}

Debug.WriteLineが表示される場所

メモ:この例は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でキーを判定する方法は不明です。

 


English