c++ - Windows应用程序中的键盘类实现

标签 c++ winapi visual-c++

我想实现如下所示的键盘类;

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/

相关文章:

c++ - 新手的C++项目

windows - CreateProcess 执行 Windows 命令

c++ - 使用全局引用调用函数时发生访问冲突

windows - 应用程序无法写入 %APPDATA%(但用户可以)

c++ - 导出类时编译器错误

c++ - 调用 Clock::getElapsedTime() 时 SFML 2.0 崩溃

c++ - 这个 Sedgewick 代码正确吗?

c++ - SDL2 和 C++ - 将图像加载为像素数组

c# - 如何防止控件更改 Z 顺序?

c - 如何过滤 wchar_t 数组?