C 剪贴板查看器没有';无法获得粘贴通知

C 剪贴板查看器没有';无法获得粘贴通知,c,winapi,clipboard,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);

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

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_clipboard更新
消息将发送给观众/听众。从剪贴板粘贴数据时没有发送消息

您无法使用剪贴板查看器/侦听器检测粘贴。这项任务不是这些API的设计目的

你必须使用一些全局钩子来做你想做的事情。通过
SetWindowsHookEx()
RegisterRarWinPutDevices()
的键盘钩子可以监视Ctrl+V按键。通过
SetWindowsHookEx()
的消息挂钩可以监视与粘贴相关的窗口消息,如
WM_-PASTE
EM_-PASTESPECIAL
WM_-COMMAND
等。但即使如此,也不能保证检测到所有可能的粘贴操作。应用程序可以随意实现粘贴

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

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

剪贴板查看器和剪贴板格式侦听器(您应该在Vista+中使用,而不是查看器)仅用于检测剪贴板上存储的数据的更改。没有别的了。将新数据放入剪贴板时,
WM_DRAWCLIPBOARD
WM_clipboard更新
消息将发送给观众/听众。从剪贴板粘贴数据时没有发送消息

您无法使用剪贴板查看器/侦听器检测粘贴。这项任务不是这些API的设计目的

你必须使用一些全局钩子来做你想做的事情。通过
SetWindowsHookEx()
RegisterRarWinPutDevices()
的键盘钩子可以监视Ctrl+V按键。通过
SetWindowsHookEx()
的消息挂钩可以监视与粘贴相关的窗口消息,如
WM_-PASTE
EM_-PASTESPECIAL
WM_-COMMAND
等。但即使如此,也不能保证检测到所有可能的粘贴操作。应用程序可以随意实现粘贴

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

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

一半的
外壳
标签位于
开关外
。甚至可以编译吗?一半的
大小写
标签在
开关
之外。那还可以编译吗?