剪贴板查看器无法获得粘贴通知

时间:2017-10-11 23:30:36

标签: c winapi clipboard

我需要在某个程序的窗口中阻止从剪贴板粘贴。我在我的程序中设置了一个剪贴板查看器,如下所示:

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;
    }

 }

}

我正在做的是检查当前前景窗口是否是目标程序窗口,如果是,我清空剪贴板。但是这段代码没有检测到粘贴。例如,当我使用鼠标粘贴到目标窗口内时。

如何检测粘贴?

1 个答案:

答案 0 :(得分:2)

剪贴板查看器和剪贴板格式侦听器(您应该在Vista +而不是查看器中使用它)仅用于检测对剪贴板上存储的数据的更改。没有其他的。当新数据放在剪贴板上时,WM_DRAWCLIPBOARDWM_CLIPBOARDUPDATE消息将发送给查看者/侦听器。从剪贴板粘贴数据时没有发送消息。

您根本无法使用剪贴板查看器/侦听器检测到粘贴。该任务不是那些API的设计目标。

你将不得不使用一些全局钩子来做你想要的。通过SetWindowsHookEx()RegisterRawInputDevices()的键盘钩子可以监视 Ctrl + V 键击。通过SetWindowsHookEx()的消息钩子可以监视与粘贴相关的窗口消息,例如WM_PASTEEM_PASTESPECIALWM_COMMAND等。但即便如此,也不能保证每次都能检测到可能的粘贴操作。应用程序可以自由地实现它们想要的粘贴。

您可能不得不求助于将代码注入目标进程,以直接挂钩查询剪贴板数据的各种Win32 API函数。然后,当目标进程在任何类型的粘贴操作期间尝试检索数据时(例如,让应用程序认为没有可用于粘贴的数据),您可以伪造结果:

  • CountClipboardFormats()
  • EnumClipboardFormats()
  • IsClipboardFormatAvailable()
  • GetPriorityClipboardFormat()
  • GetUpdatedClipboardFormats()
  • GetClipboardData()OleGetClipboard()