我想实现如下所示的键盘类;
class Keyboard
{
public:
Keyboard();
~Keyboard();
bool IsKeyDown(Key);
bool IsKeyUp(Key);
void SetPressedKey(int);
void SetReleasedKey(int);
private:
Key pressedKey;
Key releasedKey;
};
Key 是一个像下面这样的枚举;
enum Key
{
A,
Enter,
Up,
Down
};
这里是窗口回调函数;
case WM_KEYDOWN:
kb.SetPressedKey(wParam);
break;
case WM_KEYUP:
kb.SetReleasedKey(wParam);
break;
首先,我的设计可能是完全错误的。如果这是一个可以接受的设计,有些问题我无法回答。如果用户同时按下两个按钮,是否可以覆盖 pressedKey 的值,以及如何确定用户是否使用 CTRL+C 等组合。另一个问题是我找不到在 wParam 的值和枚举键的索引之间建立关系的方法。
最佳答案
这个类的大部分实现都是不必要的,应该被删除。您正在重新实现操作系统已经提供的功能。如果您想知道 key 的状态,只需调用 GetKeyState
.
您可以选择将低级 Win32 API GetKeyState
包装在您的类中。但是不要将信息作为状态存储在您的类(class)中。当您需要知道键的状态时,即在实现 IsKeyDown()
和 IsKeyUp()
时,调用 GetKeyState
。
另一个很好的理由是你不能保证所有的键盘消息都会到达你的窗口。有人可能会在另一个窗口处于事件状态时按下某个键,然后切换到您的程序。到那时,您尝试使用键盘消息跟踪状态的尝试将失败,因为您从未收到按键消息。但是,GetKeyState
将起作用。
就是说,如果您需要在窗口过程之外了解瞬时状态,那么您可以使用 GetAsyncKeyState
而不是 GetKeyState
。只有您完全理解本类(class)的目的,才能做出决定。
关于c++ - Windows应用程序中的键盘类实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22072236/