C# 如何按住C键#

C# 如何按住C键#,c#,user32,C#,User32,我试图在这个控制台程序中实现的是能够通过使用user32.dll按住一个键。我知道我没有发送扩展密钥。但我也不认为把它作为扫描码发送是正确的。我想我传递给它的是正确的旗帜,只是握着钥匙。。我也知道我会做一个关键的了。但是现在我只需要把钥匙按下。任何帮助都将不胜感激,因为现在下面的代码不起作用 public class Program { [DllImport("user32.dll")] public static extern void keybd_event(byte bVk

我试图在这个控制台程序中实现的是能够通过使用user32.dll按住一个键。我知道我没有发送扩展密钥。但我也不认为把它作为扫描码发送是正确的。我想我传递给它的是正确的旗帜,只是握着钥匙。。我也知道我会做一个关键的了。但是现在我只需要把钥匙按下。任何帮助都将不胜感激,因为现在下面的代码不起作用

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

    const int VK_UP = 0x26, VK_DOWN = 0x28, VK_LEFT = 0x25, VK_RIGHT = 0x27;
    const uint KEYEVENTF_KEYUP = 0x0002, SCANCODE = 0x0008;
    const int KEY_0 = 11;

    internal enum ScanCodeShort : short
    {
        KEY_9 = 10, KEY_A = 30, KEY_B = 48, KEY_C = 46, KEY_D = 32, KEY_E = 18, KEY_F = 33,
        KEY_G = 34, KEY_H = 35, KEY_I = 23, KEY_J = 36, KEY_K = 37, KEY_L = 38, KEY_M = 50, KEY_N = 49,
        KEY_O = 24, KEY_P = 25, KEY_Q = 16, KEY_R = 19, KEY_S = 31, KEY_T = 20, KEY_U = 22, KEY_V = 47,
        KEY_W = 17, KEY_X = 45, KEY_Y = 21, KEY_Z = 44, }

    private static void Main(string[] args)
    {
        Thread.Sleep(2000);

        // push V key
        keybd_event((byte)ScanCodeShort.KEY_V, 0x45, 0, 0);

        // release V key
        keybd_event((byte)ScanCodeShort.KEY_V, 0x45, KEYEVENTF_KEYUP, 0);
        Console.WriteLine("done");          
        Console.Read();
    }
}

keybd\u事件
的第二个和第三个参数错误

看看和

第二个参数应为0x45

第三个参数不能是8。必须为0才能按键

可能是这样的:

static void Main(string[] args)
{
    Thread.Sleep(2000);
    // push V key
    keybd_event((byte)ScanCodeShort.KEY_V, 0x45, 0, 0);

    Console.WriteLine("done");
    Console.Read();
}
扫描码是字符串(数字或字母数字)的视觉表示形式

小心你的代码。47是0x2F en hexa,在中是VK_HELP

*完整代码*

using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace pressand_hold
{
    internal class Program
    {
        internal enum ScanCodeShort : short
        {
            KEY_0 = 48,
            KEY_1,
            KEY_2,
            KEY_3,
            KEY_4,
            KEY_5,
            KEY_6,
            KEY_7,
            KEY_8,
            KEY_9,
            KEY_A = 65,
            KEY_B,
            KEY_C,
            KEY_D,
            KEY_E,
            KEY_F,
            KEY_G,
            KEY_H,
            KEY_I,
            KEY_J,
            KEY_K,
            KEY_L,
            KEY_M,
            KEY_N,
            KEY_O,
            KEY_P,
            KEY_Q,
            KEY_R,
            KEY_S,
            KEY_T,
            KEY_U,
            KEY_V,
            KEY_W,
            KEY_X,
            KEY_Y,
            KEY_Z,
        }

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

        private static void Main(string[] args)
        {
            Thread.Sleep(2000);

            keybd_event((byte)ScanCodeShort.KEY_V, 0x45, 0, 0);

            Console.WriteLine("done");
            Console.Read();
        }
    }
}

要按住键,请使用循环(
while()
for()
,等等…)

它是如何工作的?@MartinLiversage不键入任何内容。运行此命令后,我点击记事本,2秒钟后什么也没发生。您不使用自动化的原因是什么?@DavidHeffernan automation?对不起,我对c语言中的user32.dll有点陌生,你能解释一下吗?这里没有与dll相关的内容。或者你是说平沃克?无论如何,如果您想自动化另一个流程,请使用自动化设施。UIAutomation。我将第二个参数更改为0x45,将第三个参数更改为KEYEVENTF\u KEYUP。还有什么需要改变的吗。我查看了msdn,它看起来是正确的now@MichaelLapanKEYEVENTF\u KEYUP用于释放钥匙。你确定你想要这个吗?@Xaurth不,我正试着按住钥匙。。但我不太确定该放什么…@Xaurth-hmmmmm。。。。so keybd_事件(VK_选项卡,0x45,0,0);用于按tab键。所以我复制并粘贴了你的代码,但什么都没有。@MichaelLapan我想我发现了问题所在。键代码47=0x2F=VK_帮助,而不是V;)
using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace pressand_hold
{
    internal class Program
    {
        internal enum ScanCodeShort : short
        {
            KEY_0 = 48,
            KEY_1,
            KEY_2,
            KEY_3,
            KEY_4,
            KEY_5,
            KEY_6,
            KEY_7,
            KEY_8,
            KEY_9,
            KEY_A = 65,
            KEY_B,
            KEY_C,
            KEY_D,
            KEY_E,
            KEY_F,
            KEY_G,
            KEY_H,
            KEY_I,
            KEY_J,
            KEY_K,
            KEY_L,
            KEY_M,
            KEY_N,
            KEY_O,
            KEY_P,
            KEY_Q,
            KEY_R,
            KEY_S,
            KEY_T,
            KEY_U,
            KEY_V,
            KEY_W,
            KEY_X,
            KEY_Y,
            KEY_Z,
        }

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

        private static void Main(string[] args)
        {
            Thread.Sleep(2000);

            keybd_event((byte)ScanCodeShort.KEY_V, 0x45, 0, 0);

            Console.WriteLine("done");
            Console.Read();
        }
    }
}