C# 模拟按键

C# 模拟按键,c#,winforms,driver,sendkeys,inputsimulator,C#,Winforms,Driver,Sendkeys,Inputsimulator,简介: 我并不擅长编程,我只是想在业余时间和工作中有机会做一些小项目的时候学习一些东西 我正在尝试创建一个基本应用程序,它模拟(Ctrl+Win+Shift)+B的按键,括号中的键一直保持到按下B为止 原因是我们的一些用户的显示器出现问题,重置显示器驱动程序似乎可以解决问题 守则: 我试过两种方法来做我想做的事: 方法一: using System; using System.Windows.Forms; using WindowsInput.Native; using WindowsInput

简介:

我并不擅长编程,我只是想在业余时间和工作中有机会做一些小项目的时候学习一些东西

我正在尝试创建一个基本应用程序,它模拟(Ctrl+Win+Shift)+B的按键,括号中的键一直保持到按下B为止

原因是我们的一些用户的显示器出现问题,重置显示器驱动程序似乎可以解决问题

守则:

我试过两种方法来做我想做的事:

方法一:

using System;
using System.Windows.Forms;
using WindowsInput.Native;
using WindowsInput;


namespace FixMonitors
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var simu = new InputSimulator();
            simu.Keyboard.ModifiedKeyStroke(new[] { VirtualKeyCode.LWIN, VirtualKeyCode.CONTROL, VirtualKeyCode.SHIFT }, VirtualKeyCode.VK_B);
            this.Close();
        }
    }
}
方法二:

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


namespace FixMonitors
{
    static class KeyboardSend
    {
        [DllImport("user32.dll")]
        private static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

        private const int KEYEVENTF_EXTENDEDKEY = 1;
        private const int KEYEVENTF_KEYUP = 2;

        public static void KeyDown(Keys vKey)
        {
            keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY, 0);
        }

        public static void KeyUp(Keys vKey)
        {
            keybd_event((byte)vKey, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        }
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        this.Close();
            KeyboardSend.KeyDown(Keys.LControlKey);
            KeyboardSend.KeyDown(Keys.LWin);
            KeyboardSend.KeyDown(Keys.LShiftKey);
            KeyboardSend.KeyDown(Keys.B);
            KeyboardSend.KeyUp(Keys.B);
            KeyboardSend.KeyUp(Keys.LShiftKey);
            KeyboardSend.KeyUp(Keys.LWin);
            KeyboardSend.KeyUp(Keys.LControlKey);
        }
    }
}
问题是:

现在,当我在VisualStudio中构建其中任何一个并运行创建的.exe时,我的桌面上的一切都正常工作

我复制exe并在其他四台台式机上测试,其中三台工作正常;屏幕变为空白,显示屏驱动程序复位。在第四台机器上,绝对没有发生任何事情,我也不知道为什么,所以如果能帮我诊断,我将不胜感激

我所尝试的:

我已尝试将.NET 3.5.1和.NET 4.8安装到所讨论的机器上(因为这是我在我的机器上安装的)

我还试图重新构建专门针对广告.NET 3.5和.NET 4.7.2的应用程序,但没有成功

除此之外,我在尝试诊断时稍微更改了代码,以便只按下Win键(模拟打开“开始”菜单),这在相关机器上工作正常

再次感谢您的帮助


提前感谢。

从键盘宏录制器开始,而不是自己编写宏录制器,这样可以省去几天的麻烦。您是否检查过不工作的计算机是否有可能阻止您的软件的防病毒软件?您是否有重新启动驱动程序的权限?快捷方式没有被禁用?最后但并非最不重要的一点是,这个快捷方式,第四个用户是否使用了这两个选项中的任何一个?@DourHighArch如果我弄错了,请原谅我,但该代码确实适用于所有其他测试过的机器,因此我怀疑我的代码是否有任何错误。我希望我的话听起来不像个混蛋,我不是在自吹自擂。@SANIM所有机器都有相同的防病毒、赛门铁克端点保护,并且都属于相同的防病毒策略(我自己管理)。有问题的用户与成功测试此功能的其他一些用户具有相同的域权限。如果我在机器上手动运行快捷键Ctrl+Win+Shift+B,它可以正常工作。我们域中的所有用户台式机都是Windows 10 Pro/Pro for Workstations,版本为1809/1903,我所做的测试涵盖了这些组合。当我过去使用keybd_事件时,有时需要在初始按键关闭消息和后续按键打开消息之间包含一个小延迟。你可以试试。但老实说,正是因为这种令人讨厌的边缘情况,我们才有了像AHK这样的宏工具。从键盘宏记录器开始,而不是自己编写宏记录器,这样可以省去你几天的挫败感。你是否检查过不工作的计算机是否有防病毒软件可以阻止你的软件?您是否有重新启动驱动程序的权限?快捷方式没有被禁用?最后但并非最不重要的一点是,这个快捷方式,第四个用户是否使用了这两个选项中的任何一个?@DourHighArch如果我弄错了,请原谅我,但该代码确实适用于所有其他测试过的机器,因此我怀疑我的代码是否有任何错误。我希望我的话听起来不像个混蛋,我不是在自吹自擂。@SANIM所有机器都有相同的防病毒、赛门铁克端点保护,并且都属于相同的防病毒策略(我自己管理)。有问题的用户与成功测试此功能的其他一些用户具有相同的域权限。如果我在机器上手动运行快捷键Ctrl+Win+Shift+B,它可以正常工作。我们域中的所有用户台式机都是Windows 10 Pro/Pro for Workstations,版本为1809/1903,我所做的测试涵盖了这些组合。当我过去使用keybd_事件时,有时需要在初始按键关闭消息和后续按键打开消息之间包含一个小延迟。你可以试试。但老实说,正是因为这种令人讨厌的边缘情况,我们才有了像AHK这样的宏工具。