كيف يمكنني العثور على حالة numlock، capslock و scrolllock في .NET؟

StackOverflow https://stackoverflow.com/questions/577411

  •  05-09-2019
  •  | 
  •  

سؤال

كيف يمكنني العثور على حالة Numlock، Capslock و Scrolllock مفاتيح .NET؟

هل كانت مفيدة؟

المحلول

استيراد وظيفة 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;

تحرير: ما سبق هو Framework 1.1، لإطار 2.0 + يمكنك استخدامه

Control.IsKeyLocked

نصائح أخرى

مع الإطار 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);
    }

إذا جاء أي شخص عبر هذا الموضوع أثناء التطور في WPF، يمكنك استخدام لوحة المفاتيح.يسوغيد الطريقة التي تم تقديمها في .NET 3.0:

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,
}

تحقق حالة

للتحقق من حالة Caps Lock, 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);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top