检测整个系统中何时发生粘贴事件

时间:2015-04-09 18:36:33

标签: c# windows

我需要检测一些粘贴在整个系统中的东西。例如,在记事本或单词不仅在C#应用程序中。我找到的示例仅描述了一些WinForms应用程序。

当我能够检测到该事件时,我想修改粘贴值。

由于

2 个答案:

答案 0 :(得分:3)

要实现您的要求,您必须在系统上运行的所有其他窗口中注入您的应用程序。该过程称为Hook。

摘自How to set a Windows hook in Visual C# .NET

.NET Framework不支持全局挂钩

  

除了WH_KEYBOARD_LL低级别挂钩和WH_MOUSE_LL低级别挂钩之外,您无法在Microsoft .NET Framework中实现全局挂钩。要安装全局钩子,钩子必须具有本机DLL导出,以将自身注入另一个需要有效,一致的函数调用的进程中。此行为需要DLL导出。 .NET Framework不支持DLL导出。托管代码没有函数指针的一致值的概念,因为这些函数指针是动态构建的代理。   在安装钩子的线程上调用低级钩子过程。低级挂钩不要求在DLL中实现挂钩过程。

什么是Hooks

  

挂钩是系统消息处理机制中的一个点,应用程序可以在其中安装子例程来监视系统中的消息流量,并在它们到达目标窗口过程之前处理某些类型的消息。

答案 1 :(得分:1)

您应该挂钩WM_PASTE系统事件。通过注册WindowProc回调函数

来实现这一点

WM_PASTE消息https://msdn.microsoft.com/en-us/library/windows/desktop/ms649028%28v=vs.85%29.aspx

WindowProc回调函数https://msdn.microsoft.com/en-us/library/windows/desktop/ms633573%28v=vs.85%29.aspx

这应该有效

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        // WM_PASTE
        case (0x0302):
            // You can interrupt here, interept or pass by. Do what You need
            MessageBox.Show("PASTE");
            break;
    }

    base.WndProc(ref m);
}

如果这对您有用,请回复