你能在XNA上打开NumLock吗?

你能在XNA上打开NumLock吗?

(我正在寻找XNA数字锁定影响输入的解决方案。)

你必须P / Invoke SendInput 。 这有点涉及:

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(); } } 

以下是相关定义:

 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 } 

我不知道你是否正在寻找这个,但我找到了这篇文章 。

为了知道Caps Lock,Num Lock或Scroll Lock键是否打开,我们需要通过调用非托管函数来使用Win32 API。

由于我们将调用非托管函数,因此以下using语句按顺序排列:

 using System.Runtime.InteropServices; 

以下是我们将使用的非托管函数的定义,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;