我在处理和更新剪贴板内容时试图停止剪贴板的正常粘贴操作。
我用 C# 编写了一个应用程序,用于实现全局复制粘贴操作堆栈(目前仅适用于文本格式)。复制操作被 WM_CLIPBOARDUPDATED 事件很好地拦截,我将剪贴板的内容压入堆栈。
主要问题是当我的键盘钩子(Hook)检测到由 Ctrl-V 发起的粘贴操作时,当我想将堆栈弹出回剪贴板时,但是当我的功能完成时,系统的粘贴操作已经完成。
举例说明,如果我复制了 5 个文本字符串并且堆栈已正确填充。我打开一个word文档,按Ctrl-V(粘贴)操作。当我的应用程序正在处理并准备通过从堆栈中弹出来更改剪贴板的内容时。粘贴操作已经由与我的函数并行的其他东西完成。
我已经使用了时间延迟、锁定和注销键盘监听器,但没有任何效果。
我想让我的应用程序成为链中第一个获取 Ctrl-V 的应用程序,然后更改剪贴板的内容,以便其他应用程序和进程只获取我粘贴到剪贴板上的内容。
Paste操作Intercept的代码如下
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);
}
最佳答案
您可以向系统注册 HotKey (Ctrl-V),以便系统可以将控制权发送给应用程序中的 HotKey 处理程序。您可以在那里更新剪贴板。
由于注册热键将使系统只通知您的应用程序,因此您可以控制对剪贴板的操作。稍后您必须将 Ctrl-V 组合发送到目标(预期)应用程序。这将模拟用户为目标应用程序发出的粘贴命令。
这样做的缺点是您必须知道哪个应用程序处于焦点状态,以便稍后将组合键发送到。
关于c# - 抢在大家面前停止Ctrl-V(粘贴)操作拦截和更改剪贴板内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26540126/