我想实现如下的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)的目的,才可以做出决定。

10-06 01:27