web-dev-qa-db-ja.com

どうすれば.netでNumLock、CapsLock、ScrollLockの状態を確認できますか?

どうすれば.netでNumLock、CapsLock、ScrollLockキーの状態を確認できますか?

33
RV.

WinAPI関数GetKeyStateをインポートします。

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern short GetKeyState(int keyCode);

そして、あなたはそのようにそれを使うことができます

bool CapsLock = (((ushort)GetKeyState(0x14)) & 0xffff) != 0;
bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0;
bool ScrollLock = (((ushort)GetKeyState(0x91)) & 0xffff) != 0;

編集:上記はフレームワーク1.1、フレームワーク2.0 +のために使用できます

Control.IsKeyLocked

48
Pablo Retyk

Framework 2.0以降では、フレームワーク関数を使用できます

http://msdn.Microsoft.com/en-us/library/system.windows.forms.control.iskeylocked%28v=vs.80%29.aspx

    public static bool NumlockActive()
    {
        return Control.IsKeyLocked(Keys.NumLock);
    }
37
Summer-Time

WPFでの開発中にこのスレッドに遭遇した場合は、.NET 3.0で導入された Keyboard.IsToggled メソッドを使用できます。

var isNumLockToggled = Keyboard.IsKeyToggled(Key.NumLock);
var isCapsLockToggled = Keyboard.IsKeyToggled(Key.CapsLock);
var isScrollLockToggled = Keyboard.IsKeyToggled(Key.Scroll);

次のusingディレクティブをクラスの先頭に追加する必要があります(まだ存在しない場合)。

using System.Windows.Input;

内部的に、 IsToggled() メソッドは KeyStates.Toggled 指定されたキーにフラグが設定されます。

[Flags]
public enum KeyStates : byte
{
    None = (byte) 0,
    Down = (byte) 1,
    Toggled = (byte) 2,
}
15
Grant

状態をチェック

の状態を確認するには CapsLock、 NumLock そして ScrollLock 使用できるキー Control.IsKeyLocked メソッド:

var capsLockIsOn = Control.IsKeyLocked(Keys.CapsLock);

アクティブに状態を表示

フォームのキーボードイベントを処理するアプリケーションにフォーカスがない場合、ロックキーをオンまたはオフにできるため、キーロック状態の変化を検出するには不十分であり、ロジックをアクティベーションイベントなどの他の場所に配置する必要もあります。またはフォームのグローバルキーボードフックを登録する必要があります。

シンプルで信頼できるソリューションとして、そのステータスを Application.Idle イベント。フォームが閉じたときに、アイドルイベントハンドラーをデタッチする必要があります。

public Form1()
{
    InitializeComponent();
    Application.Idle += Application_Idle;
}

void Application_Idle(object sender, EventArgs e)
{
    if (Control.IsKeyLocked(Keys.CapsLock))
        toolStripStatusLabel1.Text = "CapsLock is On";
    else
        toolStripStatusLabel1.Text = "";
}

protected override void OnFormClosed(FormClosedEventArgs e)
{
    Application.Idle -= Application_Idle;
    base.OnFormClosed(e);
}
7
Reza Aghaei