用postmessage模拟后台鼠标点击的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用postmessage模拟后台鼠标点击的问题相关的知识,希望对你有一定的参考价值。

form1:
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const VK_CONTROL = &H11
Private Const VK_SHIFT = &H10
Private Const VK_RETURN = &HD
Private Const VK_1 = &H31
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Sub Command1_Click()

Dim lp As Long, hwnd As Long
hwnd=xxx
lp = y
lp = lp * 65536 + x '上面的X和Y代表的是你要在指定的窗口中执行鼠标事件的一个点的坐标
PostMessage hwnd, WM_LBUTTONDOWN, MK_LBUTTON, lp
PostMessage hwnd, WM_LBUTTONUP, MK_LBUTTON, lp '在窗口(hwnd)中的点(x,Y)执行一次鼠标单击事件
End Sub
module1:
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_CHAR = &H102
Public Const VK_C = 67
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_MOUSEMOVE = &H200
Public Const MK_LBUTTON = &H1
Public Const MK_MBUTTON = &H10
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long
==============================================================

上面这段代码,为什么我执行起来不能够实现鼠标点击.
hwnd的xxx我是给了指定窗口的句柄了的.
但还是不能模拟后台...这是为什么.....
这里的x,y是hwnd里的坐标吧,我也试过了,但还是没用,谁有好的后台模拟例子....或者帮我从上面的代码里修改出一个来..

参考技术A 研究下这句lp = lp * 65536 + x 有没有错

在后台窗口中模拟鼠标点击

【中文标题】在后台窗口中模拟鼠标点击【英文标题】:Simulate mouse click in background window 【发布时间】:2014-10-11 22:38:22 【问题描述】:

我正在尝试使用 SendMessage 将鼠标点击发布到背景窗口 (Chrome),这可以正常工作,但每次点击后都会将窗口置于前面。有什么办法可以避免吗?

在有人说这是一个重复的问题之前,请确保另一个主题确实提到了不激活目标窗口,因为我找不到。

更新:啊哈,隐藏窗口几乎可以解决问题。它按预期接收模拟的鼠标/键盘事件,并且不会显示在屏幕上。但是,我只能勉强使用自己的鼠标在计算机上导航,并且键盘输入完全中断。

所以我的问题是,向窗口发送消息如何影响其他应用程序?由于我实际上并没有模拟鼠标/键盘事件,所以其他窗口不应该完全忘记这一点吗? 它是否可能与收到WM_LBUTTONDOWN 时调用SetCapture 的窗口有关?除了挂钩 API 调用(对于这样一个小任务来说,这将是非常非常丑陋的)之外,我该如何避免这种情况?

【问题讨论】:

为什么还要将点击发送到 Chrome?如果这如您所描述的那样有效,那么对我来说这似乎是一个很好的安全功能。 您正在编写 Clicker Heroes 机器人吗? :P 【参考方案1】:

系统提供的默认处理(通过DefWindowProc)导致窗口出现在前面(单击时)作为对WM_MOUSEACTIVATE消息的响应,而不是WM_LBUTTONDOWN

Chrome 响应WM_LBUTTONDOWN 的事实表明这是 Chrome 专门做的事情,而不是您可以通过某种方式阻止的默认系统行为。

Chrome 的源代码可用;我建议你看看它,看看它是否确实是 Chrome 自己在做的事情。如果是这样,您能够阻止它的唯一实用方法(除了编译您自己的 Chrome 版本)是将代码注入 Chrome 的进程并对其主窗口过程进行子类化。

【讨论】:

实际上,它是我试图点击的 Flash 应用程序,不确定 Chrome 是否决定在这种情况下鼠标点击会发生什么。但从它的行为来看,我几乎可以肯定它调用了SetCapture。我会尝试劫持该功能,看看是否有帮助。 @riv 鼠标点击必须通过 Chrome 才能到达您的 Flash 应用程序。我猜 Chrome 认为:如果有人弄乱了你的浏览器,你可能想知道它。我认为这是一项重要的安全功能。

以上是关于用postmessage模拟后台鼠标点击的问题的主要内容,如果未能解决你的问题,请参考以下文章

vb后台模拟鼠标点击网页

SendMessage, postmessage模拟鼠标左键

易语言,怎么对指定窗口模拟鼠标点击和按键,可以后台的

模拟鼠标点击

在后台窗口中模拟鼠标点击

delphi 后台模拟鼠标点击