打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
[原创]Delphi模拟按键[不用WINIO并支持后台送键][申请加精]|::::广海游戏::::

Delphi模拟按键[不用WINIO并支持后台送键][申请加精]

在论坛上看很多人在问模拟按键的问题,比较好的是用Winio,但这样一是要加载winio.sys,二是基本只支持当前窗口按键,其实使用PostMessage就可以解决大部分游戏的按键模拟,很多人用不了就放弃了,其实关键是参数的构造不对,这个函数PostMessage (MyHwnd, WM_KEYDOWN, key, lParam)中,很多人的用法都是lParam为0,即: 
PostMessage (MyHwnd, WM_KEYDOWN, key, 0); 
这里lParam的构造应该如下:[具体为什么这么构造,请大家自己到网上看下PostMessage 的说明] 
Delphi代码: 
一、建立构造函数: 
function VKB_param(VirtualKey:Integer;flag:Integer):Integer; //函数名 
var 
s,Firstbyte,Secondbyte:String;  
S_code:Integer; 
Begin 
if flag=1 then  //按下键 
  begin 
  Firstbyte :='00' 
  end 
else                  //弹起键 
  begin 
  Firstbyte :='C0' 
  end; 
S_code:= MapVirtualKey(VirtualKey, 0); 
Secondbyte:='00'+inttostr(s_code); 
Secondbyte:=copy(Secondbyte,Length(Secondbyte)-1,2); 
s:='$'+Firstbyte + Secondbyte + '0001';  
Result:=strtoint(s); 
End; 
二、使用按键的方法: 
lparam := VKB_param(key, 1);      {按下键} 
PostMessage (MyHwnd, WM_KEYDOWN, key, lParam); 
lParam := VKB_param(key, 0);      {松开键} 
PostMessage (MyHwnd, WM_KEYUP, key, lParam); 
三、说明: 
key为键值,如1键[不是数字键的1]的值是$31,flag传递的是按键状态,1是按下,0是弹起。 
四、多个游戏中通过,只要不封按键精灵的游戏都可以使用?

gmusic 2008-10-28 14:14
现在大家用的都是CALL,按键的一般不用了! 
不过你的这种方法我会去试试!

asclxx 2008-10-28 16:05
找CALL的一般游戏更新就要根据特征再找!对很多一般的操作就没必要了! 
适合用来吃药,开辅助技能,回程等,呵呵!

10956493 2008-10-28 16:40
PostMessage 完美的游戏好像很早就不能用了 [s:57]

gmusic 2008-10-28 20:22
PostMessage是可以用的,只是看你编程能力

xionwe 2008-10-28 23:09
非常好用!支持楼主无私的奉献!解决了一个大问题,虽然不是完美的 
 
可惜我无法给你加分,不然所有的分都送给你! 
 
更重要的是让我学习到了某些东西最好还是深挖一下!再次感谢

asclxx 2008-10-29 09:03
引用第5楼xionwe于2008-10-28 23:09发表的  : 
非常好用!支持楼主无私的奉献!解决了一个大问题,虽然不是完美的 
可惜我无法给你加分,不然所有的分都送给你! 
更重要的是让我学习到了某些东西最好还是深挖一下!再次感谢
 
呵呵!有人能用我就开心了!不然就白忙活了!

hzx317 2008-10-31 14:47
我试了试,在诛仙登陆页面,无法PostMessage“tab键”和“回车键”,请问什么原因呢?

asclxx 2008-10-31 22:23
引用第7楼hzx317于2008-10-31 14:47发表的  : 
我试了试,在诛仙登陆页面,无法PostMessage“tab键”和“回车键”,请问什么原因呢?
 
登陆界面的输入框使用另外的窗口句柄[子窗口]这里你不能使用前面Findwindow的到的句柄,不过我不知道这个句柄怎么获得。 
网上有另外的用“记事本”做的例子,你可以搜下看,我隐约记得可以解决这个问题。 
[该例子中分析了“记事本”菜单栏和编辑栏的不同编号,使得按键在不同区域生效,似乎关键词是快捷键输入]

xionwe 2008-10-31 23:40
遍历子窗口

athenho 2008-11-01 00:31
我個人是使用 
SendMessageW (Ghwnd,WM_KEYDOWN ,nkey1,0); 
 
不用任何函數一樣可以達到模擬之效果

coater 2008-11-14 08:47
IE7 的保存窗口要模拟怎么用呢,谢谢!试过好多种都不行

liuhefeng 2008-11-14 14:42
用户被禁言,该主题自动屏蔽!

wstsgx 2008-11-14 16:37
楼主~试了下诛仙不行的啊

bfhq 2008-11-14 16:56
谢谢楼主,完美试过了,可以。 
lParam 是一个long类型的参数,它在内存中占4个字节,写成二进制就是 00000000 00000000 00000000 00000000  一共是32位,我们从右向左数,假设最右边那位为第0位(注意是从0而不是 从1开始计数),最左边的就是第31位,那么该参数的的0-15位表示键的发送次数等扩展信息,16-23位为按键的扫描码,24-31位表示是按下键还 是释放键。大家一般习惯写成16进制的,那么就应该是&H00 00 00 00 ,第0-15位一般为&H0001,如果是按下键,那 么24-31位为&H00,释放键则为&HC0,那么16-23位的扫描码怎么会得呢?这需要用到一个API函数 MapVirtualKey,这个函数可以将虚拟码转换为扫描码,或将扫描码转换为虚拟码,还可以把虚拟码转换为对应字符的ASCII码。它的VB声明如 下: 
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long 
参 数wCode 表示待转换的码,参数wMapType 表示从什么转换为什么,如果是虚拟码转扫描码,则wMapType 设置为0,如果是虚拟扫描码转 虚拟码,则wMapType 设置为1,如果是虚拟码转ASCII码,则wMapType 设置为2.相信有了这些,我们就可以构造键盘事件的 lParam参数了。

doodc 2008-11-14 17:02
[s:79] 我一直都是用的这个啊  游戏暂时还没封windows消息 
全局键盘hook  打BB的时候 就可以最小化游戏了

mmzzq 2008-11-24 11:13
这个模拟按键的话如果窗口没有最大化是否还有作用呢

兽性本源 2008-11-24 11:29
[s:17] 这样就支持后台?

firephoenix 2008-11-24 11:40
这个CALL能用吧。

ize2001 2008-11-26 11:00
看到有成功的,改天学会了也试试。

qhlls 2008-11-28 04:07
楼主啊 会用Delphi很少有人模拟的 有VB的代码吗 模拟鼠标点击作用于后台游戏窗口 拜托

zlxy168 2009-02-14 16:53
楼主呀,这个可以搞组合按键ctrl+z  吗?我搞了好几次不成功呀

laomaicn 2009-03-12 23:23
好东西 学习了 谢谢

dxjhq 2009-03-15 03:22
怎么我转成VB就不行呀,请帮我看下 
 
Private Sub Timer1_Timer() 
'SendMessage pid, &H1, 0, 0 
 
Dim lpaam As Long 
Dim key As Integer 
key = &H31 
 
lParam = VKB_param(key, 1) 
PostMessage pid, WM_KEYDOWN, key, lParam 
lParam = VKB_param(key, 0)  '    {松开键} 
PostMessage pid, WM_KEYUP, key, lParam 
 
 
 
'keybd_event VK_3, 0, 0, 0    '按下7键 
'keybd_event VK_1, 0, KEYEVENTF_KEYUP, 0 
End Sub 
 
 
Function VKB_param(VirtualKey As Integer, flag As Integer) As Long ' //函数名 
    Dim s As String 
    Dim Firstbyte As String 
    Dim Secondbyte As String 
     
     
    If flag = 1 Then '按下键 
        Firstbyte = "00" 
 
    Else  '                //弹起键 
 
        Firstbyte = "C0" 
    End If 
 
 
    S_code = MapVirtualKey(VirtualKey, 0) 
    Secondbyte = "00" & S_code 
    Secondbyte = Right(Secondbyte, 2) 
    s = "&H" + Firstbyte + Secondbyte + "0001" 
'Result:=strtoint(s); 
    VKB_param = Val(s) 
End Function


2009-03-19 11:23



2010-03-16 20:06



2010-10-26 10:55



2010-10-26 14:32



2011-05-16 13:29



2011-11-17 19:20



2011-11-17 19:55

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
如何模拟键盘操作(c++版本)
用VB模拟键盘事件的N种方法
VB 查找游戏窗口句柄的方法
Delphi的消息处理
Delphi 7 定义你自己的消息
c# 调用API访问其他窗体上的文本和执行单击事件等等
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服