我全局(系统范围)使用SetWindowsHookEx和过滤某些鼠标点击WH_MOUSE_LL.问题是它不适用于WPF应用程序(所有WPF应用程序都检测鼠标点击,无论我是否指示系统忽略这些点击).我已经在这里问了一个类似的问题,但我假设WPF使用DirectInput而不是标准的Windows消息来检测输入.但是呢?
我已经能够找到一个能够使用鼠标点击进入WPF应用程序SendMessage的代码.如果这是可能的,那么我认为它意味着WPF不DirectInput用于鼠标输入.但是,为什么不能阻止WPF应用程序检测鼠标点击SetWindowsHookEx?
虽然这个问题主要是关于鼠标输入,但我也想知道它对于键盘输入是如何工作的.
我已经快速创建了以下解决方案来重现奇怪的WPF行为.它由3个项目组成:
HookTester
StartUp项目,自动启动其他2个项目,所以你应该主要关注这一个.启动时安装鼠标挂钩,并在关闭表单时卸载挂钩.
WinFormsTest
包含一个带有默认上下文菜单的TextBox,您可以在其中测试鼠标右键.当HookTester运行时,您不能使用鼠标右键调用上下文菜单.
WpfTest也
包含一个TextBox,带有自定义上下文菜单(虽然我也可以使用默认菜单),所以这又是测试鼠标右键的地方.只要HookTester正在运行,您就无法调用上下文菜单(使用鼠标右键),但出于某种原因,菜单仍将显示(Why ???).
警告:当您运行解决方案时,HookTester项目将启动并立即安装挂钩以拒绝任何右键鼠标点击(系统范围内).只需关闭HookTester表单即可轻松卸载挂钩.谨慎测试.
我正在使用VS 2010生成的简单表单,其中包含2个按钮,即启动和停止.使用SetWindowsHookEx启动触发器WH_MOUSE_LL,并停止挂钩.钩子工作正常,我选择"替换"鼠标中键单击双击,我唯一的问题是点击表单的最小化/最大化/关闭按钮,似乎有某种"事件竞赛"之间上面提到的按钮调用的钩子和事件.它反映了这样一个事实:当你按下其中一个按钮时,它会在完成它的动作之前保持"按下"一段时间(例如,形式最小化).当我右键单击表单并选择其中一个操作时,它会立即响应同样的事情,当我停止挂钩并按下上面提到的其中一个按钮时.有没有人遇到过这种行为?
我在WM_MOUSE上定义了一个全局挂钩,它在一段时间内完美运行.每次鼠标移动时,它都会向特定窗口发布消息.
经过一段随机时间后,挂钩停止发送消息.如果我取消注册并注册挂钩它再次工作.我想在Windows中发生的一些具体事情导致钩子停止,但我找不到什么.
有任何想法吗 ?
编辑:当钩子不再处于活动状态时,我将调试器附加到其他进程,并且我发现dll不再被加载.
什么可能导致钩子dll卸载?
Edit2:我发现在MouseHookProc中崩溃任何进程中的dll都会从它加载的每个进程中卸载hook dll.我无法找到导致代码崩溃的原因.可能是一些竞争条件或什么?这是hook dll代码:
#include "stdafx.h"
// define a data segment
#pragma data_seg(".SHARED")
HWND hwnd=0;
HHOOK hHook=0;
#pragma data_seg()
// tell the linker to share the segment
#pragma comment(linker, "/section:.SHARED,RWS")
#define WM_MOUSEHOOK WM_USER+0x100
HINSTANCE hInstance=0;
// this allow to build a very small executable without any extra libraries
// (probably not the problem, the bug still occurs without this )
#ifndef _DEBUG
void *__cdecl operator new(unsigned int bytes)
{
return HeapAlloc(GetProcessHeap(), 0, bytes); …Run Code Online (Sandbox Code Playgroud) 我一直在尝试编写一个小工具,它将修改鼠标在整个屏幕上的位置.我已经使用了我在这里找到的全局鼠标钩子库(我正在使用版本1),然后将鼠标位置信息从它生成的事件传递给我自己的函数(只是一个测试,看它现在工作) .
internal void ProcessMouseEvent(System.Drawing.Point point)
{
Cursor.Position = new Point(50,50);
}
Run Code Online (Sandbox Code Playgroud)
运行时,鼠标似乎闪烁到指定点,但如果是移动事件,它将立即恢复到更改前的位置.只有当它通过点击事件完成时,它才真正保持在新位置.
嘿伙计们,我有一台带有非常灵敏的触摸板的笔记本电脑,并且想要编写一个小程序,可以在我打字纸或其他东西时阻止鼠标输入.
考虑到我在低级钩子上看到的一切,我认为这并不难做,但我错了(令人震惊,对吧?).
我看了几个例子,但我见过的例子既可以阻止键盘也可以鼠标,或者只是隐藏鼠标.
对此的任何帮助都会很棒.
我是 Java 的 QT 新手。 QT有没有类似的东西:https : //code.google.com/p/jnativehook/?我可以获得所有带有坐标的鼠标事件吗?我做了以下工作:
bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::MouseButtonRelease)
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
ui->listWidget->addItem(QString("Mouse pressed: %1,%2").arg(mouseEvent>pos().x()).arg(mouseEvent->pos().y()));
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但它只在我的应用程序内部而不是系统范围内。我该怎么做才能让它在 QT 中工作?此外,这只需要在 Windows 上运行...
以下代码注册一个低级鼠标钩子来全局监视鼠标事件。
这是我能得到的最简单的工作示例。
用VC++2010编译:cl test.cpp /link /entry:mainCRTStartup /subsystem:windows
#include <windows.h>
HWND label1 ;
//THE HOOK PROCEDURE
LRESULT CALLBACK mouseHookProc(int aCode, WPARAM wParam, LPARAM lParam){
static int msgCount = 0 ;
static char str[20] ;
SetWindowText( label1, itoa(++msgCount, str, 10) ) ;
return CallNextHookEx(NULL, aCode, wParam, lParam) ;
}
int main(){
/**/// STANDARD WINDOW CREATION PART //////////////////////////////////////////////////////
/**/
/**/ WNDCLASSEX classStruct = { sizeof(WNDCLASSEX), 0, DefWindowProc, 0, 0, GetModuleHandle(NULL), NULL,
/**/ LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_BTNFACE+1), NULL, "winClass", NULL } ;
/**/ RegisterClassEx(&classStruct) …Run Code Online (Sandbox Code Playgroud) mouse-hook ×7
c# ×3
winapi ×3
c++ ×2
hook ×2
mouseevent ×2
windows ×2
.net ×1
asynchronous ×1
input ×1
qt ×1
wpf ×1