[DirectX][DirectInput][JoyStick]DirectInput的JoyStick创建步骤整理

[C++][DirectX]Joystick分享 [C++][DirectX]Joystick分享。 阅读详情

简介:DirectInput和其他DirectX组成部分一样,是通过硬件抽象层(HAL)和硬件仿真层(HEL)来实现,处理的输入设备一般包括鼠标、键盘、游戏控制杆、操作杆等。而且现在的DirectInput还能够支持力反馈设备。

Step 1: Creating the DirectInput Object

create a single DirectInput object as overall manager.

DirectInput8Create

 

// HINSTANCE  g_hinst; // initialized earlier
HRESULT         hr;
LPDIRECTINPUT8  g_lpDI;

hr = DirectInput8Create(g_hinst, DIRECTINPUT_VERSION,
        IID_IDirectInput8, (void**)&g_lpDI, NULL);
if FAILED(hr)
{
    // DirectInput not available; take appropriate action
}


=================================================

 

Step 2: Enumerating the Joysticks

 IDirectInput8::EnumDevices

 

//g_pDI is an initialized pointer to IDirectInput8
g_pDI->EnumDevices(
DI8DEVCLASS_GAMECTRL, EnumJoysticksCallback,
                       NULL, DIEDFL_ATTACHEDONLY)

 

 

 

=================================================

 

Step 4: Setting the Joystick Data Format

 

call the  IDirectInputDevice8::SetDataFormat  to manipulate that device

 

if (FAILED(hr = g_pJoystick->SetDataFormat(&c_dfDIJoystick2)))
    return hr;

 

typedef struct {
    LONG lX;
    LONG lY;
    LONG lZ;
    LONG lRx;
    LONG lRy;
    LONG lRz;
    LONG rglSlider[2];
    DWORD rgdwPOV[4];
    BYTE rgbButtons[128];
    LONG lVX;
    LONG lVY;
    LONG lVZ;
    LONG lVRx;
    LONG lVRy;
    LONG lVRz;
    LONG rglVSlider[2];
    LONG lAX;
    LONG lAY;
    LONG lAZ;
    LONG lARx;
    LONG lARy;
    LONG lARz;
    LONG rglASlider[2];
    LONG lFX;
    LONG lFY;
    LONG lFZ;
    LONG lFRx;
    LONG lFRy;
    LONG lFRz;
    LONG rglFSlider[2];
} DIJOYSTATE2, *LPDIJOYSTATE2;

=================================================

 

Step 5: Setting the Joystick Behavior

The joystick device has been created, and its data format has been set. The next step is to set its cooperative level.

 

if (FAILED(hr = g_pJoystick->SetCooperativeLevel(hDlg,
                    DISCL_EXCLUSIVE | DISCL_FOREGROUND)))
    return hr;

 

The next step is to gather information about the capabilities of the joystick.

 

g_diDevCaps.dwSize = sizeof(DIDEVCAPS);//must be first initailized
if (FAILED(hr = g_pJoystick->GetCapabilities(&g_diDevCaps)))
    return hr;

 

if (FAILED(hr = g_pJoystick->EnumObjects(EnumAxesCallback,
                                       (VOID*)hDlg, DIDFT_AXIS)))
    return hr;

 

 

=================================================

 Step6: Gaining Access to the Joystick

 

 IDirectInputDevice8::Acquire

 

hr = g_pJoystick->Poll();
if (FAILED(hr))
{
    hr = g_pJoystick->Acquire();
    while(hr == DIERR_INPUTLOST)
        hr = g_pJoystick->Acquire();
    return S_OK;
}

=================================================

 

  • The DI8DEVCLASS_GAMECTRL constant specifies the class of device to be enumerated.
  • EnumJoysticksCallback is the address of a callback function to be called each time a joystick is found.
  • The third parameter can be any 32-bit value that you want to make available to the callback function.
  • The last parameter, DIEDFL_ATTACHEDONLY, is a flag that restricts enumeration to devices that are attached to the computer.

=================================================

 Step 7: Retrieving Data from the Joystick

HRESULT UpdateInputState(HWND hDlg)
{
    HRESULT     hr;
    CHAR        strText[128]; // Device state text
    DIJOYSTATE2 js;            // Direct Input joystick state
    CHAR*       str;

    if (NULL == g_pJoystick)
        return S_OK;

    // Poll the device to read the current state
    hr = g_pJoystick->Poll();
    if (FAILED(hr)) 
    {
        // Attempt to reacquire joystick
    }
    hr = g_pJoystick->GetDeviceState(sizeof(DIJOYSTATE2), &js);
    if (FAILED(hr))
        return hr;

 

  • DIJOYSTATE2. This structure holds data for up to six axes, 128 buttons, and four point-of-view hats.
  • Joystick buttons work just like keys or mouse buttons. If the high bit of the returned byte is 1, the button is pressed.
  • 返回字节最高位为1,则按键处于按下状态

Step 3: Creating the DirectInput Joystick Device

 

IDirectInput8::EnumDevices枚举到设备后调用EnumJoysticksCallback回调函数,在回调函数中调用IDirectInput8::CreateDevice建立设备。

 

IDirectInput8::CreateDevice有三个参数:

1.枚举设备GUID(由DIDEVICEINSTANCE结构体提供,枚举到设备后DIDEVICEINSTANCE结构体通过指针传递给回调函数)

2.

 

The EnumJoysticksCallback callback function parameters are as follows:

  • A pointer to the device instance, supplied by the DirectInput system when the device is enumerated.
  • A pointer to a 32-bit value that you supplied as a parameter to IDirectInput8::EnumDevices

         (NULL = VOID* pContext)

 

    

BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE*    
                                       pdidInstance, VOID* pContext)
{
    HRESULT hr;

    // Obtain an interface to the enumerated joystick.
    hr = g_pDI->CreateDevice(pdidInstance->guidInstance, 
                                &g_pJoystick, NULL);
    if(FAILED(hr))
        return DIENUM_CONTINUE;

    return DIENUM_STOP;

 

=================================================

 

掌握DirectX和DirectInput —— 力反馈游戏杆 掌握DirectX和DirectInput——力反馈游戏杆Jason Clark     不知不觉中,Windows下的游戏和多媒体程序已经开始流行。硬件变得越来越快,Windows也变得更加灵活。自从Microsoft发布了DirectX,游戏开发人员对其它平台已经越来越不感兴趣了。许多游戏开发者也已经将他们的开发工作完全移植到了Windows下。     为PC开发游戏从来就没有轻 阅读详情

相关推荐

C#手柄开发实战:XInput与Raw Input底层解析与抗干扰轮询

游戏手柄输入是人机交互的基础技术之一,其本质是Windows平台下对HID设备的实时信号采集与处理。理解XInput协议的低延迟特性、Raw Input对全品牌手柄的通用支持能力,以及死区校准、轮询频率、热插拔响应等关键原理,是构建稳定输入系统的技术前提。在工业HMI、VR交互、模拟器前端等对可靠性与实时性要求严苛的场景中,仅依赖高层封装(如XNA)极易导致连接丢失、数据跳变或跨平台失效。本文聚焦C#在Windows原生环境下的手柄接入实践,深入解析HID报告描述符结构、WM_INPUT消息处理机制及多设备

didi9310的博客 326

极简主义DirectX开发第一弹:DirectInput手柄操作

目的:简化开发学习过程,以最小代码清晰展示某功能的实现。手柄设备和键盘鼠标是不同的,因为手柄不是必须的输入设备,因此系统没有事先定义好GUID供用户调用,并且手柄设备差异很大,因此只能用轮询来获得手柄设备的ID.本文为新手解释了如何初始化DirectInput设备为手柄,高手请忽略。整体思路是这样的,首先创建DirectInput对象,之后用这个对象来轮询设备,从而获得可用的设备ID,之后通过这个...

Mathias的博客 3453

全面解读:如何通过DirectInput从游戏杆获取数据

DirectInput不仅提供了基本的输入设备访问,还允许开发者使用高级API来模拟设备的输入以及实现力反馈控制。例如,接口用于创建和播放力反馈效果,从而提供物理反馈给用户。创建一个力反馈效果通常涉及到几个步骤:初始化接口。定义效果的类型和参数,比如是一个周期性效果还是单一效果。设置效果的属性,例如持续时间、大小和方向。加载和验证效果。播放效果。停止和释放效果。

weixin_42476987的博客 1020

JoyStick(游戏手柄)与C#

前言这是我的第一篇技术博客,希望能为大家提供些有用信息。 概述       前段时间有一项工作是通过游戏手柄控制云台,通过google和msdn搞定了,在这吧就总结一下吧。问题        对于手柄控制主要有以下几个问题 在合适的时机获取游戏手柄的输入? 一般游戏手柄都是有n个方向键和n个功能键控制的,要确认各个键的状态? 解决方案

fedora08的程序专栏 1万+

C#使用DirectX获取摇杆外设状态

C#监听摇杆状态 详情请看文章 https://blog.youkuaiyun.com/q771410116/article/details/136688340

Windows平台下使用DirectX(DirectInput8)进行Joystick编程

在Windows平台下使用DirectInput8接口,对joystick进行编程。 共2个文件:《DirectInput8开发手册》和Joystick.cpp(代码) 编译器:Visual Studio 2017 主要包含头文件: #include #include

Thrustmaster Hotas Warthog/猪杆/疣猪飞行操作杆开发(2)

距离《Thrustmaster Hotas Warthog/猪杆/疣猪飞行操作杆开发》的出生已经过去了半年了,最近项目上又要用到飞行操作杆,所以,我也乘此机会进一步整理一下上一次没有说完整的后续开发细节,也就是关于 显示更多的操作杆数据的方法—使用图形设备接口函数’windows.h’(并不是MFC奥)上一次只是显示了操作杆的X、Y轴的数据,这一次就以添加显示一个按钮为例,来直接进入主题。接着,按步

JassionJohn的专栏 3639

LinuxCNC---在PC端显示开发板LinuxCNC界面

  今天在调试开发板时,执行开发板上的linuxcnc指令,总是出现如下报错 LINUXCNC - 2.9.0~pre0 application-specific initialization failed: couldn't connect to display "192.168.137.3:1" Error in startup script: invalid command name "image" while executing "image create photo -file $f/$i

中华田园巨龙 3471

运用directinput同时读取多个游戏操纵杆信号

    最近在读取操纵杆、油门杆、脚蹬三个操作杆的信号,现有MFC只提供两个操纵杆读取接口JOYSTICKID1、JOYSTICKID2,要是想读取三个操纵杆信号就需要另想办法。师兄的方法是利用两个MFC接口读取两个操纵杆,再用directX读取一个操纵杆,个人感觉这样比较复杂,要是用directX同时将三个操纵杆一次读取出来就好了。在优快云上下了一个代码joystick_demo,界面如下:但...

awesomelatitude的博客 1387

Win11 24H2共享访问被禁?深入聊聊SMB签名和‘不安全的来宾登录’那点事

本文深入解析Win11 24H2共享访问故障,探讨SMB签名的安全机制与‘不安全的来宾登录’问题。提供从注册表修改到组策略配置的多层次解决方案,特别针对家庭网络和打印机共享场景给出实用建议,帮助用户在安全与便利之间找到平衡。

weixin_42556197的博客 568

JS自动化生成大疆WPML航线文件实战(附完整代码与云台控制解析)

本文详细介绍了如何利用JavaScript自动化生成大疆WPML航线文件,以解决手动规划航线效率低、易出错的问题。通过解析WPML文件结构,特别是云台控制等核心参数,并封装可复用的JS模板函数,开发者能够快速批量生成复杂航线,如倾斜摄影五向飞行,实现航测与巡检任务的标准化与高效执行。

weixin_29007243的博客 299

游戏手柄(JoyStick)编程学习笔记(1)

游戏手柄(JoyStick)编程学习笔记(1)最近我开发的一个项目中需要用手柄控制一个二维移动平台的运动,找了些工业用的操作杆,感觉都挺丑的。后来想到打游戏时用的游戏手柄就挺漂亮,就决定试试用游戏手柄作为控制手柄来用。上网查了查,在 WINDOWS 下编程控制游戏手柄比较主流的技术是用 DirectInput。如果不需要复杂的控制功能,也可以直接使用 WIN API (multimedia joys

Ivan 的专栏 3万+

别再只盯着YOLOv8了!手把手带你用PaddleDetection的PP-YOLOE+搞定你的第一个检测项目

本文介绍了PP-YOLOE+在目标检测领域的优势与应用实践,对比YOLOv8展示其在精度、速度和部署便利性上的突破。通过详细的代码示例和实战教程,帮助开发者快速上手PaddleDetection工具链,实现产业级目标检测项目,提升开发效率。

weixin_42701915的博客 186

JoyStick游戏杆编程实践

概述 最近突然对如何编程读取手柄输入比较感兴趣。所以上网找了找相关的资料,发现没有什么简单明了的教程,所以在此将收集到到跟joystick手柄编程相关资料整理一下,方便大家参考使用。 JoyStick简介 先给出JoyStick的维基百科介绍 维基百科词条:JoyStick 按照维基百科中的介绍,JoyStick事实上就是电子输入装置,可以输入按键,方向等数据。可以用来控制电子游戏,也可以用来控制...

yu_lei_的博客 1万+

STM32-DAC定时器触发三角波生成【频率与幅度精准控制】

本文详细介绍了STM32 DAC定时器触发三角波生成的原理与实现方法,涵盖硬件配置、频率与幅度精准控制技巧及代码实现。通过定时器触发DAC模块,可灵活调节三角波的频率和幅度,适用于信号发生器等高精度应用场景。

weixin_29161785的博客 454

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移)

写 SQL 是后端开发的日常,但复杂的 JOIN、子查询、窗口函数总让人头疼。本文教你用 Codex CLI 实现:自然语言直接生成 CREATE TABLE、复杂 SQL 查询、数据库迁移脚本(Prisma/Knex/Alembic)、ORM 模型代码(SQLAlchemy/TypeORM)、甚至自动生成数据库文档。重点强调安全红线——永远不要让 AI 直接连接生产数据库。从需求描述到完整数据库层代码,一篇搞定。

yueyeguzhuo的专栏 234

AirSim_SimJoyStick

本文介绍了一个跨平台的游戏手柄输入系统,支持Windows和Linux平台。系统采用分层设计,Windows端基于DirectInput API实现完整功能,包括力反馈;Linux端通过/dev/input/js*设备文件实现基础功能。核心类SimJoyStick提供统一接口,支持设备自动识别、灵活的轴映射配置和力反馈控制。系统采用PIMPL模式隐藏实现细节,具有良好封装性和跨平台适应性,特别适合模拟器和游戏开发场景。

FlyingMindIndex0的博客 432

ABAP Cloud 开发教程的文章目录

本教程涵盖 ABAP 云端 Client 处理、多租户架构、ABAP Cloud开发、动态编程优化、SQL语法改进等技术主题。最新版本1.0.0(更新至2025-12-12),包含197篇文章,重点文章包括《ABAP Client Handling与隔离机制》《ABAP Platform 2021泛型编程》《SAP BTP ABAP多租户应用开发》等,为开发者提供从基础到进阶的实战指南。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1815

directx joysitck 程序示例

//-----------------------------------------------------------------------------  // File: Joystick.cpp  //  // Desc: Demonstrates an application which receives immediate   //       joystick data in ex

mrpayne的专栏 1468

手把手教你学Simulink--基于未来出行解决方案的场景实例:电动飞行汽车(eVTOL)的动力系统建模与仿真

电动垂直起降飞行器零道路拥堵:三维空间飞行绿色低碳:全电驱动,零排放快速响应:城市内15分钟直达低噪音:相比直升机↓20dB📊 预测:2030年全球eVTOL市场规模将超300亿美元,中国、美国、欧洲加速适航认证。本文通过,构建了电动飞行汽车(eVTOL)动力系统高压电池系统建模电力电子(DC-DC、逆变器)实现PMSM电机+螺旋桨推进系统搭建完整飞行任务动态仿真性能KPI评估与优化。

MHD0815的博客 444

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

DirectInput:游戏输入的高速直达通道

摘要: DirectInput是微软DirectX的组件,用于直接读取键盘、鼠标等输入设备数据,绕过Windows消息队列以降低延迟。类比中,普通输入像“服务员传菜”,而DirectInput如同“自助取餐”,让游戏程序直接从硬件驱动获取数据。它支持独占设备、多设备兼容(如方向盘),适用于需要高响应速度的场景(如游戏),通过初始化设备、独占控制和实时数据读取实现高效输入处理。(149字)

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1223

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

DirectInput编程基础-游戏手柄编程

导读:   DirectInput编程基础 - 简介 出 处: 中国游戏开发者   [ 2001-09-09] 作 者:   目 录   1.1 DirectInput概念   1.2 设置DirectInput   1.3 列举设备   1.4 设置设备   1.5 取得输入数据   绪言   输入相对于图形和声音而言从未成为游戏开发中的非常重要的论题。读取键盘按

maxos的专栏 4767

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

linux模拟手柄输入,Linux joystick 游戏手柄编程 (获取输入数据)

外链网址已屏蔽点击(此处)折叠或打开//my_joystick.c#include #include #include #include #include #include #include #include #include #include //#include /*郁闷,不能直接使用linux自带的list链表,需要单独提取出来,见前面的code*/#include "listop.h"#...

weixin_34472954的博客 753
上一篇: [MFC][函数使用]StringCchPrintf()(未解决)
下一篇: [MFC][DirectInput]MFC下DirectX DirectInput的实现(有部分删改)
hicoder
博客等级 码龄16年 0粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值