我正在用 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_KEYDOWN、WM_CHAR、WM_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/