阻止KeyDown事件识别SendKeys

时间:2014-02-27 13:15:24

标签: c#

如果用户按下“D1 - D0”键并在用户按下功能键时模拟一些数字,我想制作一个模拟textentry的程序。

这是我尝试过的代码。

if (e.KeyData == Keys.D1){
    SendKeys.Send("simulate this text entry");
}
if (e.KeyData == Keys.F12){
    SendKeys.Send("123");
}

但问题是当我按下F12按钮时,KeyDown事件将第一个“1”识别为“D1”键并发送“123”和“模拟此文本条目”

如何防止此问题?

3 个答案:

答案 0 :(得分:1)

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

这是基本想法:

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);
    }

}

答案 1 :(得分:1)

问题是使用SendKeys.Send( ... ),你的程序无法区分你发送的密钥和用户的键盘输入之间的区别。

当你发送键“123”时,它就像用户按下1,2和3键一样。 因为您正在侦听1键,所以该事件会触发并捕获sendkeys发送的“1”。

如果可能,尝试将文本附加到您尝试“模拟textentry”的内容中,并避免使用sendkeys。 否则,请考虑使用您的号码热键alt / ctrl-combination,例如:

        if (e.Control && e.KeyCode == Keys.D1)
        {
            SendKeys.Send("simulate this text entry");
            e.Handled = true;        
        } 

当您按F12并发送“123”(因为未按下ctrl)时,这将阻止此事件被触发。

答案 2 :(得分:1)

终于解决了问题.. :)这里是代码..必须在这个任务中使用“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;
        }

这可以防止KeyDown事件在文本“123”中将“1”视为键“D1”

想法是Idle_Mind的:)谢谢..