在我的程序中,我需要在按下键的同时执行操作。我已经搜索了,但解决方案要么不是c#,也不是表格或我无法理解它们。
这是否有适当而简单的解决方案?
编辑:我正在使用WinForms,我希望在表单聚焦并按下某个键时重复执行操作。
答案 0 :(得分:2)
首先,您需要提供更多信息,如果可能的话,您还需要尝试一些代码。但不过我会尝试。
概念相对简单,你在表单中添加一个计时器,你添加key_DOWN和key_UP事件(不按键)。你创建了一个类似于当前按下键的bool,你在keydown上将其值更改为true,在keyup上将其值更改为false。拿着钥匙时会是这样。
bool keyHold = false;
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
if (keyHold)
{
//Do stuff
}
}
private void Key_up(object sender, KeyEventArgs e)
{
Key key = (Key) sender;
if (key == Key.A) //Specify your key here !
{
keyHold = false;
}
}
private void Key_down(object sender, KeyEventArgs e)
{
Key key = (Key)sender;
if (key == Key.A) //Specify your key here !
{
keyHold = true;
}
}
**如果您尝试在表单上制作一个简单的游戏而且您正在努力解决输入延迟窗口问题(按住一个键,它会出现一次,等待然后发送垃圾邮件key)此解决方案适用于此(初始按下后没有暂停)。
答案 1 :(得分:1)
你可以试试这个。
在Key down事件中,将bool'buttonIsDown'设置为TRUE,并在Separate Thread中启动方法'DoIt'。 'doIt'方法中While循环中的代码运行的时间与bool'buttonIsDown'为真且Form处于Focus状态。 触发Key Up事件或Form松散焦点时停止。 在那里你可以看到'buttonIsDown'设置为false,以便While循环停止。
//Your Button Status
bool buttonIsDown = false;
//Set Button Status to down
private void button2_KeyDown(object sender, KeyEventArgs e)
{
Key key = sender as Key;
if (key == Key.A)
buttonIsDown = true;
//Starts your code in an Separate thread.
System.Threading.ThreadPool.QueueUserWorkItem(DoIt);
}
//Set Button Status to up
private void button2_KeyUp(object sender, KeyEventArgs e)
{
Key key = sender as Key;
if (key == Key.A)
buttonIsDown = false;
}
//Method who do your code until button is up
private void DoIt(object dummy)
{
While(buttonIsDown && this.Focused)
{
//Do your code
}
}