Jak mogę znaleźć klucze NumLock, CapsLock i ScrollLock w .net?Jak mogę znaleźć stan NumLock, CapsLock i ScrollLock w .net?
Odpowiedz
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ć
W wersji 2.0 i nowszych można użyć funkcja ramy
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);
}
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,
}
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);
}
co jeśli aplikacja nie działa? na przykład, otwierasz okno logowania i chcesz ostrzec użytkownika, że czapki są na –
@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. –
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 –
Jeśli nie używasz WinForms, (konsole na przykład) możesz użyć '(bool) Console.CapsLock'. –