You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB后台向窗口化游戏发送指定位置鼠标点击的实现咨询

实现VB后台进程指定位置鼠标点击的方案

嘿,已经搞定后台键盘输入这步真的很棒!针对你要在后台对游戏窗口指定位置执行鼠标点击的需求,咱们可以基于Windows消息机制来实现,和你用PostMessage发送键盘消息的思路一脉相承,不过鼠标操作需要处理坐标转换和特定的消息序列,下面给你详细拆解:

核心思路

后台鼠标点击需要完成两个关键步骤:

  • 把屏幕坐标转换成目标窗口的客户区坐标(因为PostMessage发送的鼠标消息坐标是相对于窗口客户区的)
  • 向目标窗口发送鼠标移动、按下、释放的消息序列,模拟完整的点击动作

具体实现步骤

1. 导入所需的API函数

除了你已经用到的PostMessage,还需要导入ScreenToClient来转换坐标:

' 鼠标相关常量
Public Const WM_MOUSEMOVE As Integer = &H200
Public Const WM_LBUTTONDOWN As Integer = &H201
Public Const WM_LBUTTONUP As Integer = &H202
Public Const MK_LBUTTON As Integer = &H1 ' 鼠标左键按下的标志

' 坐标转换API
<System.Runtime.InteropServices.DllImport("user32.dll")>
Public Shared Function ScreenToClient(ByVal hWnd As IntPtr, ByRef lpPoint As Point) As Boolean
End Function

' 你已有的PostMessage函数可以保留
<System.Runtime.InteropServices.DllImport("user32.dll")>
Public Shared Function PostMessage(<System.Runtime.InteropServices.In()> ByVal hWnd As System.IntPtr, <System.Runtime.InteropServices.In()> ByVal Msg As System.UInt32, <System.Runtime.InteropServices.In()> ByVal wParam As System.IntPtr, <System.Runtime.InteropServices.In()> ByVal lParam As System.UIntPtr) As System.Boolean
End Function

2. 封装坐标打包函数

鼠标消息的lParam参数需要把x和y坐标合并成一个64位整数:低16位存x坐标,高16位存y坐标(客户区坐标)。可以写个工具函数来完成这个打包:

Private Function PackMouseCoordinates(ByVal x As Integer, ByVal y As Integer) As UIntPtr
    ' 把x和y打包成lParam:x是低16位,y是高16位
    Dim lParam As UInt32 = CUInt(x) Or CUInt(y << 16)
    Return New UIntPtr(lParam)
End Function

3. 实现后台鼠标点击方法

接下来封装一个方法,接收窗口句柄、屏幕坐标,完成转换和消息发送:

Public Sub InputMouseClick(ByVal hWnd As IntPtr, ByVal screenX As Integer, ByVal screenY As Integer)
    ' 1. 把屏幕坐标转换成目标窗口的客户区坐标
    Dim clientPoint As New Point(screenX, screenY)
    ScreenToClient(hWnd, clientPoint)

    ' 2. 先发送鼠标移动消息,将光标定位到目标位置(部分游戏需要这一步)
    PostMessage(hWnd, WM_MOUSEMOVE, IntPtr.Zero, PackMouseCoordinates(clientPoint.X, clientPoint.Y))

    ' 3. 发送左键按下消息
    PostMessage(hWnd, WM_LBUTTONDOWN, New IntPtr(MK_LBUTTON), PackMouseCoordinates(clientPoint.X, clientPoint.Y))

    ' 4. 发送左键释放消息(模拟完整点击)
    PostMessage(hWnd, WM_LBUTTONUP, IntPtr.Zero, PackMouseCoordinates(clientPoint.X, clientPoint.Y))
End Sub

4. 调用示例

比如你要点击屏幕上(100, 200)的位置,对应游戏窗口的后台点击:

' 假设你已经获取了游戏进程的主窗口句柄
InputMouseClick(Process.MainWindowHandle, 100, 200)

注意事项

  • 坐标准确性:确保你传入的屏幕坐标是正确的,如果是游戏窗口内的相对位置,可以直接用客户区坐标,跳过ScreenToClient转换。
  • 游戏兼容性:有些使用DirectX/Unity等引擎的游戏会拦截PostMessage消息,这时候这种方法可能失效。如果遇到这种情况,可能需要更复杂的方式(比如注入DLL到游戏进程内模拟输入),但这已经超出了基础Windows消息的范畴。
  • 消息顺序:必须按照移动→按下→释放的顺序发送,否则可能无法触发正确的点击动作。

内容的提问来源于stack exchange,提问作者Atyll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:13:04