C# 防止KeyDown事件识别SendKeys

C# 防止KeyDown事件识别SendKeys,c#,C#,我想做一个程序,如果用户按“D1-D0”键,模拟文本输入,如果用户按功能键,模拟一些数字 这是我尝试过的代码 if (e.KeyData == Keys.D1){ SendKeys.Send("simulate this text entry"); } if (e.KeyData == Keys.F12){ SendKeys.Send("123"); } 但问题是,当我按下F12按钮时,KeyDown事件将第一个“1”标识为“D1”键,并发送“123”和“模拟此文本条目” 如何

我想做一个程序,如果用户按“D1-D0”键,模拟文本输入,如果用户按功能键,模拟一些数字

这是我尝试过的代码

if (e.KeyData == Keys.D1){
    SendKeys.Send("simulate this text entry");
}
if (e.KeyData == Keys.F12){
    SendKeys.Send("123");
}
但问题是,当我按下F12按钮时,KeyDown事件将第一个“1”标识为“D1”键,并发送“123”和“模拟此文本条目”


如何防止此问题?

当您要发送密钥时,必须设置一个标志,以便忽略正在发送的字符。此外,您还需要知道何时重新打开该标志。这可以通过将变量设置为发送的值的长度,然后使用每个检测到的键递增计数器来实现。这并不是万无一失的,因为用户可以快速连续地按按键(或按住一个键),而您不知道按键是用户交互的结果还是模拟的结果

基本思路如下:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    private bool IgnoreKeys = false;
    private int target = 0;
    private int counter = 0;

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (!IgnoreKeys)
        {
            if (e.KeyData == Keys.D1)
            {
                Send("simulate this text entry");
            }
            if (e.KeyData == Keys.F12)
            {
                Send("123");
            }
        }
        else
        {
            counter++;
            if (counter == target)
            {
                IgnoreKeys = false;
            }
        }
    }

    private void Send(string entry)
    {
        IgnoreKeys = true;
        counter = 0;
        target = entry.Length;
        SendKeys.Send(entry);
    }

}

问题是,使用
SendKeys.Send(…)
程序无法区分发送的按键和用户键盘输入之间的差异

发送键“123”时,与用户按1、2和3键时相同。 因为您正在侦听1键,所以该事件触发并捕获sendkeys发送的“1”

如果可能,尝试将文本附加到您试图“模拟文本输入”的内容中,并避免使用sendkeys。 否则,考虑把你的数字热键ALT/CTRL组合,如:
        if (e.Control && e.KeyCode == Keys.D1)
        {
            SendKeys.Send("simulate this text entry");
            e.Handled = true;        
        } 

这将防止在按下F12并发送“123”时触发此事件(因为未按下ctrl键)

终于解决了问题:)这是密码。。必须在此任务中使用“SendKeys.Flush()”

private bool IgnoreKeys = false;

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if ((e.KeyData == Keys.D1) && (!IgnoreKeys))
        {

            SendKeys.Send("Simulate this text" + "{ENTER}");

        }
        if (e.KeyData == Keys.F12)
        {
            IgnoreKeys = true;

            SendKeys.Send("123");
            SendKeys.Flush();

            IgnoreKeys = false;
        }
这防止了将文本“123”中的“1”视为键“D1”的按键向下事件


这个主意没用了(大脑:)谢谢你。

@Okuma.Scott不。我不会同时按这些键。e、 KeyData标识用户是否按下了D1键。。(仅适用于D1。不适用于带有shift或任何其他键(如ctrl或alt)的D1)。你所说的我活动的结构是什么意思?我不明白。向自己发送击键没有任何意义,您只需更新任何控件的文本属性即可。抱歉:(无法添加文本。我将把文本条目发送到游戏聊天中。游戏甚至不支持复制粘贴命令。SendKeys是唯一的方法..该键必须是单键,以便在打仗时轻松发送消息。顺便说一句,我认为@Idle\u Mind下面的答案可以帮我解决问题..仍在思考...)谢谢你的回复。