2009-02-23 9 views

Odpowiedz

42

Importuj WinAPI funkcja GetKeyState

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

i wtedy można go używać jak ten

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

EDIT: powyższe jest dla ram 1.1, dla ram 2.0 + można użyć

Control.IsKeyLocked

+1

Może się mylę, ale czy nie byłoby to możliwe wyłącznie w przypadku wydania Windows? Pierwsza opcja bezpośrednio podłącza się do pliku .dll, podczas gdy druga wymaga System.Windows.Forms –

+0

Jeśli nie używasz WinForms, (konsole na przykład) możesz użyć '(bool) Console.CapsLock'. –

10

Jeśli ktoś napotka tego wątku rozwijając w WPF, można użyć metody Keyboard.IsToggled, który został wprowadzony w .NET 3.0:

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

Będziesz musisz dodać następującą dyrektywę using do najwyższej klasy, jeśli jeszcze jej tam nie ma:

using System.Windows.Input; 

Wewnętrznie metoda IsToggled() sprawdza, czy flaga KeyStates.Toggled jest ustawiona dla określonego klucza.

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

Sprawdź State

Aby sprawdzić stan CapsLock, NumLock i ScrollLock klawiszy można użyć Control.IsKeyLocked metoda:

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

Aktywnie pokazać Sta te

Ponieważ klawisze blokady można włączać lub wyłączać, gdy aplikacja nie obsługuje funkcji skupiania, zdarzenia klawiatury w formularzu nie są wystarczające do wykrycia zmian stanu blokady klawiszy i należy również wprowadzić logikę kilka innych miejsc, takich jak zdarzenie aktywujące formularza lub musisz zarejestrować globalny hak klawiatury.

Jako proste i niezawodne rozwiązanie możesz sprawdzić ich status w wydarzeniu Application.Idle. Po zamknięciu formularza musisz odłączyć nieużywany moduł obsługi zdarzeń.

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); 
} 
+0

co jeśli aplikacja nie działa? na przykład, otwierasz okno logowania i chcesz ostrzec użytkownika, że ​​czapki są na –

+1

@LeandroTupone Kiedy okno logowania pokazuje, oznacza to, że twoja aplikacja jest uruchomiona.Aby sprawdzić stan klucza, kiedy tylko potrzebujesz, możesz użyć pierwszej opcji w odpowiedzi. Aby aktywnie poznać stan, możesz skorzystać z drugiej opcji. –

Powiązane problemy