2017-10-11 142 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()