[英]Low-Level C++ App Crashes on Windows Vista/7 Unless Run in XP Compatibility Mode
[英]How can I access a low-level hardware I/O functions in C++ on Windows?
我正在用C ++编写游戏,我需要检测用户何时按下某个键。 通常,我会使用std::cin
,但我有一个图形窗口,使用graphics.h
,这是一个最初由古老的Borland Turbo C ++编译器提供的标题,但在线提供了一个等效的标题。 所以,我会使用函数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)
{
// ...
}
此函数采用虚拟键代码(在本例中为左箭头键),获取状态,并在按位AND操作后确定键是否已关闭,然后关闭。
这些虚拟键代码可以在WinUser.h中找到。 GetAsyncKeyState与GetKeyState的不同之处在于GetKeyState不反映与硬件关联的中断级状态(这就是我之前使用GetAsyncKeyState的原因)。 如果您需要给定实例的所有关键状态(很少见),请考虑GetKeybardState 。
但是,如果要等待键事件( WM_KEYDOWN , WM_CHAR , WM_KEYUP ),则必须在窗口过程中提供一个案例来处理该事件。
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;
}
}
希望这可以帮助。
在Windows中有4种不同的方法来检测输入。
几十年前,我对Turbo C ++有很多乐趣:-)但如果我是你,我会尝试使用除C编译器之外的游戏引擎或lib,例如这个SDL或Ogre(参见https:// en.wikipedia.org/wiki/List_of_game_engines一个太长的名单)。
它们提供(除其他外)具有键盘事件的事件循环。
或者更少,您可能希望使用Windows或跨平台框架,例如Microsoft提供的MSVC(某些用途是免费的)或Qt(更加免费,现在附带一个方便的IDE)。
玩得开心,给别人带来乐趣!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.