Can you enable NumLock in XNA?

Can I enable NumLock in XNA?

(I'm looking for a solution for XNA. Blocking a number affects input .)

+4
source share
2 answers

You will need P / Invoke SendInput . This is somewhat related:

void ToggleNumLock() { var inputSequence = new INPUT[2]; // one keydown, one keyup = one keypress inputSequence[0].type = 1; // type Keyboard inputSequence[1].type = 1; inputSequence[0].U.wVk = 0x90; // keycode for NumLock inputSequence[1].U.wVk = 0x90; inputSequence[1].U.dwFlags |= KEYEVENTF.KEYUP; var rv = SendInput(2, inputSequence, INPUT.Size); if (rv != 2) { throw new InvalidOperationException("Call to SendInput failed"); } } void EnsureNumLockIsOn() { bool numLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0; if (!numLock) { ToggleNumLock(); } } 

Here are the relevant definitions:

 using System.Runtime.InteropServices; [DllImport("user32.dll")] static extern uint SendInput(UInt32 nInputs, INPUT[] pInputs, int cbSize); [DllImport("user32.dll")] static extern short GetKeyState(int keyCode); [StructLayout(LayoutKind.Sequential)] public struct INPUT { internal uint type; internal KEYBDINPUT U; internal static int Size { get { return Marshal.SizeOf(typeof(INPUT)); } } } [StructLayout(LayoutKind.Sequential)] internal struct KEYBDINPUT { internal short wVk; internal short wScan; internal KEYEVENTF dwFlags; internal int time; internal UIntPtr dwExtraInfo; uint unused1; uint unused2; } [Flags] internal enum KEYEVENTF : uint { EXTENDEDKEY = 0x0001, KEYUP = 0x0002, SCANCODE = 0x0008, UNICODE = 0x0004 } 
+4
source

I do not know if this is what you are looking for, but I found this article.

To find out if Caps Lock, Num Lock or Scroll Lock keys are enabled, we need to use the Win32 API through an unmanaged function call.

Since we will make an unmanaged function call, follow these steps: the statement is fine:

 using System.Runtime.InteropServices; 

The following is the definition of an unmanaged function that we will be using, GetKeyState ():

 // An unmanaged function that retrieves the states of each key [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] public static extern short GetKeyState(int keyCode); // Get they key state and store it as bool bool NumLock = (((ushort)GetKeyState(0x90)) & 0xffff) != 0; 
+2
source

Source: https://habr.com/ru/post/1496072/


All Articles