正在阅读:MFC下DirectX DirectInput的实现MFC下DirectX DirectInput的实现

2005-07-27 10:07 出处: 作者:苗苗 责任编辑:moningfeng

  对于扫描的设备类型,在DirectInput8.0以上的版本主要有以下几种选择,你可以讲这些选择或(OR)起来进行你所需要的组合:

  #define DI8DEVCLASS_ALL 0 扫描所有设备

  #define DI8DEVCLASS_DEVICE 1 扫描未知设备

  #define DI8DEVCLASS_POINTER 2 扫描鼠标,轨迹球,触摸点

  #define DI8DEVCLASS_KEYBOARD 3 扫描键盘

  #define DI8DEVCLASS_GAMECTRL 4 扫描游戏控制器


  其他的一些信息请参考SDK,这里我们传递给枚举设备函数DI8DEVCLASS_GAMECTRL,用来识别我们的游戏手柄。

  参数lpCallback为回调函数的函数名,这样枚举函数就知道如何去通过Windows来调用函数,做出相应的处理了。pvRef为32位的指针,来返回信息值。注意它的类型为LPVOID,所以你可以自定义任意的一个数据结构,然后传递这个结构的指针给枚举函数。在回调函数中,这个指针也将作为一个参数传递过去,然后你可以在回调函数中对这个指针指向的数据结构进行修改或其他的操作,来完成你所要完成的任务。

  dwFlags控制枚举函数如何扫描,是扫描所有设备,还是扫描安装和连接好的设备,还是扫描力反馈设备。dwFlags的取值如下:

  #define DIEDFL_ALLDEVICES 0x00000000 //扫描所有设备

  #define DIEDFL_ATTACHEDONLY 0x00000001 //扫描安装和连接好的设备

  #define DIEDFL_FORCEFEEDBACK 0x00000100 //扫描力反馈设备


  这里我们选择扫描安装和连接好的设备DIEDFL_ATTACHEDONLY 。最后的代码如下:

  hr = m_lpDI->EnumDevices( DI8DEVCLASS_GAMECTRL,

  DIEnumDevicesCallback, //回调函数

  &JoystickGUID, //赋值GUID

  DIEDFL_ATTACHEDONLY ); //扫描安装好的和连接好的设备


  if FAILED(hr)

  {

  OutputDebugString("枚举设备失败 - in CDIJoystick::Initialise\n");

  return false;

  }


  DIEnumDevicesCallback为回调函数的函数名,在回调函数中,我们将传递JoystickGUID 的地址过去,然后把检测到的游戏手柄的GUID保存下来,为我们以后申请COM对象、创建设备做准备。

  下面我们把回调的成员函数完成:

  BOOL CALLBACK Joystick::DIEnumDevicesCallback(const DIDEVICEINSTANCE* lpddi, VOID* pvRef)

  {

  *(GUID*) pvRef = lpddi->guidInstance;

  return DIENUM_STOP;

  }


  别看这个函数仅仅几行,要注意的东西可不少。首先,在声明中我们将它声明为静态成员函数。使用了static关键字。静态成员函数与普通的成员函数的最大的区别就在于,这个函数不属于任何一个实际的对象,而是属于整个类的。如果你对C++很熟悉的话,这个并不难理解。想想枚举回调的原理,系统或者说你定义的类枚举到每一个设备,自动调用回调函数来处理,这里回调函数并不属于任何一个最后你所定义的对象,而属于系统。如果在一般的Win32程序中,回调函数一般是声明成一个全局的函数,然后任意调用的,那里将不需要任何static声明。

  接下来是BOOL,在dinput.h中,BOOL有如下的定义:

  typedef BOOL (FAR PASCAL*LPDIENUMDEVICESCALLBACKW)(LPCDIDEVICEINSTANCEW,LPVOID); //Unicode下


  所以你得用BOOL来作为函数的返回值。
键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品