c++ - 如何在 Windows 上使用 C++ 访问低级硬件 I/O 函数?

标签 c++ input

我正在用 C++ 编写游戏,我需要检测用户何时按下某个键。通常,我会使用 std::cin,但我有一个图形窗口,使用 graphics.h,这是一个最初由古老的 Borland Turbo C++ 编译器提供的 header ,但是可以在网上找到等效的。所以,我会使用函数 inportb();,函数定义如下:

inline unsigned char inportb(unsigned int port) {
    unsigned char ret;
    asm volatile ("inb %%dx,%%al":"=a"(ret):"d"(port));
    return ret;
}

来源:inportb .

但在 Windows 中,像这样的直接低级硬件 I/O 受到保护,如果有人尝试这样做,程序将被终止。所以我需要通过高级函数或 API 访问该函数。

我的问题:我该怎么做?

最佳答案

如果您试图检测游戏循环中间特定键的状态,GetAsyncKeyState将决定那一刻的具体状态。

if (GetAsyncKeyState(VK_LEFT) & 0x8000) != 0u)
{
    // ...
}

这个函数需要一个 virtual key代码(在本例中为左箭头键),获取状态并在按位 AND 运算后确定键是否按下,然后继续。

这些 virtual key代码可以在 WinUser.h 中找到。 GetAsyncKeyState不同于 GetKeyState在那GetKeyState不反射(reflect)与硬件相关的中断级状态(这就是我在上面使用 GetAsyncKeyState 的原因)。如果您需要给定实例的所有关键状态(这种情况很少见),请考虑 GetKeybardState .

但是,如果您正在等待关键事件(WM_KEYDOWNWM_CHARWM_KEYUP)发生,您必须在window procedure中提供一个案例。处理该事件。

LRESULT WindowProc(UINT const message, WPARAM const wparam, LPARAM const lparam)
{
    switch(message)
    {

    // [ cases like WM_CREATE / WM_PAINT / WM_CLOSE / WM_DESTROY ]

    case WM_KEYDOWN:
        // handle event here
        break;

    case WM_CHAR:
        // handle event here
        break;

    case WM_KEYUP:
        // handle event here
        break;
    }
}

希望这对您有所帮助。

关于c++ - 如何在 Windows 上使用 C++ 访问低级硬件 I/O 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32383514/

相关文章:

C++ 2011:std::thread:并行化循环的简单示例?

c++ - 重载运算符 & 继承 & 模板(一个强大的组合)

javascript - 如何让用户修改 Vue 中的计算属性?

react-native - react 原生文本输入,按下时更改光标位置

php - 如何使用数据库中的(大量)记录填充 HTML 表单?

C++ 结构行为

c++ - 关于C++中的动态内存分配

c++ - FlatBuffers/Protobuf 中是否有支持任意 24 位带符号整数定义的可移植二进制序列化模式?

javascript - 从用户 Javascript 获取 int

c - 如何在c中读取文件输入名称