Can you turn NumLock on in XNA?

天涯浪子 提交于 2019-12-10 17:07:10

问题


Can you turn NumLock on in XNA?

(I'm looking for a solution to XNA Number lock affects input.)


回答1:


You'll have to P/Invoke SendInput. This is somewhat involved:

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
}



回答2:


I don't know if this is that you are looking for, but I found this article.

In order to know whether or not Caps Lock, Num Lock or Scroll Lock keys are on, we need to make use of the Win32 API through a call to an unmanaged function.

Since we'll make a call to an unmanaged function, the following using statement is in order:

using System.Runtime.InteropServices;

The following is the definition for the unmanaged function we'll 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;


来源:https://stackoverflow.com/questions/18138912/can-you-turn-numlock-on-in-xna

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!