C# 如何以编程方式调用键盘按键?

C# 如何以编程方式调用键盘按键?,c#,keyboard,overriding,capslock,C#,Keyboard,Overriding,Capslock,问题: 从一段C代码中调用要按下的键盘键 但这里有一个陷阱:按键不应该局限于进程/应用程序 但是被整个操作系统接收,所以当程序在后台并且不同的窗体/程序具有焦点时也是如此 目标: 制作一个锁定CapsLock和NumLock状态的程序 背景: 我有一台笔记本电脑,这两个键让我非常沮丧,我想制作一个在后台运行的应用程序,一旦意外启用CapsLock,它就会禁用,NumLock永远不会被禁用,而且,我想扩展我的编码知识,我试着找到解决方案,但没有一个能解决整个问题问题。您必须使用user32.dll

问题: 从一段C代码中调用要按下的键盘键 但这里有一个陷阱:按键不应该局限于进程/应用程序 但是被整个操作系统接收,所以当程序在后台并且不同的窗体/程序具有焦点时也是如此

目标: 制作一个锁定CapsLock和NumLock状态的程序

背景
我有一台笔记本电脑,这两个键让我非常沮丧,我想制作一个在后台运行的应用程序,一旦意外启用CapsLock,它就会禁用,NumLock永远不会被禁用,而且,我想扩展我的编码知识,我试着找到解决方案,但没有一个能解决整个问题问题。

您必须使用user32.dll挂接键盘。
如果您想禁用capslock,使其不被实际按下,您可以使用它来启动此代码项目

SetWindowsHookEx
这里有很多关于如何使用它的信息。比如说

当然还有msdn


您可以尝试模拟键盘和鼠标点击的CodePlex项目

它被称为Windows输入模拟器,可以找到

using System;
using System.Runtime.InteropServices;

public class CapsLockControl
{

    public const byte VK_NUMLOCK = 0x90;
    public const byte VK_CAPSLOCK = 0x14;

    [DllImport("user32.dll")]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags,UIntPtr dwExtraInfo);
    const int KEYEVENTF_EXTENDEDKEY = 0x1;
    const int KEYEVENTF_KEYUP = 0x2;

    public static void Main()
    {
        if (Control.IsKeyLocked(Keys.CapsLock))
        {
            Console.WriteLine("Caps Lock key is ON.  We'll turn it off");
            keybd_event(CapsLockControl.VK_CAPSLOCK, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr) 0);
            keybd_event(CapsLockControl.VK_CAPSLOCK, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
                (UIntPtr) 0);
        }
        else
        {
            Console.WriteLine("Caps Lock key is OFF");
        }
    }
}