none
请问.NET中如何产生KeyPressing事件? RRS feed

  • 问题

  • 如题,我最近做一个小游戏,需要不断按下上下左右键,但是我发现如果响应KeyDown事件,那么就会很慢。一般的情况就是响应时需要先卡一下,然后才连续响应,这还好,更不好的情况就是如果我同时按下Down和Left两个键,那么这两个键都会没有响应(堵塞!?),我使用《使命召唤6》和另一个小游戏测试了一下,键盘响应很快,按键时不会先卡一下,同时按多个键的响应也正常。

    同一个键盘相同的按键出现不同的反应,我觉得应该是我的方法的问题,可能在这种情况下我不应该使用KeyDown事件,想请教一下各位老师,我应该怎么才能回忆键盘响应?

    我的想法是封装出一个KeyPressing的事件出来,其中包括一个Timer,用来激发事件,KeyDown时,向一个表中添加相关信息,在KeyUp之前,将按照Timer的Inteval属性不断产生KeyPressing事件,直到KeyUp,我刚刚实现了这个,但是发现还是不正常,因为有时很灵敏,有时又不够灵敏,应该宣布我那样做不行,现在想请问如何做出一个KeyPressing事件?

    2011年3月20日 4:17

答案

全部回复

  • 您好,

    不知道您做的游戏程序用的是什么技术呢? WinForm?如果是WinForm的话  对于键盘的监听确实不是很灵敏的,这取决与WinForm的事件监听机制。

    如果是用XNA框架做的,基本都没问题,按键响应很灵敏,并无阻塞丢失等情况。

    • 已标记为答案 Flysha 2011年3月21日 23:17
    2011年3月21日 1:58
  • 是的,我使用的是WinForm,且暂时不能移植到其它框架。据我的分析, WinForm的键盘事件这样设置是为了保证打字的时候不出现按下一个键出现多个字符的异常,完全有可能跳过这种机制。

    后来我通过进不步了解,发现网上说使用GetAsyncKeyState()或者DirectInput都可以解决这个问题,那想请问具体怎么操作呢?

    还有一个附带的问题,我下载了DirectX的SDK,并调用了Microsoft.DirecX.DirectInput.dll,但是发现这个dll的版本是1.1,似乎不能在.NET4.0上运行,请问是怎么回事?

    再次感谢各位老师!

    2011年3月21日 4:22
  • 刚刚我在网上查了一下,似乎提到了Managed DirectX 现在已经被淘汰了,请问是真的吗?如果是真的,请问XNA框架有没有一个类似于DirectInput的组件可以供WinForm调用呢?

    谢谢!期待答案!

    2011年3月21日 4:41
  • Flysha 你好,

    你可以参考一下这篇关于XNA的文章,里面有提到Input类,DirectX中的DirectInput类:http://dev.firnow.com/course/4_webprogram/asp.net/netjs/20100802/515978.html

    希望对你有帮助。

    Mio


    Mio Miao[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年3月21日 23:16
    2011年3月21日 11:38
    版主
  • 我使用了XNA的一个核心库,问题已经解决!谢谢!
    2011年3月21日 23:17
  • 问题解决就好!不客气。


    Mio Miao[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.

    2011年3月22日 3:01
    版主