none
如何自己做出一个KeyDown事件 RRS feed

  • 问题

  • 最近我准备做一个小游戏,但是发现窗体上只要有控件,它就不能正常在Form上响应上下左右的键盘输入事件,因为我想自己实现一个全功能的KeyDown事件,我的思路是使用User32中的GetAsyncKeyState函数,但是现在出现了一个问题,

    这个函数可以在任意时间监视,但是它不是一个事件,也不是作为一个事件来返回的,它只作为一种查询。为此我想到的一个最好的办法也就是用一个Timer来不断监视看它是否有按键按下,而不能抽象得像“事件”那样,主动提醒。

    我的问题便是有没有一种办法可以它系统产生事件?

    2011年4月9日 23:12

答案

  • 您好,

    如果你想做一个与控件无关的KeyDown事件的话,首先你把KeyPreview属性设置为true, 然后重写form的ProvcessDialogKey事件,当你接收到KwyDown事件是然后处理你的事物,而不是然会默认的“return base.ProcessDialogKey(keyData);

    这里是我写的代码,你可以参考下:

    protected override bool ProcessDialogKey(Keys keyData)
        {
          if (keyData == ?)
          {
            Console.WriteLine("test");
            //在这里写你需要的代码
    return true; } else { return base.ProcessDialogKey(keyData); } }

    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Flysha 2011年4月12日 3:49
    2011年4月12日 3:25

全部回复

  • Form.KeyPreview 属性
    http://feiyun0112.cnblogs.com/
    2011年4月11日 1:53
    版主
  • 您好,我发现Form.KeyXXX事件都有一个不足,就是Form必须处于激活的情况下才能发挥作用,KeyPreview也是一样,当窗体上其它控件没有激活时,上下左右键反应正常,但是一旦其它控件激活后,就反应不正常了!我希望能自己实现一个与控件无关的KeyDown...
    2011年4月11日 2:27
  • 您好,

    如果你想做一个与控件无关的KeyDown事件的话,首先你把KeyPreview属性设置为true, 然后重写form的ProvcessDialogKey事件,当你接收到KwyDown事件是然后处理你的事物,而不是然会默认的“return base.ProcessDialogKey(keyData);

    这里是我写的代码,你可以参考下:

    protected override bool ProcessDialogKey(Keys keyData)
        {
          if (keyData == ?)
          {
            Console.WriteLine("test");
            //在这里写你需要的代码
    return true; } else { return base.ProcessDialogKey(keyData); } }

    Vin Jin [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Flysha 2011年4月12日 3:49
    2011年4月12日 3:25
  • 谢谢!使用你的办法,问题已经解决!
    2011年4月12日 3:49