如果用户按下“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”和“模拟此文本条目”
如何防止此问题?
答案 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的:)谢谢..