刀塔2游戏中发消息,为啥按回车键没反应,按小键盘enter失灵键才能发消息。

查看: 8032|回复: 32
如何向其它窗口发送小键盘的enter键!??
阅读权限20
在线时间 小时
如题,sendkeys不能区分大键盘的enter与小键盘的enter,我用api的keybd_event与postmessage貌似也解决不了,求高人相助!
阅读权限50
在线时间 小时
不知道这样行不行SendKeys vbKeySeparator
阅读权限20
在线时间 小时
这个试过了,没有用的,,,,,谢谢
阅读权限50
在线时间 小时
除非你碰到了directinput,那样的话模拟的东西它不认的.要到底层去想办法(是在写游戏模拟吗?)
阅读权限50
在线时间 小时
在windows中,普通应用程序是无权操作端口的,于是我们就需要一个驱动程序来帮助我们实现。在这里我们可以使用一个组件WINIO来完成读写端口操作。什么是WINIO?WINIO是一个全免费的、无需注册的、含源程序的WINDOWS2000端口操作驱动程序组件(可以到上去下载)。它不仅可以操作端口,还可以操作内存;不仅能在VB下用,还可以在DELPHI、VC等其它环境下使用,性能特别优异。下载该组件,解压缩后可以看到几个文件夹,其中Release文件夹下的3个文件就是我们需要的,这3个文件是WinIo.sys(用于win&xp下的驱动程序),WINIO.VXD(用于win&98下的驱动程序),WinIo.dll(封装函数的动态链接库),我们只需要调用WinIo.dll中的函数,然后WinIo.dll就会安装并调用驱动程序来完成相应的功能。值得一提的是这个组件完全是绿色的,无需安装,你只需要把这3个文件复制到与你的程序相同的文件夹下就可以使用了。用法很简单,先用里面的InitializeWinIo函数安装驱动程序,然后就可以用GetPortVal来读取端口或者用SetPortVal来写入端口了。好,让我们来做一个驱动级的键盘模拟吧。先把winio的3个文件拷贝到你的程序的文件夹下,然后在VB中新建一个工程,添加一个模块,在模块中加入下面的winio函数声明:Declare&Function&MapPhysToLin&Lib&"WinIo.dll"&(ByVal&PhysAddr&As&Long,&ByVal&PhysSize&As&Long,&ByRef&PhysMemHandle)&As&LongDeclare&Function&UnmapPhysicalMemory&Lib&"WinIo.dll"&(ByVal&PhysMemHandle,&ByVal&LinAddr)&As&BooleanDeclare&Function&GetPhysLong&Lib&"WinIo.dll"&(ByVal&PhysAddr&As&Long,&ByRef&PhysVal&As&Long)&As&BooleanDeclare&Function&SetPhysLong&Lib&"WinIo.dll"&(ByVal&PhysAddr&As&Long,&ByVal&PhysVal&As&Long)&As&BooleanDeclare&Function&GetPortVal&Lib&"WinIo.dll"&(ByVal&PortAddr&As&Integer,&ByRef&PortVal&As&Long,&ByVal&bSize&As&Byte)&As&BooleanDeclare&Function&SetPortVal&Lib&"WinIo.dll"&(ByVal&PortAddr&As&Integer,&ByVal&PortVal&As&Long,&ByVal&bSize&As&Byte)&As&BooleanDeclare&Function&InitializeWinIo&Lib&"WinIo.dll"&()&As&BooleanDeclare&Function&ShutdownWinIo&Lib&"WinIo.dll"&()&As&BooleanDeclare&Function&InstallWinIoDriver&Lib&"WinIo.dll"&(ByVal&DriverPath&As&String,&ByVal&Mode&As&Integer)&As&BooleanDeclare&Function&RemoveWinIoDriver&Lib&"WinIo.dll"&()&As&Boolean'&------------------------------------以上是WINIO函数声明-------------------------------------------Declare&Function&MapVirtualKey&Lib&"user32"&Alias&"MapVirtualKeyA"&(ByVal&wCode&As&Long,&ByVal&wMapType&As&Long)&As&Long'-----------------------------------以上是WIN32&API函数声明-----------------------------------------再添加下面这个过程:Sub&KBCWait4IBE()&&&'等待键盘缓冲区为空Dim&dwVal&As&Long&&Do&&GetPortVal&&H64,&dwVal,&1'这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中'GetPortVal函数的用法是GetPortVal&端口号,存放读出数据的变量,读入的长度&&Loop&While&(dwVal&And&&H2)End&Sub上面的是一个根据KBC规范写的过程,它的作用是在向键盘端口写入数据前等待一段时间,后面将会用到。然后再添加如下过程,这2个过程用来模拟按键:Public&Const&KBC_KEY_CMD&=&&H64&&&&'键盘命令端口Public&Const&KBC_KEY_DATA&=&&H60&&&'键盘数据端口Sub&MyKeyDown(ByVal&vKeyCoad&As&Long)&&&'这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码Dim&btScancode&As&LongbtScancode&=&MapVirtualKey(vKeyCoad,&0)&&&&&&KBCWait4IBE&&&'发送数据前应该先等待键盘缓冲区为空&&&&SetPortVal&KBC_KEY_CMD,&&HD2,&1&&&&&'发送键盘写入命令'SetPortVal函数用于向端口写入数据,它的用法是SetPortVal&端口号,欲写入的数据,写入数据的长度&&&&KBCWait4IBE&&&&SetPortVal&KBC_KEY_DATA,&btScancode,&1&&'写入按键信息,按下键&&&&End&Sub&Sub&MyKeyUp(ByVal&vKeyCoad&As&Long)&&&'这个用来模拟释放键,参数vKeyCoad传入按键的虚拟码Dim&btScancode&As&LongbtScancode&=&MapVirtualKey(vKeyCoad,&0)&&&&&&KBCWait4IBE&&&'等待键盘缓冲区为空&&&&SetPortVal&KBC_KEY_CMD,&&HD2,&1&&'发送键盘写入命令&&&&KBCWait4IBE&&&&SetPortVal&KBC_KEY_DATA,&(btScancode&Or&&H80),&1&&'写入按键信息,释放键End&Sub定义了上面的过程后,就可以用它来模拟键盘输入了。在窗体模块中添加一个定时器控件,然后加入以下代码:Private&Sub&Form_Load() &If&InitializeWinIo&=&False&Then&&&&&'用InitializeWinIo函数加载驱动程序,如果成功会返回true,否则返回false&&&&MsgBox&"驱动程序加载失败!"&&&&Unload&Me&End&IfTimer1.Interval=3000Timer1.Enabled=TrueEnd&SubPrivate&Sub&Form_Unload(Cancel&As&Integer)&ShutdownWinIo&'程序结束时记得用ShutdownWinIo函数卸载驱动程序End&SubPrivate&Sub&Timer1_Timer()Dim&VK_A&as&Long&=&&H41&MyKeyDown&VK_A&&&&MyKeyUp&VK_A&&&&'模拟按下并释放A键End&Sub[/quote]运行上面的程序,就会每隔3秒钟模拟按下一次A键,试试看,怎么样,是不是对所有程序都有效果了?需要注意的问题:要在VB的调试模式下使用WINIO,需要把那3个文件拷贝到VB的安装目录中。键盘上有些键属于扩展键(比如键盘上的方向键就是扩展键),对于扩展键不应该用上面的MyKeyDown和MyKeyUp过程来模拟,可以使用下面的2个过程来准确模拟扩展键:Sub&MyKeyDownEx(ByVal&vKeyCoad&As&Long)&&&'模拟扩展键按下,参数vKeyCoad是扩展键的虚拟码Dim&btScancode&As&LongbtScancode&=&MapVirtualKey(vKeyCoad,&0)&&&&KBCWait4IBE&&&'等待键盘缓冲区为空&&&&SetPortVal&KBC_KEY_CMD,&&HD2,&1&&&&&'发送键盘写入命令&&&&KBCWait4IBE&&&&SetPortVal&KBC_KEY_DATA,&&HE0,&1&&'写入扩展键标志信息&&&&&&&&&&&&KBCWait4IBE&&&'等待键盘缓冲区为空&&&&SetPortVal&KBC_KEY_CMD,&&HD2,&1&&&&&'发送键盘写入命令&&&&KBCWait4IBE&&&&SetPortVal&KBC_KEY_DATA,&btScancode,&1&&'写入按键信息,按下键&&&&&&&&End&SubSub&MyKeyUpEx(ByVal&vKeyCoad&As&Long)&&&'模拟扩展键弹起Dim&btScancode&As&LongbtScancode&=&MapVirtualKey(vKeyCoad,&0)&&&&KBCWait4IBE&&&'等待键盘缓冲区为空&&&&SetPortVal&KBC_KEY_CMD,&&HD2,&1&&&&&'发送键盘写入命令&&&&KBCWait4IBE&&&&SetPortVal&KBC_KEY_DATA,&&HE0,&1&&'写入扩展键标志信息&&&&&&&&&&&&KBCWait4IBE&&&'等待键盘缓冲区为空&&&&SetPortVal&KBC_KEY_CMD,&&HD2,&1&&&&&'发送键盘写入命令&&&&KBCWait4IBE&&&&SetPortVal&KBC_KEY_DATA,&(btScancode&Or&&H80),&1&&'写入按键信息,释放键&&&&End&Sub还应该注意的是,如果要从扩展键转换到普通键,那么普通键的KeyDown事件应该发送两次。也就是说,如果我想模拟先按下一个扩展键,再按下一个普通键,那么就应该向端口发送两次该普通键被按下的信息。比如,我想模拟先按下左方向键,再按下空格键这个事件,由于左方向键是扩展键,空格键是普通键,那么流程就应该是这样的:[quote]MyKeyDownEx&VK_LEFT&&&'按下左方向键Sleep&200&&&&&&&&&&&&&'延时200毫秒MyKeyUpEx&VK_LEFT&&&&&'释放左方向键Sleep&500MyKeyDown&VK_SPACE&&&'按下空格键,注意要发送两次MyKeyDown&VK_SPACESleep&200MyKeyUp&VK_SPACE&&&&&'释放空格键
阅读权限20
在线时间 小时
感谢楼上热心的帮助,但我是在公司里用,是无法连接外网的,东西也传不进去,管的很严,只能通过现有的手段的去编辑,,,,,再次感谢!回4楼,换个想法,我想把小键盘的enter送到一个txt文档中,怎么作?要小键盘的!1Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As LongSub ss()AppActivate "无标题 - 记事本"Call keybd_event(vbKeySeparator, MapVirtualKey(vbKeySeparator, 0), 0, 0)&Call keybd_event(vbKeySeparator, MapVirtualKey(vbKeySeparator, 0), KEYEVENTF_KEYUP, 0)End Sub2Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Sub CommandButton1_Click()&&& Dim jsb As Long&&& jsb = FindWindow(vbNullString, "无标题 - 记事本")&&&&PostMessage mhwnd, WM_KEYDOWN, vbKeySeparator, 0End Sub但上面的都是无效,,,,,,
阅读权限50
在线时间 小时
主程序窗口本身不能接受按键消息,所以没有反应.FindWindow取记事本主窗口, EnumChildWindows取编辑框句柄,向它发消息就可以了.
阅读权限20
在线时间 小时
楼上的大大,给个例子吧,不懂啊!!!
阅读权限20
在线时间 小时
先去睡了,但愿明天会有结果!!
阅读权限50
在线时间 小时
最新热点 /1
美好的事情正在发生!当当网ExcelHome图书限时满200-100,活动至6月3日零点!购买猛戳下面“查看”了解。
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师

我要回帖

更多关于 笔记本回车键没反应 的文章

 

随机推荐