游戏开发论坛

 找回密码
 立即注册
搜索
查看: 10454|回复: 13

请问:VB怎样模拟键盘输入

[复制链接]

43

主题

229

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
QQ
发表于 2005-12-2 15:39:00 | 显示全部楼层 |阅读模式
我曾经试过使用API函数KeybdEvent,但是对很多程序无效啊,只能对记事本一类的程序有效,像对泡泡堂就无效。
可是我问过一个做泡泡堂脚本的,为什么做脚本的那些人都说KeybdEvent就可以呢,是不是因为他们是C语言啊?
诚心请教高手!

43

主题

229

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
QQ
 楼主| 发表于 2005-12-7 22:20:00 | 显示全部楼层

Re:请问:VB怎样模拟键盘输入

为什么没人帮个忙啊?

7

主题

229

帖子

247

积分

中级会员

Rank: 3Rank: 3

积分
247
QQ
发表于 2005-12-7 22:32:00 | 显示全部楼层

Re:请问:VB怎样模拟键盘输入

你说的那函数很不错。我以前用VB写过一函数:

'Virtual keyboard events
' usage: VirtualKeyboard("CTRL+C") etc...
Public Sub VirtualKeyboard(ByVal sKeyInfo As String)
   
    Dim i As Long
    Dim bKey As Byte
    Dim aCtrlKey() As Byte
    Dim nCtrlKeyCount As Long
    Dim aSKeyList(9) As KEY_DATA
   
    'Keyinfo convert to Upper
    sKeyInfo = UCase(sKeyInfo)
   
    'special key list
    aSKeyList(0).sKey = "CTRL"
    aSKeyList(0).bKey = VK_CONTROL
   
    aSKeyList(1).sKey = "SHIFT"
    aSKeyList(1).bKey = VK_SHIFT
   
    aSKeyList(2).sKey = "ALT"
    aSKeyList(2).bKey = VK_MENU
   
    aSKeyList(3).sKey = "DEL"
    aSKeyList(3).bKey = VK_DELETE
   
    aSKeyList(4).sKey = "INS"
    aSKeyList(4).bKey = VK_INSERT
   
    aSKeyList(5).sKey = "HOME"
    aSKeyList(5).bKey = VK_HOME
   
    aSKeyList(6).sKey = &quotGUP"
    aSKeyList(6).bKey = VK_PRIOR
   
    aSKeyList(7).sKey = "PGDN"
    aSKeyList(7).bKey = VK_NEXT
   
    aSKeyList(8).sKey = "BACKSPACE"
    aSKeyList(8).bKey = VK_BACK

    aSKeyList(9).sKey = "END"
    aSKeyList(9).bKey = VK_END
   
    ReDim aCtrlKey(0)
    For i = 0 To UBound(aSKeyList)
        If InStr(sKeyInfo, aSKeyList(i).sKey) > 0 Then
            sKeyInfo = Replace(sKeyInfo, aSKeyList(i).sKey, "")
            If aCtrlKey(0) > 0 Then
                nCtrlKeyCount = nCtrlKeyCount + 1
                ReDim Preserve aCtrlKey(nCtrlKeyCount)
            End If
            aCtrlKey(nCtrlKeyCount) = aSKeyList(i).bKey
        End If
    Next
   
    sKeyInfo = Replace(sKeyInfo, "+", "")
    sKeyInfo = Trim(sKeyInfo)
    sKeyInfo = Replace(sKeyInfo, " ", "")
   
    If aCtrlKey(0) > 0 Then
        For i = 0 To nCtrlKeyCount
            keybd_event aCtrlKey(i), MapVirtualKey(aCtrlKey(i), 0), 0, 0
        Next
    End If
   
    For i = 1 To Len(sKeyInfo)
        bKey = Asc(Mid(sKeyInfo, i, 1))
        keybd_event bKey, MapVirtualKey(bKey, 0), 0, 0
    Next
   
    For i = 1 To Len(sKeyInfo)
        bKey = Asc(Mid(sKeyInfo, i, 1))
        keybd_event bKey, MapVirtualKey(bKey, 0), KEYEVENTF_KEYUP, 0
    Next

    If aCtrlKey(0) > 0 Then
        For i = 0 To nCtrlKeyCount
            keybd_event aCtrlKey(i), MapVirtualKey(aCtrlKey(i), 0), KEYEVENTF_KEYUP, 0
        Next
    End If

End Sub

仅供参考,上面那段代码是偶去年编写AutoCapture时编写的函数。主要用于模拟用户按下:Ctrl+Y/C/V 等……至于模拟MOUSE的也有,如果你需要我也可以贴上来。

偶的程序:http://dsdm.blogchina.com/3125346.html

43

主题

229

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
QQ
 楼主| 发表于 2005-12-9 18:01:00 | 显示全部楼层

Re:请问:VB怎样模拟键盘输入

鼠标的我自己也会的,就是不知道为什么键盘模拟对很多程序无效

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-12-10 13:24:00 | 显示全部楼层

Re:请问:VB怎样模拟键盘输入

(1) 非API的设计
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = &H1B Then End    '退出
If KeyCode = &H25 Then    '上
If KeyCode = &H27 Then   ' 下
If KeyCode = &H26 Then   ' 左
If KeyCode = &H28 Then    '右
End Sub

(2) 用API的设计:
API声明:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Const VK_RETURN = &HD
Private Const VK_SPACE = &H20
Private Const VK_UP = &H26
Private Const VK_DOWN = &H28
Private Const VK_LEFT = &H25
Private Const VK_RIGHT = &H27
Private Const VK_ESCAPE = &H1B

程序:
Private Sub Timer1_Timer()
If GetAsyncKeyState(VK_ESCAPE) And &H8000 Then End
If  GetAsyncKeyState(VK_LEFT) And &H8000 Then XX = XX - 1
If  GetAsyncKeyState(VK_RIGHT) And &H8000 Then XX = XX + 1
If GetAsyncKeyState(VK_UP) And &H8000 Then YY = YY - 1
If GetAsyncKeyState(VK_DOWN) And &H8000 Then YY = YY + 1
If GetAsyncKeyState(VK_SPACE) And &H8000 Then      '开火
.....................
end sub
XX,YY 是角色的坐标, 1是移动步长

7

主题

229

帖子

247

积分

中级会员

Rank: 3Rank: 3

积分
247
QQ
发表于 2005-12-10 18:04:00 | 显示全部楼层

Re:请问:VB怎样模拟键盘输入

首先,你要设定指定窗口的为当前焦点。就和你人工控制键盘一样的道理。

13

主题

594

帖子

595

积分

高级会员

Rank: 4

积分
595
发表于 2005-12-10 18:19:00 | 显示全部楼层

Re: 请问:VB怎样模拟键盘输入

同上,又是答非所问。。。 [em22]

43

主题

229

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
QQ
 楼主| 发表于 2005-12-23 22:03:00 | 显示全部楼层

Re:请问:VB怎样模拟键盘输入

是啊……
郁闷ing……

10

主题

96

帖子

96

积分

注册会员

Rank: 2

积分
96
发表于 2005-12-23 22:50:00 | 显示全部楼层

Re:请问:VB怎样模拟键盘输入

SENDKEYS也可以
那个API也可以,我也给自己做过一个针对游戏的键盘模拟挂机用的啊。

10

主题

96

帖子

96

积分

注册会员

Rank: 2

积分
96
发表于 2005-12-24 08:42:00 | 显示全部楼层

Re:请问:VB怎样模拟键盘输入

不好意思,记错了。
是:
'得到要发送的窗口的句柄号
lHwnd = FindWindow(vbNullString, "Ultima Online - KORE (New Seven Star)")
'发送键盘模拟消息,46是按键的那个值[Delete键],好象叫扫描码
SendMessage lHwnd, WM_KEYDOWN, 46, 0   
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 12:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表