【问题标题】:Is JOYBUTTON_5 incorrectly defined in mmsystem.h?JOYBUTTON_5 是否在 mmsystem.h 中错误定义?
【发布时间】:2014-08-12 08:44:42
【问题描述】:

我目前正在编写一些 C++ 代码来检测游戏手柄按钮的按下情况。我正在使用以下代码来定义一组可能的按钮按下:

#include <windows.h>
#include <mmsystem.h>

this->buttons[0] = JOY_BUTTON1;
this->buttons[1] = JOY_BUTTON2;
...
this->buttons[31] = JOY_BUTTON32;

然后使用类似下面的东西来检测按下了哪个按钮:

joyGetPosEx(this->joyStickId, &info);

buttonPressed = false;

for(int i=0; i<32; i++){
  if((info.dwButtons & this->buttons[i]) == this->buttons[i]){
    buttonPressed = true;
    cout << "button number " << (i+1) << "was pressed!" << endl;
  }
}

if(buttonPressed === false){
  cout << "could not detect button press, dwButtons was set to: " << info.dwButtons << endl;
}

这适用于游戏手柄按钮 1-4。但是,按钮 5-32 不起作用。例如,当按下游戏手柄上的按钮 5 时,程序认为 dwButtons 设置为 16。mmsystem.h 中定义的 JOY_BUTTON5 是 257。所以在我看来, JOY_BUTTON5 - 32 在 mmsystem 中定义不正确。是这样吗,还是我错过了什么?

【问题讨论】:

  • 你用的是什么类型的操纵杆?使用此函数查询 xbox 360 样式(ms 制造)控制器会返回大部分无用信息。例如,左触发器和右触发器“按钮”都改变了dwZPos 的值。按下 LT 会增加数值,而按下 RT 会减少数值。因此,两个完全按下时在 dwZPos 中返回的值与如果 两者都没有 被按下时返回的值相同。 (32768)。这是使用 XInput 处理特定控制器的示例 - codeproject.com/Articles/26949/…
  • 感谢您的评论 - 这是一个基于此的定制“游戏手柄”:u-hid.com/home/overview_board.php。我已经用另一个类似的设备尝试过,dwButtons 也不匹配超过 5 的 JOY_BUTTONx 常量。
  • 嗯,很有趣。 :) 我应该提到,除了触发器“按钮”之外,普通按钮在dwButtons 中返回的值是 1、2、4、8、16、32、64 和 128。如果你得到相同的值,这可能是尝试 XInput 示例的一个案例。 mmsystem.h 中的内容自 win2k 以来一直存在 - 我不记得我们当时是否有 HID 硬件,但我怀疑这些内容是为 winxp 提供的。 (很确定 WinXp 给我们带来了 directX,其中 XInput 是其中的一部分)
  • @enhzflep 是的,我发现了同样的事情:实际的 dwButtons 值似乎每次都翻倍。我想我仍然会使用mmsystemjoyGetPosEx,因为它已经(大部分)工作了,只是不使用JOY_BUTTONx 常量。我将硬编码 this-&gt;buttons 数组以包含 1,2,4,8 等。

标签: c++ windows gamepad


【解决方案1】:

我假设您使用的是 MinGW。是的,这是他们头文件中的一个错误。 Microsoft Win32 头文件有不同的值(正确的)。

MinGW 目前有:

#define JOY_BUTTON5 257
#define JOY_BUTTON6 513
#define JOY_BUTTON7 1025
#define JOY_BUTTON8 2049

应该是:

#define JOY_BUTTON5 16
#define JOY_BUTTON6 32
#define JOY_BUTTON7 64
#define JOY_BUTTON8 128

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-12
    • 2010-09-27
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2011-03-13
    • 2017-07-12
    • 2022-08-18
    相关资源
    最近更新 更多