一个DirectInput演示程序

       使用DirectInput8组件,获取键盘或鼠标的缓冲数据方式,并使用了事件通知将数据显示在屏幕上。程序首先创建DirectInput8对象、鼠标键盘设备,并为它们设置相应的方式,后进入主循环。主循环使用阻塞方式,等待鼠标或键盘事件到来(鼠标移动、按键、滚轮,键盘击键),以下为全部代码,并附有详细注释。程序是VC6控制台模式下的,注意Win32函数GetConsoleWindow()的使用,要首先声明它才可使用。

       该程序的事件触发思想很有用,这里用了主循环(线程)里阻塞等待,完全可以新创建线程里阻塞等待。其实这就是一个小型数据采集系统,只不过数据源是鼠标键盘硬件。

 

#include <stdio.h>

#include <dinput.h>

 

#pragma comment(lib,"dxerr8.lib ")

#pragma comment(lib,"dinput8.lib")

#pragma comment(lib,"dxguid.lib")

 

#define SAMPLE_BUFFER_SIZE 16 

extern "C" WINBASEAPI HWND WINAPI GetConsoleWindow ();

HRESULT ReadBufferedData_kb();

HRESULT ReadBufferedData_ms();

 

LPDIRECTINPUT8       g_pDI                  = NULL;        

LPDIRECTINPUTDEVICE8 g_pKeyboard      = NULL;

LPDIRECTINPUTDEVICE8 g_pMouse           = NULL;    

HANDLE               g_Event          = NULL;

 

 

int main()

{

/

//创建事件,为自动型(使用完自动置为无信号状态),初始化为无信号状态

              g_Event = CreateEvent(NULL, FALSE, FALSE, NULL);

 

/

//创建DirectInput8对象

              HRESULT hr;

              if( FAILED( hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,

                                                                              IID_IDirectInput8, (VOID**)&g_pDI, NULL ) ) )

              {

              }

 

//--1--

/

//创建DirectInput8设备(键盘)

              if( FAILED( hr = g_pDI->CreateDevice( GUID_SysKeyboard, &g_pKeyboard, NULL ) ) )

                     return hr;

 

/

//为键盘设置格式

              if( FAILED( hr = g_pKeyboard->SetDataFormat( &c_dfDIKeyboard ) ) )

                     return hr;

 

/

//为键盘设置行为

           hr = g_pKeyboard->SetCooperativeLevel( GetConsoleWindow(), DISCL_BACKGROUND | DISCL_NONEXCLUSIVE );

 

/

//为键盘设置缓冲方式

        DIPROPDWORD dipdw;

 

        dipdw.diph.dwSize       = sizeof(DIPROPDWORD);

        dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);

        dipdw.diph.dwObj        = 0;

        dipdw.diph.dwHow        = DIPH_DEVICE;

        dipdw.dwData            = SAMPLE_BUFFER_SIZE; // Arbitary buffer size

 

        if( FAILED( hr = g_pKeyboard->SetProperty( DIPROP_BUFFERSIZE, &dipdw.diph ) ) )

            return hr;

 

 

/

//为键盘安装事件通知关联,并准备获取采集

              g_pKeyboard->SetEventNotification(g_Event);

              g_pKeyboard->Acquire();

//

 

 

//--2--

/

//创建DirectInput8设备(鼠标),一下过程和键盘设置相同,不再注释

              if( FAILED( hr = g_pDI->CreateDevice( GUID_SysMouse, &g_pMouse, NULL ) ) )

                     return hr;

              if( FAILED( hr = g_pMouse->SetDataFormat( &c_dfDIMouse2 ) ) )

                     return hr;

              hr = g_pMouse->SetCooperativeLevel( GetConsoleWindow(), DISCL_BACKGROUND | DISCL_NONEXCLUSIVE );

 

        dipdw.diph.dwSize       = sizeof(DIPROPDWORD);

        dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);

        dipdw.diph.dwObj        = 0;

        dipdw.diph.dwHow        = DIPH_DEVICE;

        dipdw.dwData            = SAMPLE_BUFFER_SIZE;

 

        if( FAILED( hr = g_pMouse->SetProperty( DIPROP_BUFFERSIZE, &dipdw.diph ) ) )

            return hr;

              g_pMouse->SetEventNotification(g_Event);

              g_pMouse->Acquire();

//

 

 

//

//主线程

              DWORD dwResult=0;

              while(1)

              {

                     dwResult = WaitForSingleObject(g_Event, INFINITE); //无限阻塞

 

 

                     ReadBufferedData_kb(); //读键盘数据并显示

                     ReadBufferedData_ms();//读鼠标数据并显示

              }

//

}

 

HRESULT ReadBufferedData_kb()

{

    TCHAR              strNewText[256*5 + 1] = TEXT("");

    TCHAR              strLetter[50];   

    DIDEVICEOBJECTDATA didod[ SAMPLE_BUFFER_SIZE ];  // Receives buffered data

    DWORD              dwElements;

    DWORD              i;

    HRESULT            hr;

 

    if( NULL == g_pKeyboard )

        return S_OK;

   

    dwElements = SAMPLE_BUFFER_SIZE;

    hr = g_pKeyboard->GetDeviceData( sizeof(DIDEVICEOBJECTDATA),

                                     didod, &dwElements, 0 );

    if( hr != DI_OK )

    {

        hr = g_pKeyboard->Acquire();

        while( hr == DIERR_INPUTLOST )

            hr = g_pKeyboard->Acquire();

 

        // Update the dialog text

        if( hr == DIERR_OTHERAPPHASPRIO ||

            hr == DIERR_NOTACQUIRED )

              {

              }

        return S_OK;

    }

 

    if( FAILED(hr) ) 

        return hr;

    for( i = 0; i < dwElements; i++ )

       {

        wsprintf( strLetter, "0x%02x%s ", didod[ i ].dwOfs,

                                         (didod[ i ].dwData & 0x80) ? "按下" : "抬起");

        strcat( strNewText, strLetter );

    }

    printf("%s",strNewText);

 

    return S_OK;

}

 

 

HRESULT ReadBufferedData_ms()

{

    TCHAR              strNewText[256*5 + 1] = TEXT("");

    TCHAR              strElement[50];   

    DIDEVICEOBJECTDATA didod[ SAMPLE_BUFFER_SIZE ];  // Receives buffered data

    DWORD              dwElements;

    DWORD              i;

    HRESULT            hr;

 

    if( NULL == g_pMouse )

        return S_OK;

   

    dwElements = SAMPLE_BUFFER_SIZE;

    hr = g_pMouse->GetDeviceData( sizeof(DIDEVICEOBJECTDATA),

                                     didod, &dwElements, 0 );

    if( hr != DI_OK )

    {

        hr = g_pMouse->Acquire();

        while( hr == DIERR_INPUTLOST )

            hr = g_pMouse->Acquire();

 

        if( hr == DIERR_OTHERAPPHASPRIO ||

            hr == DIERR_NOTACQUIRED )

              {

              }

        return S_OK;

    }

 

    if( FAILED(hr) ) 

        return hr;

    for( i = 0; i < dwElements; i++ )

    {

        switch( didod[ i ].dwOfs )

        {

            case DIMOFS_BUTTON0:

                strcpy( strElement, " 左键 " );

                break;

 

            case DIMOFS_BUTTON1:

                strcpy( strElement, " 右键 " );

                break;

 

            case DIMOFS_BUTTON2:

                strcpy( strElement, " 中键 " );

                break;

 

            case DIMOFS_BUTTON3:

                strcpy( strElement, "B3" );

                break;

 

            case DIMOFS_X:

                strcpy( strElement, " 水平 " );

                break;

 

            case DIMOFS_Y:

                strcpy( strElement, " 垂直 " );

                break;

 

            case DIMOFS_Z:

                strcpy( strElement, " 滚动 " );

                break;

 

            default:

                strcpy( strElement, "" );

        }

 

        switch( didod[ i ].dwOfs )

        {

            case DIMOFS_BUTTON0:

            case DIMOFS_BUTTON1:

            case DIMOFS_BUTTON2:

            case DIMOFS_BUTTON3:

                if( didod[ i ].dwData & 0x80 )

                    strcat( strElement, " 抬起 " );

                else

                    strcat( strElement, " 按下 " );

                break;

 

            case DIMOFS_X:

            case DIMOFS_Y:

            case DIMOFS_Z:

            {

                TCHAR strCoordValue[255];

                wsprintf( strCoordValue, "%d ", didod[ i ].dwData );

                strcat( strElement, strCoordValue );

                break;

            }

        }

        strcat( strNewText, strElement );

    }

       printf("%s/n",strNewText);

    return S_OK;

}

 

一个DirectInput演示程序相关推荐

  1. 【晒出你的第83行代码】阿里研究员福贝,用一个小演示程序来解释一下 C++11/14 里的 closure 是可以多么的“爽”...

    为什么80%的码农都做不了架构师?>>>    摘要: 在五四青年节之际,社区发起了来晒晒属于你的"第83行"的活动,活动中邀请业界的大牛.大神们来晒代码或者Re ...

  2. 基于python的FFT演示程序

    本章详细介绍如何综合利用之前所学习的numpy,traits,traitsUI和Chaco等多个库,编写一个FFT演示程序.此程序可以帮助你理解FFT是如何将时域信号转换为频域信号的,在开始正式的程序 ...

  3. 【Direct3D游戏开发】——DirectInput 让世界动起来

    其实我们是可以通过Windows消息和API取得键盘或者鼠标或者其他设备的输入信息,但这有个等待windows消息传送的延时,笔者试过直接在消息回调函数中相应键盘的上下左右消息去使场景中的模型进行旋转 ...

  4. 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器 DirectInput专场

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  5. 简单演示程序序列号的破解

    目录 前言 一.测试平台 二.测试步骤 1.查找Message Box 2.比较函数选择 3.序列号寻找(前三部分) 4.第四组序列号破解 总结 前言 本次破解的程序为一个简单演示程序,当输入错误的序 ...

  6. 游戏输入控制利器:DirectInput

    ---------------------------------------------------------------------------------------------------- ...

  7. 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器:DirectInput专场...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8547531 作者:毛星云(浅墨) ...

  8. [转]DirectInput 键盘编程入门

    游戏编程可不仅仅是图形程序的开发工作,实际上包含了许多方面,本文所要讲述的就是关于如何使用 DirectInput 来对键盘编程的问题. 在 DOS 时代,我们一般都习惯于接管键盘中断来加入自己的处理 ...

  9. 一个LINUX狂人的语录[转]

    我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的工作. GNU/Linux 不是每个人都想用的.如果你只需要处理一般的事务,打游戏,那么你不需要了解下面这些了. 我不 ...

  10. 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器:DirectInput专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8547531 作者:毛星云(浅墨 ...

最新文章

  1. AlphaGo“兄弟”AlphaFold出世,DeepMind再创记录
  2. Linux之编辑器 vim
  3. 分布式任务调度平台XXL-JOB本地配置可能遇到的问题和解决方案
  4. memcached+magent实现memcached集群
  5. OpenCV学习笔记十一-findcounters函数
  6. Idea创建web项目,配置tomcat服务器
  7. python编程入门教程100例_Python3入门经典100例(60-70)
  8. Facebook告诉我们如何构建网站
  9. 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
  10. 高级着色语言HLSL入门(6)
  11. STM32电机库5.4开源注释 KEIL工程文件 辅助理解S STM32电机库5.4开源注释
  12. kubernet-- windows之kubectl的安装及使用(巧克力)
  13. 区块链亲民应用场景大猜想 第一次或将献给超大文件传输
  14. FTTH?FTTB?
  15. 微软向行业推介《欧盟通用数据保护条例》遵从指南
  16. 成都的IT研发产业和芯片产业等情况:2006年初的数据。
  17. 未来,什么样的程序员才是不可替代的?
  18. 生活随记-下周很重要
  19. 怪诞行为学中的一些例子
  20. 开启火狐浏览器的账号密码导入功能

热门文章

  1. java jquery时间问候语,js实现实时问候,不同时间显示不同问候语
  2. python开发环境一般用哪个_python开发环境哪个好用?如何搭建?
  3. 每个叶子节点(nil)是黑色。_129. 求根到叶子节点数字之和
  4. python time sleep 阻塞 异步_python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)...
  5. python取列表前几个元素_从Python列表中获取前n个唯一元素
  6. java 处理时间的类_详解JAVA 时间处理相关类
  7. android 圆形相机预览拍照_Android Camera2 Api 实现预览和拍照
  8. ukf实测信号的预测 matlab,无迹卡尔曼滤波UKF无线传感器网络定位跟踪matlab源码实现.pdf...
  9. Introduction to Computer Networking学习笔记(二十七):BitTorrent
  10. 抗锯齿_《战地V》深度学习抗锯齿性能测试:对它最友好的竟然是4K