这段时间迷上了热血江湖这个游戏
也想自己做一个外挂来玩玩,可在制作过程中发现了N多问题,希望在这里得到帮助!1.定义热键
  目的和按键精灵的一样即可,按F11开始 F12停止
在运行过程中,有的时候按F11 就可以,有的时候就没有反映,而且是大部分时间都没有反映2.用什么方法可以在整个屏幕上查找某一个图像,只要屏幕有这个图像就停止程序,若没有就查找!

解决方案 »

  1.   

    用热键应该不太好
    用SENDMESSAGE或者POSTMESSAGE吧
      

  2.   

    '模块
    Public Type KeyboardBytes
       kbByte(0 To 255) As Byte
    End TypePublic Type KBDLLHOOKSTRUCT
      vkCode As Long
      scanCode As Long
      flags As Long
      time As Long
      dwExtraInfo As Long
    End TypePublic m_hDllKbdHook As Long
    Public Const WH_KEYBOARD_LL As Long = 13
    Public Const HC_ACTION As Long = 0
    Public Const WM_CHAR As Long = &H102
    Public Const KEYEVENTF_EXTENDEDKEY = &H1
    Public Const KEYEVENTF_KEYUP = &H2
    Public Const SW_RESTORE = 9
    Public Const SW_MINIMIZE = 6Public Const VK_TAB = &H9
    Public Const VK_UP = &H26
    Public Const VK_SUBTRACT = &H6D
    Public Const VK_SPACE = &H20
    Public Const VK_SHIFT = &H10
    Public Const VK_SEPARATOR = &H6C
    Public Const VK_RWIN = &H5C
    Public Const VK_RIGHT = &H27
    Public Const VK_RMENU = &HA5
    Public Const VK_RSHIFT = &HA1
    Public Const VK_RETURN = &HD
    Public Const VK_RCONTROL = &HA3
    Public Const VK_RBUTTON = &H2
    Public Const VK_PROCESSKEY = &HE5
    Public Const VK_PRIOR = &H21
    Public Const VK_PRINT = &H2A
    Public Const VK_PAUSE = &H13
    Public Const VK_PLAY = &HFA
    Public Const VK_NUMPAD9 = &H69
    Public Const VK_NUMPAD8 = &H68
    Public Const VK_NUMPAD7 = &H67
    Public Const VK_NUMPAD6 = &H66
    Public Const VK_NUMPAD5 = &H65
    Public Const VK_NUMPAD4 = &H64
    Public Const VK_NUMPAD3 = &H63
    Public Const VK_NUMPAD2 = &H62
    Public Const VK_NUMPAD1 = &H61
    Public Const VK_NUMPAD0 = &H60
    Public Const VK_MODECHANGE = &H1F
    Public Const VK_MENU = &H12
    Public Const VK_MBUTTON = &H4
    Public Const VK_LWIN = &H5B
    Public Const VK_LSHIFT = &HA0
    Public Const VK_LMENU = &HA4
    Public Const VK_LEFT = &H25
    Public Const VK_LCONTROL = &HA2
    Public Const VK_LBUTTON = &H1
    Public Const VK_INSERT = &H2D
    Public Const VK_HOME = &H24
    Public Const VK_HELP = &H2F
    Public Const VK_F9 = &H78
    Public Const VK_F8 = &H77
    Public Const VK_F7 = &H76
    Public Const VK_F6 = &H75
    Public Const VK_F5 = &H74
    Public Const VK_F4 = &H73
    Public Const VK_F3 = &H72
    Public Const VK_F2 = &H71
    Public Const VK_F1 = &H70
    Public Const VK_F10 = &H79
    Public Const VK_F11 = &H7A
    Public Const VK_F12 = &H7B
    Public Const VK_ESCAPE = &H1B
    Public Const VK_END = &H23
    Public Const VK_DOWN = &H28
    Public Const VK_DELETE = &H2E
    Public Const VK_CONTROL = &H11
    Public Const VK_CLEAR = &HC
    Public Const VK_CANCEL = &H3
    Public Const VK_CAPITAL As Long = &H14
    Public Const VK_NUMLOCK As Long = &H90
    Public Const VK_SCROLL As Long = &H91
    Public Const LLKHF_UP As Long = &H80Public preWinProc As Long
    Public HotKey As Long
    Public HotKey_Cild As Long
    Public Modifiers As Long, uVirtKey As Long, idHotKey As Long, formhwnd As Long
    Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long  Dim kbdllhs As KBDLLHOOKSTRUCT
      If nCode = HC_ACTION Then
          Call CopyMemory(kbdllhs, ByVal lParam, Len(kbdllhs))      If (kbdllhs.flags And LLKHF_UP) Then
             Select Case kbdllhs.vkCode
                Case VK_F11
                    ....... '开始外挂
                Case VK_F12
                   ........ '停止外挂
                Case VK_HOME
                   RxjhWg.SetFocus
             End Select
             
          End If
          
       End If
      
       LowLevelKeyboardProc = CallNextHookEx(m_hDllKbdHook, nCode, wParam, lParam)
      
    End FunctionDim kbdState As KeyboardBytes
    Dim L As Long
    Call GetKeyboardState(kbdState)
    m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0&)
    Private Sub Form_Load()  Me.AutoRedraw = True
      Dim kbdState As KeyboardBytes
      Call GetKeyboardState(kbdState)
      m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc,   App.hInstance, 0&)
      AppActivate App.title
    End Sub在这里,我没有声明API!
      

  3.   

    Dim kbdState As KeyboardBytes
    Dim L As Long
    Call GetKeyboardState(kbdState)
    m_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0&)
    这个多复制了一下!
      

  4.   

    关注,我也是没有使用dll做全局钩子而只是使用了SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc,   App.hInstance, 0&),如果先启动游戏就会出现不能捕获按键的问题,但是如果先启动自己的软件后启动游戏就可以正常捕获。或许真的是完全没有其它办法,只能是做个全局的键盘钩子dll。
    第二个问题在VB中其实很好解决,利用一下按键精灵中的QMDispatch.dll,只要这个dll注册了,那么在VB中就可以创建它的对象,然后利用它里边的findpic函数,具体的实现你可以参照一下按键精灵中的stdlib.vbs的内容。
      

  5.   

    某些游戏里这个方法可能接收不到,,,去我BLOG上参考一下泰坦那个代码..有实现方法
    第2点你这个.......图片匹配的话..不太好办,,,,因为游戏一般都是DX的,一般截图可能截不到,另外匹配图片的话..........算法优化,否则慢死..建议你取游戏里其他的标志来停止程序,例如某个内存地址数据的变化什么的,这个比较简单.
      

  6.   

    哦,看见楼上的高见了,,,,,看来楼主的程序比较容易实现了......呵呵,,
    取我解决第一个的办法,取楼上解决第二个的办法,,你发达了楼主
    BLOG还打不开的话,,你去下载区里搜我写的那几个修改器,都带代码,,不过不全是采用上面说的方法.