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

本文关键字:剪贴板 操作 所有人 粘贴 Ctrl-V | 更新日期: 2023-09-27 18:27:42

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

我用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);
}

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

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

由于注册热键将使系统只通知您的应用程序,因此您可以控制使用剪贴板的操作。稍后,您将不得不将Ctrl-V组合发送到目标(预期)应用程序。这将模拟用户为目标应用程序发出的粘贴命令。

这样做的缺点是,您必须知道哪个应用程序在焦点上,以便稍后将密钥组合发送到。