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