C# 防止KeyDown事件识别SendKeys
我想做一个程序,如果用户按“D1-D0”键,模拟文本输入,如果用户按功能键,模拟一些数字 这是我尝试过的代码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”和“模拟此文本条目” 如何
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下面的答案可以帮我解决问题..仍在思考...)谢谢你的回复。