2017-10-11 140 views
0

我需要阻止在某个程序的窗口中从剪贴板粘贴。我这样设置在我的程序剪贴板查看器:剪贴板查看器没有得到粘贴通知

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

} 

} 

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

如何检测粘贴?

+2

'case'标签的一半在'switch'之外。这甚至编译? –

回答

2

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

你只是不能检测与剪贴板查看器/侦听器粘贴。这个任务不是这些API的设计目的。你将不得不使用一些全局钩子去做你想做的事情。键盘挂钩通过SetWindowsHookEx()RegisterRawInputDevices()可以监视Ctrl + V按键。通过SetWindowsHookEx()的消息挂钩可以监控与粘贴有关的窗口消息,如WM_PASTE,EM_PASTESPECIAL,WM_COMMAND等。但即便如此,这并不能保证检测到每个可能的粘贴操作。不过,应用程序可以自由实现所需的粘贴。

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

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