标签: mouse-hook

WPF用什么来捕获鼠标和键盘输入?

我全局(系统范围)使用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表单即可轻松卸载挂钩.谨慎测试.

下载SO5036143.ZIP: 镜子1,镜子2

.net wpf hook input mouse-hook

16
推荐指数
1
解决办法
4086
查看次数

C#低级鼠标挂钩和表单事件处理

我正在使用VS 2010生成的简单表单,其中包含2个按钮,即启动和停止.使用SetWindowsHookEx启动触发器WH_MOUSE_LL,并停止挂钩.钩子工作正常,我选择"替换"鼠标中键单击双击,我唯一的问题是点击表单的最小化/最大化/关闭按钮,似乎有某种"事件竞赛"之间上面提到的按钮调用的钩子和事件.它反映了这样一个事实:当你按下其中一个按钮时,它会在完成它的动作之前保持"按下"一段时间(例如,形式最小化).当我右键单击表单并选择其中一个操作时,它会立即响应同样的事情,当我停止挂钩并按下上面提到的其中一个按钮时.有没有人遇到过这种行为?

c# mouse-hook setwindowshookex

6
推荐指数
1
解决办法
1744
查看次数

一段时间后,SetWindowsHook停止工作

我在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)

c++ windows winapi mouse-hook

5
推荐指数
1
解决办法
2732
查看次数

设置鼠标位置不起作用c#

我一直在尝试编写一个小工具,它将修改鼠标在整个屏幕上的位置.我已经使用了我在这里找到的全局鼠标钩子库(我正在使用版本1),然后将鼠标位置信息从它生成的事件传递给我自己的函数(只是一个测试,看它现在工作) .

internal void ProcessMouseEvent(System.Drawing.Point point)
{
    Cursor.Position = new Point(50,50);
}
Run Code Online (Sandbox Code Playgroud)

运行时,鼠标似乎闪烁到指定点,但如果是移动事件,它将立即恢复到更改前的位置.只有当它通过点击事件完成时,它才真正保持在新位置.

c# mouseevent mouse-hook

5
推荐指数
1
解决办法
1730
查看次数

如何使用C#禁用鼠标单击事件系统?

嘿伙计们,我有一台带有非常灵敏的触摸板的笔记本电脑,并且想要编写一个小程序,可以在我打字纸或其他东西时阻止鼠标输入.

考虑到我在低级钩子上看到的一切,我认为这并不难做,但我错了(令人震惊,对吧?).

我看了几个例子,但我见过的例子既可以阻止键盘也可以鼠标,或者只是隐藏鼠标.

对此的任何帮助都会很棒.

c# windows hook winapi mouse-hook

4
推荐指数
1
解决办法
1万
查看次数

QT 全局鼠标监听器

我是 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 上运行...

qt mouseevent mouse-hook

3
推荐指数
1
解决办法
3642
查看次数

WinApi:消息循环可以被异步过程调用中断吗?

以下代码注册一个低级鼠标钩子来全局监视鼠标事件。
这是我能得到的最简单的工作示例。
用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)

c++ winapi asynchronous message-queue mouse-hook

1
推荐指数
1
解决办法
1951
查看次数