<meta content="MSHTML 6.00.2900.3199" name="GENERATOR">
<style></style>2007年10月12日 01:49:00
作者:樊一鹏
前回同大家简单介绍了如何用
DirectInput 来进行键盘编程,本回所要讲述的就该是关于如何使用
DirectInput 来对另一个非常重要的输入设备----鼠标的编程问题。
鼠标的编程同键盘编程的过程是非常相似的,有了上次的基础,你很快就能看出两者在形式上其实完全是大同小异的。
DIRECTINPUT 的初始化
同前面讲键盘编程的过程一样,我们还是先从 DIRECTINPUT 的初始化开始吧:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->#include >dinput.h
#define DINPUT_BUFFERSIZE 16
LPDIRECTINPUT lpDirectInput; // DirectInput object
LPDIRECTINPUTDEVICE lpMouse; // DirectInput device
BOOL InitDInput(HWND hWnd)
{
HRESULT hr;
// 创建一个 DIRECTINPUT 对象
hr = DirectInputCreate(hInstanceCopy, DIRECTINPUT_VERSION, &lpDirectInput, NULL);
if FAILED(hr)
{
// 失败
return FALSE;
}
// 创建一个 DIRECTINPUTDEVICE 界面
hr = lpDirectInput-CreateDevice(GUID_SysMouse, &lpMouse, NULL);
if FAILED(hr)
{
// 失败
return FALSE;
}
// 设定查询鼠标状态的返回数据格式
hr = lpMouse-SetDataFormat(&c_dfDIMouse);
if FAILED(hr)
{
// 失败
return FALSE;
}
// 设定协作模式
hr = lpMouse-SetCooperativeLevel(hWnd, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
if FAILED(hr)
{
// 失败
return FALSE;
}
// 设定缓冲区大小
// 如果不设定,缓冲区大小默认值为 0,程序就只能按立即模式工作
// 如果要用缓冲模式工作,必须使缓冲区大小超过 0
DIPROPDWORD property;
property.diph.dwSize = sizeof(DIPROPDWORD);
property.diph.dwHeaderSize = sizeof(DIPROPHEADER);
property.diph.dwObj = 0;
property.diph.dwHow = DIPH_DEVICE;
property.dwData = DINPUT_BUFFERSIZE;
hr = lpMouse-SetProperty(DIPROP_BUFFERSIZE, &property.diph);
if FAILED(hr)
{
// 失败
return FALSE;
}
hr = lpMouse-Acquire();
if FAILED(hr)
{
// 失败
return FALSE;
}
return TRUE;
}
除了少数几处改动以外,这段代码同前面讲的键盘编程的代码基本上完全一样。
注意调用 CreateDevice 来建立一个 DIRECTINPUTDEVICE 界面时,我们用的参数是 GUID_SysMouse 而不是 GUID_SysKeyboard,我们以此来指明了建立的是鼠标对象。相应的,在用 SetDataFormat 来设定返回数据的格式时,我们用的参数是 &c_dfDIMouse 而不是 &c_dfDIKeyboard。
还有要特别注意的是,前面讲到的键盘,在设置协作方式时,是只能按非独占方式工作的,而鼠标即可以按非独占方式工作,也可以按独占方式工作。
DIRECTINPUT 的数据查询
在作 DIRECTINPUT 的鼠标数据查询时,我一般都是使用的缓冲模式而不是立即模式。原因很简单,因为鼠标移动事件的频率很高,按立即模式去处理就很难保证不丢失数据。至于 DIRECTX SDK 里的例程使用立即模式读取数据则是因为它们用了一个多媒体计时器来保证以每秒三十次的频率处理接受鼠标数据。
明白这一点后,下面我们就来看看相应的代码。由于 DIRECTX SDK 里的例程有立即模式的代码,我就偷点懒,下面只给出了一段缓冲模式下的代码:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->HRESULT UpdateInputState(void)
{
DWORD i;
if(lpMouse != NULL)
{
DIDEVICEOBJECTDATA didod; // Receives buffered data
DWORD dwElements;
HRESULT hr;
while(TRUE)
{
dwElements = 1; // 每次从缓冲区中读一个数据
hr = lpMouse-GetDeviceData(sizeof(DIDEVICEOBJECTDATA), &didod, &dwElements, 0);
if FAILED(hr)
{
// 发生了一个错误
if(hr == DIERR_INPUTLOST)
{
hr = lpMouse-Acquire(); // 试图重新取回设备
if FAILED(hr)
{
return S_FALSE; // 失败
}
}
}
else
if(elements == 1)
{
switch(didod.dwOfs)
{
case DIMOFS_X: // X 轴偏移量
// didod.dwData 里是具体偏移相对值,单位为像素
break;
case DIMOFS_Y: // Y 轴偏移量
// didod.dwData 里是具体偏移相对值,单位为像素
break;
case DIMOFS_BUTTON0: // 0 号键(左键)状态
// didod.dwData 里是具体状态值
// 低字节最高位为 1 则表示按下
// 低字节最高位为 0 表示未按下
break;
case DIMOFS_BUTTON1: // 1 号键(右键)状态
// 同上
break;
case DIMOFS_BUTTON2: // 2 号键(中键)状态
// 同上
break;
case DIMOFS_BUTTON3: // 3 号键状态
// 同上
break;
}
}
else if (elements == 0) break; // 缓冲区读空
}
}
return S_OK;
}
这段代码注释得非常详细,相信你很快就能看懂。
DIRECTINPUT 的结束处理
还记得当程序结束时必须要进行的释放处理吧,其代码如下:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->void ReleaseDInput(void)
{
if (lpDirectInput)
{
if(lpMouse)
{
// Always unacquire the device before calling Release().
lpMouse-Unacquire();
lpMouse-Release();
lpMouse = NULL;
}
lpDirectInput-Release();
lpDirectInput = NULL;
}
}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1821040
相关推荐
斑马打印机ZT411和ZT421是工业级条码和标签打印机,广泛应用于制造业、物流、零售业等对打印质量和效率有高要求的领域。这两款打印机以其出色的性能、耐用性和易用性赢得了用户的信赖。这份中文手册详细地介绍了ZT...
"斑马打印机ZT210用户指南" 本用户指南旨在为Zebra ZT210/ZT220/ZT230打印机的用户提供操作和维护指南,该设备是一种工业级的条码打印机,具有高速打印、高速处理和高质量打印输出等特点。 版权信息 本手册的版权...
本资源"Linux下编程的三个重要工具(ZT)"似乎提供了一些关键工具的介绍,虽然具体细节未在描述中详述,但我们可以根据常见的编程工具来探讨这三个可能的重要工具。以下是Linux编程中经常使用的三大工具的详细讲解:...
《ZT213/ZT213LEEA:低功耗RS232多通道USB收发器/驱动器芯片详解》 ZT213/ZT213LEEA是一款专为低功耗应用设计的RS232多通道USB收发器和驱动器芯片,广泛应用于数据通信、工业控制、物联网设备等领域。本文将深入...
- 文件格式:这种文件可能是.ZPL(Zebra Programming Language)或.EPL(Eltron Programming Language)格式,这两种是斑马打印机常用的编程语言,用于控制打印机的行为,包括字体设置。 4. **安装与使用** - ...
ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机ZT410打印机IP地址设置网络打印机
斑马(Zebra)ZT230条码打印机是一款广泛应用在工业环境中的高效设备,其驱动程序是确保打印机正常工作的重要组成部分。本驱动程序专为Zebra的ZT210、ZT220及ZT230系列打印机设计,提供了全面的功能支持,以实现高...
ZT7548是一款第五代电容式触控屏幕控制器,支持30x18或18x30的通道配置,可以同时检测最多10个触点。该控制器能够与最多8个键与TSP(触控屏面板)或FPC(柔性印刷电路板)模式一起工作,在多点触控时无扫描率下降的...
斑马打印机ZT210是一款专业的工业级条形码和标签打印机,广泛应用于物流、零售、医疗等行业的标签制作。以下是对如何设置和使用斑马ZT210打印机的详细步骤: 首先,我们需要安装电脑驱动。双击下载好的驱动程序文件...
然而,由于调用过程可能较为复杂,开发者需要有扎实的嵌入式系统知识和编程基础,以便顺利地集成到自己的项目中。 压缩包内的"ZTPinpad-V3.5"可能是SDK的主文件夹,其中可能包含以下内容: 1. **Header Files**:...
斑马ZT510打印机驱动文件
RS485通信芯片ZT13085E是一种常用的工业级串行通信接口芯片,主要用于构建远程、多节点的通信网络。在工业自动化、楼宇自动化、物联网设备等领域有广泛应用。ZT13085E的设计目标是提供一种高效、可靠的数据传输方式...
这两个型号的打印机都属于入门级工业级条码打印机,适用于各种商业和工业环境,如零售、物流、医疗和制造业等。本篇将深入探讨ZT210和ZT230打印机如何正确加载介质和碳带,确保高效且高质量的打印效果。 1. **介质...
赠送jar包:zt-exec-1.9.jar; 赠送原API文档:zt-exec-1.9-javadoc.jar; 赠送源代码:zt-exec-1.9-sources.jar; 赠送Maven依赖信息文件:zt-exec-1.9.pom; 包含翻译后的API文档:zt-exec-1.9-javadoc-API文档-...
斑马zt210是一款专为中国市场设计的工业条码打印机,非常适合不需要频繁更换标签的条码标签应用。这里给大家提供斑马zt210驱动下载,推荐有需要的用户下载安装。斑马zt210打印机优势:◆ 节省空间* 小巧紧凑和流线型...
赠送jar包:zt-exec-1.9.jar; 赠送原API文档:zt-exec-1.9-javadoc.jar; 赠送源代码:zt-exec-1.9-sources.jar; 赠送Maven依赖信息文件:zt-exec-1.9.pom; 包含翻译后的API文档:zt-exec-1.9-javadoc-API文档-...
### zebra ZT400系列打印机技术手册 #### 知识点概述: 1. **版权及法律声明**:Zebra ZT400系列打印机技术手册的版权及相关软件固件的所有权归属ZIH Corp.及其许可证持有者,未经授权复制会受到法律制裁。 2. **...
斑马Zebra ZT510 驱动下载安装 使用中有任何问题可以关注并私信,如果资源对您有帮助记得关注收藏好评哟!