剪贴板查看器不会获得粘贴通知
我需要在某个程序的窗口中阻止从剪贴板粘贴。 我在程序中设置了一个剪贴板查看器,如下所示:
HWND hwndNextViewer = 0; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: { hwndNextViewer = SetClipboardViewer(hWnd); break; } default: return DefWindowProcW(hWnd, message, wParam, lParam); } case WM_DRAWCLIPBOARD: { if(GetForegroundWindow() == hWndTarget){ OpenClipboard(hWndTarget); EmptyClipboard(); CloseClipboard(); } SendMessage(hwndNextViewer, message, wParam, lParam); break; } case WM_CHANGECBCHAIN:{ if ((HWND)wParam == hwndNextViewer) hwndNextViewer = (HWND)lParam; else if (hwndNextViewer != NULL) { SendMessage(hwndNextViewer, message, wParam, lParam); } break; } } }
我正在做的是我正在检查当前前景窗口是否是目标程序窗口,如果是,我清空剪贴板。 但是这段代码没有检测到粘贴。 例如,当我使用鼠标粘贴到目标窗口内部时。
我怎样才能发现粘贴?
剪贴板查看器和剪贴板格式侦听器(您应该在Vista +中使用而不是查看器)仅用于检测对剪贴板上存储的数据的更改。 没有其他的。 当新数据放在剪贴板上时, WM_DRAWCLIPBOARD
和WM_CLIPBOARDUPDATE
消息将发送给查看者/侦听器。 从剪贴板粘贴数据时没有发送消息。
您根本无法使用剪贴板查看器/侦听器检测到粘贴。 该任务不是那些API的设计目标。
你将不得不使用一些全局钩子来做你想要的。 通过SetWindowsHookEx()
或RegisterRawInputDevices()
的键盘钩子可以监视Ctrl + V击键。 通过SetWindowsHookEx()
消息钩子可以监视与粘贴相关的窗口消息,如WM_PASTE
, EM_PASTESPECIAL
, WM_COMMAND
等。但即便如此,也不能保证检测到每个可能的粘贴操作。 应用程序可以自由地实现它们想要的粘贴。
您可能不得不求助于将代码注入目标进程,以直接挂钩查询剪贴板数据的各种Win32 API函数。 然后,当目标进程尝试在任何类型的粘贴操作期间检索数据时(例如,让应用程序认为没有可用于粘贴的数据),您可以伪造结果:
-
CountClipboardFormats()
-
EnumClipboardFormats()
-
IsClipboardFormatAvailable()
-
GetPriorityClipboardFormat()
-
GetUpdatedClipboardFormats()
-
GetClipboardData()
和OleGetClipboard()