问题标签 [mouse-hook]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
122 浏览

c# - 我在 MouseButtonEventArgs 构造函数中为 MouseDevice 参数添加了什么?

我正在 WPF c# 中创建一个应用程序,该应用程序需要能够分别检测鼠标单击和单击事件。为了做到这一点,我使用了我在网上找到的 Global Mouse Hook 的代码。代码的唯一问题是它使用 EventArgs 作为 EventHandler,因此每次我发送 MouseUp 和 MouseDown 时它都会传递相同的函数。为了解决这个问题,我使用了 MouseButtonEventArgs 构造函数。我现在遇到的问题是构造函数需要 3 个参数:MouseDevice、时间戳和 MouseButton,构造函数才能实际工作。我已经弄清楚了时间戳和 MouseButton,但我不知道该为 MouseDevice 放置什么。我在这里放什么来使构造函数工作?这是我的低级鼠标钩类代码。

我该如何解决?另外,我对 c# 还很陌生,所以我可能需要一些额外的帮助来理解你的答案。

0 投票
0 回答
117 浏览

c++ - SendInput() 与 GetAsyncKeyState() (WinAPI) 一起使用时会导致无限循环

所以我想让当你按住左键时,鼠标开始每隔一段时间点击一次。

从理论上讲,一切都应该正常工作,但在实践中,并不是那么好。

无论如何,这里是我用于检测和点击鼠标的代码:

这是我对 Mouse::Click() 函数的实现:

我尝试了几乎所有我能想到的方法来解决这个问题,但没有成功,比如鼠标低级挂钩,还检查低级鼠标挂钩中的注入标志,使用RegisterRawInputDevices()检测硬件鼠标点击(也没有成功),设置 virtualClick变量和各种不同的检查,没有运气..我厌倦了过去两天尝试这样做

如果有人以前处理过这个问题并且可以帮助我,我将不胜感激。

最小的可重现示例:

主文件

鼠标::Click() 函数

实用程序::SleepThread() 函数

示例需要注意的事项:

  1. Vector2I 本质上是具有 2 个整数的结构:x 和 y,具有一些添加、减去等功能。
  2. 武器选择器->recoilTable 已初始化,它不是空的!查看populate_recoil_table()函数
  3. 代码使用C++17编译(MSVC编译器/Visual Studio 2019)

编辑:我解决了我的问题

我必须先“松开”我的按钮然后再次发送 DOWN 消息,idk 为什么我没有早点想到它,唯一的缺点是函数结束前的最后一条消息是 DOWN,所以鼠标有点“卡住” (无法注意到)但如果您的物理按钮未按下,它会立即更新。

固定点击功能:

0 投票
0 回答
56 浏览

c# - 从 Windows 鼠标钩子返回 1 使 PC 点击停止整个系统工作

我用这些线创建了一个钩子(正常工作,除了新的 return 1 线)。我想要做的是禁用右键单击:

这是我的mouseProc:

我还有一个运行检查以重新启动钩子,以防 Windows 将其关闭:

它工作正常,但在几次右键单击后,整个鼠标停止在 PC 上工作(如果我删除 return 1 行,没有问题!)。

PS:即使我停止调试/执行程序,鼠标也停止工作!

0 投票
1 回答
115 浏览

c++ - 低级过程挂钩中的 WM_LBUTTONUP 或 WM_LBUTTONDOWN 路的尽头是什么?

我正在使用 Win32 API 在 Windows 中编写一个低级鼠标钩子,我想根据某些条件拦截按下或按下的按钮(仍未决定)。

为了定位我们自己,让我们考虑以下处理这些钩子的过程:

它主要按预期工作,当条件不满足时,程序调用 next in line through CallNextHookEx(),当找到不合格的参数时,我有几个逻辑也会发生(例如,如果收到按钮按下的进程不是那个我在找)。

但是,当谈到行尾时,我不知所措,换句话说:如果我在注册点击时做我想做的一切,我该如何发出信号?该过程是否应该返回任何特定的返回值?

例如,即使程序流经过处理事情和处理所有事情的路径,除非我不返回对下一个钩子的调用,否则左(或右,取决于)按钮会卡住,就好像它从来没有释放。

使用文件资源管理器进行测试,如果单击文件发生在文件上,除非调用下一个挂钩,否则您将拖动文件。这是行为的一个简单示例,资源管理器显然需要处理WM_LBUTTONUP自身而不是拖动文件,但问题仍然适用,它是如何做到的?最后是什么?

XXX在代码片段中是该代码所在的位置,所有内容都已处理,因此鼠标应该是空闲的(未绑定到任何东西?),可能areturn在那里是有序的;我就是想不通是什么。

0 投票
0 回答
70 浏览

c - WM_MOUSEWHEEL 似乎不是_总是_生成的,是什么给出的?

首先,我想要完成的是:拦截(通过低级鼠标挂钩)WM_MOUSEHWHEEL消息以在 Windows 的文件浏览器历史记录中来回前进,或者如果无法访问历史记录,至少到父窗口。

这就是一切的开始,并不是说我不知道​​它是否可能,特别是使用触摸板,但那是我的意图。所以我开始查看更常见的WM_MOUSEWHEEL(垂直滚动),却发现这些消息大部分时间都没有生成!

根据MSDNWM_MOUSEWHEEL文档:

当鼠标滚轮旋转时发送到焦点窗口。DefWindowProc 函数将消息传播到窗口的父级。不应该有消息的内部转发,因为 DefWindowProc 将它向上传播到父链,直到它找到一个处理它的窗口。

好的,看起来不错,所以当鼠标滚轮旋转时,该消息将发送到具有焦点的窗口。让我们看看在 Visual Studio 实用程序包中的 Spy++ 的帮助下是否是这种情况,对其进行录制并将其上传到 YouTube,在此 Stack Exchange 中似乎不允许嵌入:https ://youtu.be /YJvjw_BPJf0

总结起来,并没有WM_MOUSEWHEEL为所有测试的程序生成。Explorer 是我尝试查看的第一个,重点关注窗口具有的不同子​​窗口,并确保它是可滚动的。

我可以看到它的滚动条部分收到了一些相关消息,但仅此而已,任何地方都没有该消息的迹象(但是,VM_VSCROLL已发布到滚动条的一个窗口)。

接下来是 Notepad3, nada,它SysListView32什么都看不到,父窗口会收到一些通知、激活消息等,但与滚动无关。

一切都SysListView32收到了一些LVS_SCROLL消息,但它没有对它们采取行动(它的消息循环可能正在寻找 darn WM_MOUSEWHEELs)。

最后是一个浏览器,什么都没有,“视图”根本没有注册任何东西,而父窗口通过事件的外观捕获了鼠标。

注意:对于那些看过视频的人,请注意,虽然 Spy++ 处于顶部,但它在所有测试中都没有焦点,它只是被固定了,所以我可以看到消息。


我几乎放弃了,从他们在 Visual Studio 中为您提供的默认示例 Win32 应用程序开始,我添加了一个挂钩过程,如果收到该消息,它将打印一个消息框,以防万一它是外壳以某种方式获取消息.

当我直接在 VS 中运行代码时,我感到惊讶的是,当我滚动浏览代码时会看到消息框。怎么回事?!

再次触发 Spy++(也是 64 位,因为它是我正在运行的 2022 预览版),让我们看看,它们就在那里!

https://youtu.be/ekrWKP7HiTE

每当我用两根手指用触控板垂直滚动时,代码编辑器子窗口都会收到这些消息。那么发生了什么?

我的意思是,我什至尝试运行提升到更高完整性级别的示例代码,看看这是否会使这些消息出现,但无济于事。

代码很简单,大部分是作为示例 Win32 应用程序自动生成的,但钩子和过程如下:

尽管我将其标记为 C,但它确实适用于在 Windows 中运行并且可以访问低级鼠标事件的任何语言,无论是否托管。

PS。顺便说一句,虽然我一开始提到的意图是开始这一切的动机,但我认为这是不可能的。如果即使在可滚动控件中也不总是生成垂直滚动消息,那么当没有可滚动的内容时,我看不到会生成水平滚动消息。它很可能需要在文件资源管理器本身中实现。

0 投票
0 回答
24 浏览

c# - 当鼠标位于 WPF 中的应用程序窗口之外时,如何获得与 Canvas 的相对位置

我正在为全局事件使用钩子,但是当鼠标位于我的应用程序窗口之外时,我坚持获取与DrawCanvas的相对位置。我想要实现的东西就像mspaint一样,即使鼠标移出窗口,您仍然可以绘制形状

0 投票
0 回答
24 浏览

windows-messages - 无法拦截带有 WH_GETMESSAGE 或 WH_MOUSE_LL 的 WM_LBUTTONUP 消息

在GUI自动化服务的开发中,我们的团队面临着无法正确处理WM_LBUTTONUP消息的问题。

目标是拦截 WM_LBUTTONUP,禁用活动窗口,完成我们的工作并显示带有 YES 和 NO 按钮的 MessageBox:

  1. 如果点击是,我们手动做我们的事情;
  2. 否则,如果单击 NO,则不执行任何操作,但在这两种情况下,我们都必须阻止单击的窗口接收此消息,然后启用冻结窗口。

尝试使用 WH_MOUSE_LL 钩子,但点击的窗口在我们可以做任何事情之前收到点击。尝试使用 WH_GETMESSAGE 钩子,我们做所有事情,但在启用接收 WM_LBUTTONUP 后,用户独立回答禁用的窗口。

消息循环的代码(在 Service.exe 中):

与 WH_MOUSE_LL 一起使用的代码(在 Service.dll 中):

以及与 WH_GETMESSAGE 一起使用的代码(在 Service.dll 中):

所以我的问题是如何拦截 WM_LBUTTONUP 消息并阻止目标窗口接收到该消息?

0 投票
1 回答
139 浏览

windows - 如何防止鼠标打开显示器?

以下代码能够成功锁定鼠标事件。这是我试图阻止鼠标在关闭时打开显示器,但是当使用鼠标执行任何操作时显示器总是打开,例如:左键单击。

有什么解决办法吗?


编辑:

我只需要关闭显示器而不关闭系统(休眠或挂起)。并防止鼠标操作将其还原。