社区
C++ Builder
帖子详情
关于模拟按键::急
Micro_J
2001-08-17 10:32:45
我的程序要实现模拟按键的功能,但无论我用keybd_event或PostMessage,
对一般程序都非常成功地实现,唯对一些需DirectX的程序无效,例如模拟器。
是不是它用了Direct Input后我就无法模拟按键了?
...全文
941
26
打赏
收藏
关于模拟按键::急
我的程序要实现模拟按键的功能,但无论我用keybd_event或PostMessage, 对一般程序都非常成功地实现,唯对一些需DirectX的程序无效,例如模拟器。 是不是它用了Direct Input后我就无法模拟按键了?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Dala
2001-09-06
打赏
举报
回复
在DirectX SDK的例子中有你的答案。
assay
2001-09-06
打赏
举报
回复
好象没回答问题。
yushaofeng
2001-08-27
打赏
举报
回复
study
good luck to you
8080
2001-08-27
打赏
举报
回复
把ASCII码值直接写到键盘缓存里
assay
2001-08-27
打赏
举报
回复
后面有关鼠标和键盘输入的章节?
kyosuke
2001-08-27
打赏
举报
回复
在讲解了复杂的鼠标和游戏杆输入之后,我们在这里用简单的篇幅讲解一下键盘输入。对于DirectInput来说,键盘是作为一个高效的游戏控制器来处理的。如果你要输入文本,那么你可以使用Windows提供的标准服务。在独占模式中,我们是不能获取键盘数据的,我们所能获得的是WM_KEYDOWN、WM_KEYUP和WM_CHAR消息以及由GetDeviceState和GetDeviceData所返回的输入值。在DInput例子程序中,应用程序通过对Ctrl-F的响应就说明了这一点。26.1 一个有101个按钮的游戏板就像DirectX SDK文档中所说的一样,在DirectInput情况下,键盘并不是文本输入设备,而是一块带有很多按钮的游戏板。虽然在键盘中并没有轴(游戏板中有),但它们还是具有很大的相似性的。在消息传递系统中,Windows在把一个按钮消息发送到消息队列之前要对它做很多处理。它要判断一个键是否被按下,如果是这样的话,那么就检查所按下的时间并与控制面板中设置好的重复延时和重复速率相比较。在生成消息的时候,Windows还要处理物理键所代表的虚拟键(VirtualKey)以及组合键的使用等。对于GetAsyncKeyState这类函数,它所返回的也是Windows处理过的数据。在DirectInput中,情况却完全不是这样的,它所关心的仅是两件事情:某个键是否被按下和这个键的代码是什么。为了实现事件通知和基于缓冲区的数据,DirectInput把键状态的改变翻译成一次按键事件和一次释放事件。但在一个键被按下时,不管按下多长时间,它所触发的仅是一个单一的事件。用一对一的方法,DirectInput把扫描码转换成一个从0到255之间的数值,并且这些数值都用DIK_*的方式来定义(参见表26-1)。与Windows的键盘服务不一样,DirectInput要区分两个具有相同名字的键,如主键盘和数字键盘上的Enter键。另外与Windows服务不一样的是,DirectInput以相同的方式处理每一个键,而不管这个键是字母、数字还是Alt、Scroll Lock等键。当然,DirectInput在某些特殊的情况下还是会执行一些转换操作。例如,NEC键盘所生成的并不是标准的扫描码,这时DirectInput就会自动把它转换成标准的PC键盘扫描码。如果你们所开发的应用程序是面对国际市场的,那么还要注意日本的键盘上有些键是不存在的,而在美国式的键盘上,则有一些非标准的附加键。关于这些信息,请参考DirectInput SDK的文档。
26.2 直接的键盘数据读取键盘的状态再也没有这么简单了,你只需申明一个256字节的数组然后再调用IDirectInputDevice::GetDeviceState。注意,你并不需要在调用IDirectInputDevice::GetDeviceState之前调用Poll,这是因为键盘数据总是由中断产生的。char keys[256];HRESULT hr = g_lpdid2->GetDeviceState( sizeof( keys ), keys );现在你可以访问这个数组并用DIK_*数值来判断任何键的状态。与以前一样,如果字节的高位被置成1,则说明键是被按下;如果是0说明键没有被按下。If ( keys[DIK_LMENU] & 0 ×80 ) {;} // Ieft Alt is down.表26-1 DirectInput键盘常数键名别名注释DIK_ESCAPDIK_1在主键盘上DIK_2在主键盘上DIK_3在主键盘上DIK_4在主键盘上DIK_5在主键盘上DIK_6在主键盘上DIK_7在主键盘上DIK_8在主键盘上DIK_9在主键盘上DIK_0在主键盘上DIK_MINUS在主键盘上DIK_EQUALS在主键盘上DIK_BACKDIK_BACKSPACEBackspace键DIK_TABDIK_QDIK_WDIK_EDIK_RDIK_TDIK_YDIK_UDIK_IDIK_ODIK_PDIK_LBRACKET [键DIK_RBRACKET ]键DIK_RETURN键盘上的回车键DIK_LCONTROL左Ctrl键DIK_ADIK_SDIK_DDIK_FDIK_GDIK_HDIK_JDIK_KDIK_LDIK_SEMICOLONDIK_APOSTROPHEDIK_GRAVE'键DIK_LSHIFT左Shift键DIK_BACKSLASHDIK_ZDIK_XDIK_CDIK_VDIK_BDIK_NDIK_MDIK_COMMADIK_PERIOD在主键盘上DIK_SLASH在主键盘上DIK_RSHIFT右Shift键DIK_MULTIPLYDIK_NUMPADSTAR数字键盘上的*键DIK_LMENUDIK_LALT左Alt键DIK_SPACE空格DIK_CAPITALDIK_CAPSLOCK DIK_F1DIK_F2DIK_F3DIK_F4DIK_F5DIK_F6DIK_F7DIK_F8DIK_F9DIK_F10DIK_NUMLOCKDIK_SCROLLScroll Lock键DIK_NUMPAD7 DIK_NUMPAD8 DIK_NUMPAD9 DIK_SUBTRACTDIK_NUMPADMINUS数字键盘上的-键DIK_NUMPAD4 DIK_NUMPAD5DIK_NUMPAD6DIK_ADDDIK_NUMPADPLUS数字键盘上的+键DIK_NUMPAD1DIK_NUMPAD2DIK_NUMPAD3DIK_NUMPAD0DIK_DECIMALDIK_NUMPADPERIOD数字键盘上的.键DIK_F11DIK_F12 DIK_F13DIK_F14 DIK_F15 DIK_KANA在日本键盘上DIK_CONVERT在日本键盘上DIK_NOCONVERT在日本键盘上DIK_YEN在日本键盘上DIK_NUMPADEQUALS在数字键盘上(NECPC98)DIK_CIRCUMFLEX在日本键盘上DIK_AT在日本键盘上DIK_COLON在日本键盘上DIK_UNDERLINE在日本键盘上DIK_KANJI在日本键盘上DIK_STOP在日本键盘上DIK_AX在日本键盘上DIK_UNLABELED在日本键盘上DIK_NUMPADENTER DIK_RCONTROL右Ctrl键DIK_NUMPADCOMMANEC PC98数字键盘上的逗号DIK_DIVIDEDIK_NUMPADSLASH数字键盘上的/号DIK_SYSRQDIK_RMENUDIK_RALT右Alt键DIK_HOMEDIK_UPDIK_UPARROWDIK_PRIORDIK_PGUPPageUp键DIK_LEFTDIK_LEFTARROWDIK_RIGHTDIK_RIGHTARROWDIK_ENDDIK_DOWNDIK_DOWNARROW下向箭头键DIK_NEXTDIK_PGDNPageDown键DIK_INSERTDIK_DELETEDIK_LWIN左边Windows徽标键DIK_RWIN右边Windows徽标键DIK_APPS应用程序键
26.3 基于缓冲区的键盘数据DirectInput是用基于缓冲区数据的方法来处理键盘输入的,对于这一点我们不必感到奇怪。从键盘中读取基于缓冲区的输入就像读取游戏杆和鼠标的按键输入一样。与以前一样,每一个基于缓冲区的事件都与DIDEVICEOBJECTDATA结构的dwOfs成员变量中的设备物相联系。在这种情况下,.......。如果事件被按下,那么dwData成员变量的0x80位被置成1;如果事件被释放,那么dwData成员变量的0x80位被置成0。26.3.1 处理数据的丢失到目前为止,我们还没有谈到这样的一个问题:对于基于缓冲区的数据,怎样处理数据流被打断的情况。这种情况不仅仅会出现在键盘设备上,在其他的任何设备上它都可能会出现。数据流的打断会以如下两种方式出现:1. 设备被强制性地失去获取状态——例如,当原来具有前端协作级别的应用程序被移到后端时,GetDeviceData函数失败并且返回DIERR_INPUTLOST。如果应用程序在重新获取设备时失败,那么下一次调用GetDeviceData将返回DIERR_NOTACQUIRED。2. 缓冲区溢出。GetDeviceData函数执行成功,但返回DI_BUFFEROVERFLOW。这表明某些数据没有被返回而且这些数据永远地丢失了。假设应用程序在GetDeviceData函数获取空格键被按下事件时开始进行射击,而在空格键被释放时停止射击。如果用户在按下空格键和释放空格键中间碰巧用鼠标单击了另一个窗口程序,那么应用程序是不会停止射击的,这是因为应用程序将丢失键盘的信息,从而导致它不能获取空格键的释放事件。为了从上述情形下恢复正常,我们将不得不立即调用GetDeviceState函数以重新获取设备。对于出现DI_BUFFEROVERFLOW结果的情况也一样。
26.4 总结n DirectInput把键盘当作一组按钮来处理,它并不关心键的组合状态。如果你想处理字符与控制键的组合状态,那么可以通过响应WM_CHAR消息来实现。n 键盘上的键都已经用DIK_*定义,这些数值分别与用于返回立即数值的一个256字节的缓冲区相对应。n 从键盘设备返回缓冲区数据与从鼠标和游戏杆设备中返回缓冲区数据完全一样。n 在返回基于缓冲区的数据时,应用程序必须随时准备恢复意外丢失的键释放事件。
kyosuke
2001-08-23
打赏
举报
回复
如果用户是DirectInput编程的新手,那么应先排除掉一些旧观念。应记住的重要一点是DirectInput的得名是因为它直接与设备驱动器通讯,对鼠标和键盘也就意味着立即响应硬件中断,而不是等待Windows发送消息证明已发生输入事件。当然,DirectInput放弃了Windows的消息队列,在虚构WM_KEYDOWN或WM_MOVSEMOVE等消息的同时也就不再享受Windows提供的一些服务。这种服务大都不是对游戏输入特别有用,但它有助于理解缺少这些服务时所产生输入信息的含义,后面有关鼠标和键盘输入的章节中,将深入地讨论这一问题。
kimryo
2001-08-23
打赏
举报
回复
用ASM一定行...
assay
2001-08-23
打赏
举报
回复
up
Micro_J
2001-08-22
打赏
举报
回复
怎么用钩子夺过对键盘控制的权力呢?我只会用钩子监视键盘。
HeavenGarden
2001-08-21
打赏
举报
回复
可以使用钩子夺过对键盘控制的权力,再实现模拟按键就行了
Micro_J
2001-08-21
打赏
举报
回复
用钩子?
用钩子好象只能监控按键,不能模拟按键吧?
assay
2001-08-21
打赏
举报
回复
确实如此
assay
2001-08-20
打赏
举报
回复
up
Micro_J
2001-08-20
打赏
举报
回复
up
HeavenGarden
2001-08-20
打赏
举报
回复
好像要用的钩子函数才能实现吧
yushaofeng
2001-08-20
打赏
举报
回复
study
◎§◎
◇
wildhorse01
2001-08-20
打赏
举报
回复
学习:)
xycleo
2001-08-20
打赏
举报
回复
不懂啊!!!只好关注
Micro_J
2001-08-20
打赏
举报
回复
up
加载更多回复(6)
基于
按键
控制的直流电机正反转与
急
停功能设计:51单片机C程序设计及Proteus仿真报告,51单片机正反转可控的直流电机设计 C程序、proteus仿真、报告 支持
按键
设置直流电机的正转、反转、
急
停
基于
按键
控制的直流电机正反转与
急
停功能设计:51单片机C程序设计及Proteus仿真报告,51单片机正反转可控的直流电机设计 C程序、proteus仿真、报告 支持
按键
设置直流电机的正转、反转、
急
停。 ,核心关键词:51单片机; 直流电机设计; C程序; Proteus仿真;
按键
设置; 正反转可控;
急
停功能。,"基于51单片机的直流电机正反转控制设计:C程序实现、Proteus仿真与报告"
CSGO自动
急
停1221_emergency_csgo自动
急
停_csgo_
CSG哦Csgo automatic emergency stop
模拟
电梯控制单片机技能竞赛
模拟
题.pdf
模拟
电梯控制单片机技能竞赛
模拟
题.pdf
51单片机正反转可控的直流电机设计 C程序、proteus仿真、报告 支持
按键
设置直流电机的正转、反转、
急
停
51单片机正反转可控的直流电机设计 C程序、proteus仿真、报告 支持
按键
设置直流电机的正转、反转、
急
停。
基于
按键
控制的直流电机正反转与
急
停功能设计:基于51单片机C程序与Proteus仿真报告,基于51单片机的直流电机正反转控制与Proteus仿真设计报告,51单片机正反转可控的直流电机设计 C程序、p
基于
按键
控制的直流电机正反转与
急
停功能设计:基于51单片机C程序与Proteus仿真报告,基于51单片机的直流电机正反转控制与Proteus仿真设计报告,51单片机正反转可控的直流电机设计 C程序、proteus仿真、报告 支持
按键
设置直流电机的正转、反转、
急
停。 ,51单片机;正反转可控直流电机设计;C程序;proteus仿真;
按键
设置;
急
停功能;报告,基于51单片机的直流电机正反转控制设计:C程序实现、Proteus仿真与报告
C++ Builder
13,871
社区成员
102,693
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章