Можете ли вы включить NumLock в XNA?
Можете ли вы включить NumLock в XNA?
(Я ищу решение для блокировки номера XNA влияет на ввод.)
2 ответа
Вам придется 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 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;