我希望在我的程序运行时按下一个键,所以我这样做了:
public partial class Form1 : Form
{
[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
const int KEY_DOWN_EVENT = 0x0001; //Key down flag
const int KEY_UP_EVENT = 0x0002; //Key up flag
byte VK_UP = 0x26;
public Form1()
{
InitializeComponent();
keybd_event(VK_UP, 0, KEY_DOWN_EVENT, 0);
}
void gkh_KeyDown(object sender, KeyEventArgs e)
{
Debug.WriteLine(e.KeyCode.ToString()); //it only executes once
}
但只按一次键。我错过了什么?
无法相信它在C#上是不可能的!!甚至德尔福都可以做到!!
我真正想做的是:
假设我按下'a'键,几秒钟后我按下'b'键。 当我松开键'b'时,我希望'a'继续显示在屏幕上。
答案 0 :(得分:1)
当您按下键时,KeyDown
方法仅触发一次。如果我是你,我会让它看起来像
void gkh_KeyDown(object sender, KeyEventArgs e)
{
//represent that the key is down
KeysDown[e.KeyCode] = true; // you may represent that the key is down however you want
}
然后创建一个KeyUp事件
void gkh_KeyUp(object sender, KeyEventArgs e)
{
//represent that the key is not down
KeysDown[e.KeyCode] = false; // you may represent that the key is down however you want
Debug.WriteLine(e.KeyCode.ToString()); //it only executes once
}
然后,我会有某种周期性事件
void PeriodicEvent(object sender, KeyEventArgs e)
{
// if the key is down, write the key.
if (KeysDown[e.KeyCode])
Debug.WriteLine(e.KeyCode.ToString());
}
答案 1 :(得分:1)
我认为你希望键盘自动重复。然而,这是键盘控制器的功能,键盘内置于键盘中。 Windows无法执行任何操作,它只能告诉键盘控制器所需的延迟和重复率,如控制面板+键盘小程序中所配置。
所以你的keybd_event()永远不会产生多次击键。您可以使用计时器修复它。
答案 2 :(得分:0)
密钥在技术上仍处于关闭状态,您只能在表单中看到一个事件,如其他人已经解释的那样。
您可以使用GetKeyState()API检查所需密钥的状态来验证这一点。使用@ parsely72 here
发布的示例