在 C# 中保持数字锁定关闭

Jon*_*zer 0 c# keyboard

我想将数字锁定按钮用于数字锁定以外的其他用途。所以基本上我想在按下数字锁定键时关闭它并保持关闭状态。我可以捕获按钮按下的情况,但它仍然会打开/关闭。我总是想把它关掉。有什么建议么?

不确定为什么有人想知道为什么我想这样做,但原因如下:我有一个蓝牙数字键盘,我想用它来控制机器。这是否证明了这个问题的合理性?

经过几个小时的研究,我发现了以下代码,它达到了目的:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

class SetNumlockKeyOn
{
    [StructLayout(LayoutKind.Sequential)]
    public struct INPUT
    {
        internal int type;
        internal short wVk;
        internal short wScan;
        internal int dwFlags;
        internal int time;
        internal IntPtr dwExtraInfo;
        int dummy1;
        int dummy2;
        internal int type1;
        internal short wVk1;
        internal short wScan1;
        internal int dwFlags1;
        internal int time1;
        internal IntPtr dwExtraInfo1;
        int dummy3;
        int dummy4;
    }
    [DllImport("user32.dll")]
    static extern int SendInput(uint nInputs, IntPtr pInputs, int cbSize);

    public static void SetNumlockOn()
    {
        if (Control.IsKeyLocked(Keys.NumLock)) return;
        const int mouseInpSize = 28;//Hardcoded size of the MOUSEINPUT tag !!!
        INPUT input = new INPUT();
        input.type = 0x01; //INPUT_KEYBOARD
        input.wVk = 0x90; //VK_NUMLOCK
        input.wScan = 0;
        input.dwFlags = 0; //key-down
        input.time = 0;
        input.dwExtraInfo = IntPtr.Zero;

        input.type1 = 0x01;
        input.wVk1 = 0x90;
        input.wScan1 = 0;
        input.dwFlags1 = 2; //key-up
        input.time1 = 0;
        input.dwExtraInfo1 = IntPtr.Zero;

        IntPtr pI = Marshal.AllocHGlobal(mouseInpSize * 2);
        Marshal.StructureToPtr(input, pI, false);
        int result = SendInput(2, pI, mouseInpSize); //Hardcoded size of the MOUSEINPUT tag !!!

        //if (result == 0 || Marshal.GetLastWin32Error() != 0)
        // Console.WriteLine(Marshal.GetLastWin32Error());
        Marshal.FreeHGlobal(pI);
    }
}
Run Code Online (Sandbox Code Playgroud)

dad*_*dde 5

这是一个例子:

public static class NativeMethods
{
    public const byte VK_NUMLOCK = 0x90;
    public const uint KEYEVENTF_EXTENDEDKEY = 1;
    public const int KEYEVENTF_KEYUP = 0x2;

    [DllImport("user32.dll")]
    public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

    public static void SimulateKeyPress(byte keyCode)
    {
        keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
        keybd_event(VK_NUMLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    }
}

public partial class Form1 : Form
{
    private bool protectKeys; // To protect from inifite keypress chain reactions

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (protectKeys)
            return;

        if (e.KeyCode == Keys.NumLock && 
            !(new Microsoft.VisualBasic.Devices.Keyboard().NumLock))
        {
            protectKeys = true;
            NativeMethods.SimulateKeyPress(NativeMethods.VK_NUMLOCK);
            protectKeys = false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢爸爸。我从来没有在我认为合理的问题上丢过这么多分。感谢您提供和回答,而不是批评我为什么要回答它,哈哈。 (2认同)