我正在尝试停止剪贴板的正常粘贴操作,而我正在处理和更新剪贴板内容 .
我在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);
}