首页 文章

在每个人面前停止Ctrl-V(粘贴)操作以拦截和更改剪贴板内容

提问于
浏览
2

我正在尝试停止剪贴板的正常粘贴操作,而我正在处理和更新剪贴板内容 .

我在c#中编写了一个应用程序来实现一堆全局复制粘贴操作(目前仅用于文本格式) . WM_CLIPBOARDUPDATED事件很好地拦截了复制操作,我将剪贴板的内容推送到堆栈中 .

主要的问题是当我的键盘钩子检测到由Ctrl-V启动的粘贴操作时,当我想将堆栈弹回到剪贴板时,但是当我的功能完成时,系统的粘贴操作就完成了 .

举一个例子来说明,如果我复制了5个文本字符串并且堆栈已正确填充 . 我打开一个word文档并按Ctrl-V(粘贴)操作 . 当我的应用程序正在处理并即将通过从我的堆栈弹出来更改剪贴板的内容 . 粘贴操作已经通过与我的函数并行的其他东西完成了 .

我使用了时间延迟,锁定和取消注册键盘监听器,但没有任何效果 .

我想让我的应用程序成为第一个获取Ctrl-V然后更改剪贴板内容的应用程序,以便其他应用程序和进程只获得我在剪贴板上粘贴的内容 .

粘贴操作拦截的代码如下

private int KbHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0)
    {
        var hookStruct = (KbLLHookStruct)Marshal.PtrToStructure(lParam, typeof(KbLLHookStruct));

        // Quick and dirty check. You may need to check if this is correct. See GetKeyState for more info.
        bool ctrlDown = GetKeyState(VK_LCONTROL) != 0 || GetKeyState(VK_RCONTROL) != 0;

        if (ctrlDown && hookStruct.vkCode == 0x56) // Ctrl+V
        {
            if (clipBoardStack.Count > 0)
            {
                lock (this)
                {
                    localChange = true;
                    RemoveClipboardFormatListener(this.Handle);     // Remove our window from the clipboard's format listener list.
                    System.Threading.Thread.Sleep(200);
                    Clipboard.SetText(clipBoardStack.Pop());
                    AddClipboardFormatListener(this.Handle);
                    System.Threading.Thread.Sleep(200);
                }

            }

        }
    }

    // Pass to other keyboard handlers. Makes the Ctrl+V pass through.
    return CallNextHookEx(_hookHandle, nCode, wParam, lParam);
}

1 回答

  • 1

    您可以在系统中注册HotKey(Ctrl-V),以便系统可以将控制权发送到应用程序中的HotKey处理程序 . 在那里你可以更新剪贴板 .

    由于注册HotKey将使系统仅通知您的应用程序,因此您可以控制使用ClipBoard执行的操作 . 稍后,您必须将Ctrl-V组合发送到目标(预期)应用程序 . 这将模拟用户为目标应用程序发出的粘贴命令 .

    这样做的缺点是你必须知道哪个应用程序是关注的,以便稍后发送密钥组合 .

相关问题