C# Sample Programs |
Site Top > C# Sample Programs > C# Sample Programs >
Scroll Lock key detection
04/13/2024
→ Switch to Visual Basic → Switch to Python
TOC
Scroll Lock key detection for Windows from apps
if (Control.IsKeyLocked(Keys.Scroll))
{
MessageBox.Show("Scroll Lock");
}
else
{
MessageBox.Show("No Scroll Lock");
}
Scroll Lock key detection for WPF
if (Keyboard.IsKeyToggled(Key.Scroll))
{
MessageBox.Show("Scroll Lock");
}
else
{
MessageBox.Show("No Scroll Lock");
}
Scroll Lock key detection for any case
First, you have to code KeyboardUtil class as following.
public class KeyboardUtil
{
[System.Runtime.InteropServices.DllImport("User32.dll")]
private static extern short GetKeyState(int keyCode);
///<summary>
///Get whether Scroll Lock key is presses or not. If pressed return true.
///</summary>
public static bool IsScrollLock()
{
//145 means Scroll Lock key
if ((GetKeyState(145) & 0x8001) != 0)
{
return true; //Scroll Lock
}
else
{
return false; //No Scroll Lock
}
}
}
Next, you can use following code to detect scroll lock key.
if (KeyboardUtil.IsScrollLock())
{
System.Diagnostics.Debug.WriteLine("ScrollLock");
}
else
{
System.Diagnostics.Debug.WriteLine("No ScrollLock");
}
→ Where Debug.WriteLine appear
Note: This program will only work on Windows. On Linux, it will raise System.DllNotFoundException.
Note: The basis for 0x8001 is the implementation of System.Windows.Forms.Control.IsKeyLocked. I don't understand the meaning of the high order bits.
Reference:Comparison of how to get the status of the lock key
Console class | Control class (Windows Form) |
Keyboard class (WPF) |
WindowsAPI GetKeyState |
|
---|---|---|---|---|
sample | sample | sample | ||
Target key | ||||
NumLock | ✔ | ✔ | ✔ | ✔ |
CapsLock | ✔ | ✔ | ✔ | ✔ |
ScrollLock | ❌ | ✔ | ✔ | ✔ |
Insert | ❌ | ✔ | ✔ | ✔ |
Supported application type | ||||
Console | ✔ | ❌ | ❌ | ✔ |
Windows Form | ✔ | ✔ | ❌ | ✔ |
WPF | ✔ | ❌ | ✔ | ✔ |
Class Library | ✔ | ❌ | ❌ | ✔ |
Supported OS | ||||
Windows | ✔ | ✔ | ✔ | ✔ |
Others | ❌ | ❌ | ❌ | ❌ |
There is no way to work on all cases. You have to choice the way case by case.
Hint
- You can call Control class and Keyboard class from both Windows Form and WPF with special configuration → how to do it
- Windows API GetKeyState is the most versatile way. But it's tiresome. You can write utility code in your original class library, it will help you.
- It is unclear for me how to determine the key on an OS other than Windows.