我正在尝试编写一个使用两个线程的简单游戏,一个线程用于获取用户的输入,另一个线程用于为某些场景设置动画。我可以在不按 ENTER 的情况下获得字符,但它会在动画线程中阻塞,直到用户按下一个键。有谁知道从键盘非阻塞获取字符的方法?
2 回答
如果您要检查少数特定键,GetAsyncKeyState()
可用于轮询状态。否则,您应该实现消息循环并WM_CHAR
在应用程序中处理消息。
如果您的环境尚不支持所需的 win32 函数,则可以使用类似于以下内容的库访问原始 win32 函数。
RAA - win32-api @ raa.ruby-lang.org
以下是 的相关链接GetAsyncKeyState()
。
GetAsyncKeyState() @ MSDN
Virtual-Key Codes @ MSDN(用作 GetAsyncKeyState 和其他函数的值)
如果您决定使用消息循环,则需要在托管应用程序窗口的同一线程上实现它。这里有一个简短的解释:
Microsoft Windows @ Wikipedia 中的消息循环
如该链接所示,消息循环并不多。您的框架可能已经在后台运行了一个来托管包含您的图形的窗口。如果是这种情况,您不需要第二个线程进行输入;但是您需要拦截和处理该主机窗口的 Windows 消息。
如果您必须自己实现消息循环,您可以使用 wikipedia 链接上的骨架。该DispatchMessage
调用会将窗口消息定向到适当的窗口处理程序。您将需要在 ruby 框架中为 Windows 消息寻找匹配的存根或处理程序,并WM_CHAR
从那里处理。
DispatchMessage @ MSDN
WM_CHAR @ MSDN
如果您想知道何时按下/按下键,那么您将需要处理 WM_KEYUP 和 WM_KEYDOWN 消息。
WM_KEYUP @ MSDN
WM_KEYDOWN @ MSDN
还要注意,GetAsyncKeyState()
即使另一个应用程序在前台,也可以调用并返回键状态。处理WM_ACTIVATE
和WM_SETFOCUS
/WM_KILLFOCUS
消息,以便您的应用程序在另一个窗口处于活动状态时忽略或推迟检查,如果您只关心键状态而您的窗口是主要前景窗口。