用SendMessage 模拟鼠标点击指定位置坐标出错

lmhcs lmhcs 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
用SendMessage发送WM_LBUTTONDOWN,并在lparam指定坐标位置。但接受放接受到位置严重出错。不知道错误哪里。知道c#高手多,特来c#这边发帖,请教!贴代码


Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
'测试发送鼠标点击
Dim res As Integer
Win.SetForegroundWindow(hwnd) '窗体激活
'测试鼠标窗体点击
Dim x As Int16 = 58
Dim y As Int16 = 155
Dim pt As New Point(x, y)
Dim lp As Int32 = Helper.ToLParam(x, y)
lp = 10158138 '低16位58,高16位155
MSG.SetCursorPos(x, y) '在网上看到SetCursorPos可以模拟点击制定位置,但本测试不行)
res = MSG.SendMessage(hwnd, WM.WM_LBUTTONDOWN, MouseMK.MK_LBUTTON, lp)
Threading.Thread.Sleep(200)
res = MSG.SendMessage(hwnd, WM.WM_LBUTTONUP, MouseMK.MK_LBUTTON, lp)
End Sub


上例发打算发送x=58,y=155坐标位置,但被模拟点击的程序收到的是:在 WndProc 方法lparam接受到是165864560,即x=58480,y=2530,这个坐标跟发送的坐标严重不一致。
api声明

Public Class MSG
<DllImport("user32", SetLastError:=True)>
Public Shared Function PostMessage(hWnd As IntPtr, Msg As UInteger, wParam As Integer, lParam As Integer) As Boolean
End Function
<DllImport("user32.dll", EntryPoint:="SendMessage", CharSet:=CharSet.Auto)>
Public Shared Function SendMessage(hwnd As IntPtr, wMsg As Integer, wParam As Int32, ByRef lParam As Int32) As Int32
End Function
''' <summary>
''' 成功返回非0
''' </summary>
''' <param name="x"></param>
''' <param name="y"></param>
''' <returns></returns>
''' <remarks></remarks>
<DllImport("user32.dll", EntryPoint:="SetCursorPos")>
Public Shared Function SetCursorPos(x As Int32, y As Int32) As Int32
End Function
End Class

'按键消息
Public Enum WM
WM_LBUTTONDOWN = &H201
WM_LBUTTONUP = &H202
BM_CLICK = &HF5
End Enum

Public Enum MouseMK

''' <summary>
''' 鼠标左键
''' </summary>
''' <remarks></remarks>
MK_LBUTTON = &H1
''' <summary>
''' 鼠标右键
''' </summary>
''' <remarks></remarks>
MK_RBUTTON = &H2
''' <summary>
''' 鼠标中键
''' </summary>
''' <remarks></remarks>
MK_MBUTTON = &H10 '

MK_SHIFT = &H4
''' <summary>
''' 键盘Ctrl键
''' </summary>
''' <remarks></remarks>
MK_CONTROL = &H8
End Enum



Public Class Helper
''' <summary>
''' y右移16位
''' </summary>
''' <param name="x"></param>
''' <param name="y"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function ToLParam(x As Int32, y As Int32) As Int32
' Return (y << 16) Or (x And &HFFFF)
Return x + (y << 16)
End Function

''' <summary>
''' 返回低16位
''' </summary>
''' <param name="lp"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function LoWord(lp As Int32) As Int16
Dim mask As Int32 = &HFFFF
Return (lp And mask)
End Function
''' <summary>
''' 返回高16位
''' </summary>
''' <param name="lp"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function HiWord(lp As Int32) As Int16
Dim mask As Int32 = &HFFFF
Return (lp >> 16) And mask
End Function

End Class

...全文

相关推荐

c# 在WebBrowser中用SendMessage模拟鼠标点击

想在WebBrowser控件里面模拟鼠标点击,在百度上找了半天,怎么也找不到,还是google强大,在一个国外网站上找到的,代码比较清楚了,不做说明。

weixin_38701640

Windows消息机制深度解析:PostMessage与SendMessage模拟输入的实战指南

在Windows编程中,消息机制是应用程序与系统交互的核心基础。其原理基于事件驱动模型,系统将用户操作(如按键、鼠标点击)封装成特定消息,通过消息队列传递给目标窗口的消息处理函数。这一机制的技术价值在于实现了程序间的通信与用户输入的标准化处理。在自动化测试、游戏辅助、效率工具等应用场景中,开发者常需模拟键盘鼠标操作以实现自动化。然而,直接使用PostMessage或SendMessage API进行模拟输入时,常会遇到消息发送失败、重复按键等问题,这源于对Windows消息机制理解不足及句柄获取、消息构造等

weixin_30856725

Python win32gui实战:Windows桌面自动化核心API与避坑指南

在软件自动化领域,通过程序控制其他应用程序是提升效率的关键技术。其核心原理在于理解操作系统的事件驱动模型,即用户操作(如点击、输入)会被转换为特定的消息(Message)在系统内传递。Python的win32gui库(作为pywin32的一部分)为此提供了直接调用Windows API的能力,实现了对桌面程序最底层的控制。这项技术的核心价值在于其精准与高效,它绕过了基于屏幕坐标模拟的不稳定性,直接通过窗口句柄(HWND)与目标程序交互,确保了操作在窗口被遮挡或移动时依然有效。在自动化测试、办公效率工具、游戏

weixin_30701575

Python实现windows下模拟按键和鼠标点击的方法

主要介绍了Python实现windows下模拟按键和鼠标点击的方法,涉及Python模拟实现鼠标及键盘事件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下

weixin_38637805

Qt模拟鼠标点击

Qt模拟鼠标点击,用来自己备忘的。如有需要可以下载。

rain820804
评论 10
收藏 已收藏
分享
返回顶部
lmhcs
C# 111,128 成员 642,536 内容