c# - 我如何全局 Hook 所有键和所有鼠标按钮?

标签 c# winforms

<分区>

我在 Form1 上衣做了 :

using Gma.UserActivityMonitor;

然后声明:

Gma.UserActivityMonitor.GlobalEventProvider actHook = new GlobalEventProvider();

然后在 Load 事件中我做了:

actHook.MouseClick += actHook_MouseClick;

然后在底部:

private void actHook_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Clicks > 0)
            {
                MessageBox.Show("hi");
            }
        }

但是一旦我在加载任何内容之前一秒后运行我的应用程序,我就会在文件上遇到异常:HookManager.Callbacks.cs

在线:

throw new Win32Exception(errorCode);

异常:找不到指定的模块

System.ComponentModel.Win32Exception was unhandled
  HResult=-2147467259
  Message=The specified module could not be found
  Source=ScreenVideoRecorder
  ErrorCode=-2147467259
  NativeErrorCode=126
  StackTrace:
       at Gma.UserActivityMonitor.HookManager.EnsureSubscribedToGlobalMouseEvents() in d:\C-Sharp\ScreenVideoRecorder\ScreenVideoRecorderWorkingVersion\HookManager.Callbacks.cs:line 236
       at Gma.UserActivityMonitor.HookManager.add_MouseClick(MouseEventHandler value) in d:\C-Sharp\ScreenVideoRecorder\ScreenVideoRecorderWorkingVersion\HookManager.cs:line 69
       at Gma.UserActivityMonitor.GlobalEventProvider.add_MouseClick(MouseEventHandler value) in d:\C-Sharp\ScreenVideoRecorder\ScreenVideoRecorderWorkingVersion\GlobalEventProvider.cs:line 71
       at ScreenVideoRecorder.Form1.Form1_Load(Object sender, EventArgs e) in d:\C-Sharp\ScreenVideoRecorder\ScreenVideoRecorderWorkingVersion\Form1.cs:line 47
       at System.Windows.Forms.Form.OnLoad(EventArgs e)
       at System.Windows.Forms.Form.OnCreateControl()
       at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
       at System.Windows.Forms.Control.CreateControl()
       at System.Windows.Forms.Control.WmShowWindow(Message& m)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       at System.Windows.Forms.ContainerControl.WndProc(Message& m)
       at System.Windows.Forms.Form.WmShowWindow(Message& m)
       at System.Windows.Forms.Form.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
  InnerException: 

找不到什么或哪​​个模块?

我下载了版本2的源代码。 并添加了硬盘上 : Gma.UserActivityMonitor 目录中的所有文件 .cs。

我没有收到丢失某些东西的错误消息,那会是什么?

最佳答案

我只是downloaded the file来自 GlobalMouseKeyHook CodePlex站点并将其解压缩,然后我将 MouseKeyboardActivityMonitor.dll 添加到我的项目中。然后我将使用引用添加到表单。我正在运行针对 .Net 4 客户端配置文件的 Visual Studio 2010 Pro。我没有遇到任何问题

这是一个工作示例(此代码修改自 GlobalMouseKeyHook 演示项目:

using System;
using System.Collections.Generic;  
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MouseKeyboardActivityMonitor;
using MouseKeyboardActivityMonitor.WinApi;

namespace WindowsFormsApplication1
{

    public partial class Form1 : Form
    {
        private readonly KeyboardHookListener m_KeyboardHookManager;
        private readonly MouseHookListener m_MouseHookManager;
        public Form1()
        {
            InitializeComponent();
            m_KeyboardHookManager = new KeyboardHookListener(new GlobalHooker());
            m_KeyboardHookManager.Enabled = true;
            m_KeyboardHookManager.KeyDown += HookManager_KeyDown;
            m_KeyboardHookManager.KeyUp += HookManager_KeyUp;



            m_MouseHookManager = new MouseHookListener(new GlobalHooker());
            m_MouseHookManager.Enabled = true;
            m_MouseHookManager.MouseDown += HookManager_MouseDown;
            m_MouseHookManager.MouseUp += HookManager_MouseUp;

        }

        private void HookManager_KeyDown(object sender, KeyEventArgs e)
        {
            label1.Text = e.KeyData.ToString() + " Pressed";
        }

        private void HookManager_KeyUp(object sender, KeyEventArgs e)
        {
            label1.Text = e.KeyData.ToString() + " Released";
        }

        private void HookManager_MouseUp(object sender, MouseEventArgs e)
        {
            label1.Text = e.Button.ToString() + " Released";
        }


        private void HookManager_MouseDown(object sender, MouseEventArgs e)
        {
            label1.Text = e.Button.ToString() + " Pressed";
        }

    }
}

关于c# - 我如何全局 Hook 所有键和所有鼠标按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16781948/

相关文章:

c# - 带有 HTTPStatusCodeResult 的自定义错误消息在本地主机上不起作用

c# - 如何以编程方式选择 DataGridView 的第一行

c# - 设置 DataGridView 列 [0] 宽度以适合列中最大的文本?

c# - 在整个命名空间中引用某个变量的最佳方法?

C#:如何获取列表框中所选项目(和文本)的索引

c# - 如何在 C# 中将富文本框中的某些文本加粗

c# - FocusManager.FocusedElement 在菜单中不起作用

c# - 使用 StartsWith() 获取读取文本文件的第二个实例

c# - 在代码隐藏中获取文本区域

c# - 对象集合的 SOA WCF 类设计,或 "has-a"对象情况