向游戏模拟发送CTRL+R键,但SendKeys和keybd_event都被该游戏屏蔽了,
但“按键精灵”(一种模拟按键软件)模拟的操作可被该游戏接受!

解决方案 »

  1.   


    Private Sub Txt_UserName_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim CtrlDown As Long
        CtrlDown = (Shift And vbCtrlMask) > 0
        If KeyCode = vbKeyV And CtrlDown Then
    '        Txt_UserName.Text = Clipboard.GetText
            Txt_UserName.Text = strClipBoardText
            txtPassWd.SetFocus
            Exit Sub
        End If
    End Sub
      

  2.   

    或者找找什么API函数SENDMESSAGE
      

  3.   

    我想最关键是你发消息的hwnd是否就是游戏接收框的hwnd。你可以用spy、myspy之类的工具看看它们找到的hwnd和你找到的hwnd是不是一样。
      

  4.   

    程序经过测试,对IED都有效(也就是说CTRL+R能被IE接受,刷新的效果),就是对游戏无效!
      

  5.   

    试试用SendInput apiOption Explicit
    Const VK_H = 72
    Const VK_E = 69
    Const VK_L = 76
    Const VK_O = 79
    Const KEYEVENTF_KEYUP = &H2
    Const INPUT_MOUSE = 0
    Const INPUT_KEYBOARD = 1
    Const INPUT_HARDWARE = 2
    Private Type MOUSEINPUT
      dx As Long
      dy As Long
      mouseData As Long
      dwFlags As Long
      time As Long
      dwExtraInfo As Long
    End Type
    Private Type KEYBDINPUT
      wVk As Integer
      wScan As Integer
      dwFlags As Long
      time As Long
      dwExtraInfo As Long
    End Type
    Private Type HARDWAREINPUT
      uMsg As Long
      wParamL As Integer
      wParamH As Integer
    End Type
    Private Type GENERALINPUT
      dwType As Long
      xi(0 To 23) As Byte
    End Type
    Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)Public Sub SendKey(bKey As Byte)
        Dim GInput(0 To 1) As GENERALINPUT
        Dim KInput As KEYBDINPUT
        KInput.wVk = bKey
        KInput.dwFlags = 0
        GInput(0).dwType = INPUT_KEYBOARD
        CopyMemory GInput(0).xi(0), KInput, Len(KInput)
        KInput.wVk = bKey
        KInput.dwFlags = KEYEVENTF_KEYUP
        GInput(1).dwType = INPUT_KEYBOARD
        CopyMemory GInput(1).xi(0), KInput, Len(KInput)
        Call SendInput(2, GInput(0), Len(GInput(0)))
    End Sub
      

  6.   

    建议使用SendInput。这个函数直接将输入插入到系统输入消息列中,应该算是底层的了。
      

  7.   

    ch21st(www.blanksoft.com),怎么CTRL按下没反应:
    ……
    Const VK_CONTROL = 17 'ctrl键的虚拟键值
    Const VK_R = 82 'R键的ascii码值(虚拟键值)
    ……Private Sub Timer1_Timer()
    SendKey (VK_CONTROL)
    SendKey (VK_R)
    End Sub
      

  8.   

    似乎两个键是先后按下的,也就是先按CTRL(不是按住),再按R键。
      

  9.   

    程序终于搞懂,也运行正常,在IE中通过测试。
    但遗憾的是:对游戏仍然无效!!!!
    对游戏仍然无效!!!!
    对游戏仍然无效!!!!
    对游戏仍然无效!!!!
    Private Sub Timer1_Timer()    Dim GInput(0 To 3) As GENERALINPUT
        Dim KInput As KEYBDINPUT
        KInput.wVk = VK_CONTROL
        KInput.dwFlags = 0
        GInput(0).dwType = INPUT_KEYBOARD
        CopyMemory GInput(0).xi(0), KInput, Len(KInput)
        
        KInput.wVk = VK_R
        KInput.dwFlags = 0
        GInput(1).dwType = INPUT_KEYBOARD
        CopyMemory GInput(1).xi(0), KInput, Len(KInput)
        
        KInput.wVk = VK_R
        KInput.dwFlags = KEYEVENTF_KEYUP
        GInput(2).dwType = INPUT_KEYBOARD
        CopyMemory GInput(2).xi(0), KInput, Len(KInput)
        
        KInput.wVk = VK_CONTROL
        KInput.dwFlags = KEYEVENTF_KEYUP
        GInput(3).dwType = INPUT_KEYBOARD
        CopyMemory GInput(3).xi(0), KInput, Len(KInput)
        Call SendInput(4, GInput(0), Len(GInput(0)))
    End Sub
      

  10.   

    如果这个还不行,我就不知道是什么原因了,查看MSDN,相关的api仅仅有
    ActivateKeyboardLayout
    BlockInput
    EnableWindow
    GetActiveWindow
    GetAsyncKeyState
    GetFocus
    GetKeyboardLayout
    GetKeyboardLayoutList
    GetKeyboardLayoutName
    GetKeyboardState
    GetKeyNameText
    GetKeyState
    GetLastInputInfo
    IsWindowEnabled
    keybd_event
    LoadKeyboardLayout
    MapVirtualKey
    MapVirtualKeyEx
    OemKeyScan
    RegisterHotKey
    SendInput
    SetActiveWindow
    SetFocus
    SetKeyboardState
    ToAscii
    ToAsciiEx
    ToUnicode
    ToUnicodeEx
    UnloadKeyboardLayout
    UnregisterHotKey
    VkKeyScan
    VkKeyScanEx
    不过我刚才下载了按键精灵,并且用spy++看它发送的消息,我发现它是用postmessage发送
    WM_HotKey消息
      

  11.   

    能不能给postmessage按组合键的例子!谢谢!
      

  12.   

    研究了一上午postmessage按ALT组合键能实现,CTRL组合键找不到相关常数!
    我在这里等,等到你研究出结果!
      

  13.   

    你进展比我大
    今天放假,没想到今天还挺忙
    我刚才试了一下在vb中用postmessage发送WM_Hotkey但是不能达到预期效果
    而且用spy++并没有发现它发送出WM_Hotkey消息,而是WM_Command之类的,看来我的写法不对你也可以用spy++检视一下,至于常数是多少先不用管,先用spy++从按键精灵的消息中搞出WM_HOTKEY的消息参数,你原样用vb发送看看效果还有即使原来不行的api你要考虑每个按键是两个消息,不过你如果已经在游戏以外成功了,可能这点可以跳过这点
      

  14.   

    //如果这个还不行,我就不知道是什么原因了,查看MSDN,相关的api仅仅有
    DirectInput的函数查过没有?
      

  15.   

    The Power of DirectInput
    Apart from providing services for devices not supported by the Microsoft Win32API, DirectInput gives faster access to input data by communicating directly with the hardware drivers rather than relying on Microsoft Windows messages.就是这个DirectInput搞的鬼啦……不过我找不到在DirectInput里面插输入的函数
      

  16.   

    “向游戏模拟发送CTRL+R键,但SendKeys和keybd_event都被该游戏屏蔽了”
    不可能吧?是不是搞错了?
      

  17.   

    这个DirectInput俺还真没查过,从来没涉及过这方面编程,现在查查