当前位置:编程学习 > VB >>

VB postmessage 问题

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long
Dim s As String
Dim Firstbyte As String
If flag = &H100 Then
Firstbyte = "00"
Else
Firstbyte = "C0"
End If
Dim Scancode As Long

Scancode = MapVirtualKey(VirtualKey, 0)
Dim Secondbyte As String
Secondbyte = Right("00" & Hex(Scancode), 2)
s = Firstbyte & Secondbyte & "0001"
MakeKeyLparam = Val("&H" & s)
End Function

Private Sub Command1_Click()
Dim zqyfwcj As Long
Dim i As Long
zqyfwcj = FindWindow(vbNullString, "剑侠世界")
PostMessage zqyfwcj, &H100, &H11, MakeKeyLparam(&H11, &H100)
Sleep 100
SendMessage zqyfwcj, &H100, &H66, MakeKeyLparam(&H66, &H100)
Sleep 100
SendMessage zqyfwcj, &H101, &H66, MakeKeyLparam(&H66, &H101)
Sleep 100
PostMessage zqyfwcj, &H101, &H11, MakeKeyLparam(&H11, &H101)
End Sub
模拟不了ctrl+F,高手指点一下,是不是扫描码有问题
Private Sub Command2_Click()
Dim zqyfwcj As Long
Dim i As Long
zqyfwcj = FindWindow(vbNullString, "剑侠世界")
SendMessage zqyfwcj, &H100, &H46, MakeKeyLparam(&H46, &H100)
Sleep 100
SendMessage zqyfwcj, &H101, &H46, MakeKeyLparam(&H46, &H101)
End Sub
这个模拟F1就能实现,谢谢
为什么,高手说一下,如果是扫描码问题,Ctrl+F的代码如何写,谢谢,答案正确,我再加分
追问:怎么联系啊,我QQ47782939
答案:老兄啊,最近怎么样,进步了没有,你试试用IO接口,直接写的能用不,有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时 性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递 十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就 造成,对这样的程序无论用PostMessage或者是keybd_event都不会有反应,因为这些函数都在较高层。对于这样的程序,只好用直接读写键 盘端口的方法来模拟硬件事件了。要用这个方法来模拟键盘,需要先了解一下键盘编程的相关知识。在DOS时代,当用户按下或者放开一个键时,就会产生一个键盘中断(如果键盘中断是允许的),这样程序会跳转到BIOS中的键盘中断处理程序去执行。打开 windows的设备管理器,可以查看到键盘控制器由两个端口控制。其中&H60是数据端口,可以读出键盘数据,而&H64是控制端口, 用来发出控制信号。也就是,从&H60号端口可以读此键盘的按键信息,当从这个端口读取一个字节,该字节的低7位就是按键的扫描码,而高1位则表 示是按下键还是释放键。当按下键时,最高位为0,称为通码,当释放键时,最高位为1,称为断码。既然从这个端口读数据可以获得按键信息,那么向这个端口写 入数据就可以模拟按键了!用过QbASIC4.5的朋友可能知道,QB中有个OUT命令可以向指定端口写入数据,而INP函数可以读取指定端口的数据。那 我们先看看如果用QB该怎么写代码:假如你想模拟按下一个键,这个键的扫描码为&H50,那就这样OUT &H64,&HD2 '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据OUT &H60,&H50 '把扫描码&H50发送到&H60端口,表示模拟按下扫描码为&H50的这个键那么要释放这个键呢?像这样,发送该键的断码:OUT &H64,&HD2 '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据OUT &H60,(&H50 OR &H80) '把扫描码&H50与数据&H80进行或运算,可以把它的高位置1,得到断码,表示释放这个键好了,现在的问题就是在VB中如何向端口写入数据了。因为在windows中,普通应用程序是无权操作端口的,于是我们就需要一个驱动程序来帮助我们实 现。在这里我们可以使用一个组件WINIO来完成读写端口操作。什么是WINIO?WINIO是一个全免费的、无需注册的、含源程序的 WINDOWS2000端口操作驱动程序组件(可以到 http://www.internals.com/上去下载)。它不仅可以操作端口,还可以操作内 存;不仅能在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个文件拷贝到你的程序的文件夹下
搞外挂啊,呵呵
我记得PostMessage 好象是不支持发送包括Ctrl、Alt、Shift、方向键之类的扩展键。如果要进行这样的控制,可以使用keybd_event键盘事件函数来完成,具体API声明是: Declare   Sub   keybd_event   Lib   "user32"   Alias   "keybd_event"   (ByVal   bVk   As   Byte,   ByVal   bScan   As   Byte,   ByVal   dwFlags   As   Long,   ByVal   dwExtraInfo   As   Long)  
当然也可以用WinIO来进行驱动级模拟来完成,网上有很多资料,你可以看看。如果需要帮助可以联系我。

上一个:VB拦截message消息
下一个:vb编程代码大全

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,