2017-10-11 1 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' 레이블의 절반은 '스위치'밖에 있습니다. 그것은 심지어 컴파일합니까? –

답변

2

클립 보드 뷰어 및 클립 보드 형식 수신기 (뷰어 대신 Vista +에서 사용해야하는 기능)는 클립 보드에 저장된 데이터의 변경을 탐지하기위한 것입니다. 다른 건 없어. 새로운 데이터가 클립 보드에 놓여지면 WM_DRAWCLIPBOARD 및메시지가 시청자/청취자에게 전송됩니다. 클립 보드에서 데이터를 붙여 넣을 때 보내는 메시지가 없습니다.

단순히 클립 보드 뷰어/수신기로 붙여 넣기를 감지 할 수 없습니다. 이 작업은 해당 API가 설계된 것이 아닙니다.

당신은 당신이 원하는 것을하기 위해 몇 가지 글로벌 후크를 사용해야 할 것입니다. SetWindowsHookEx() 또는 RegisterRawInputDevices()을 통한 키보드 후크는 Ctrl + V 키 스트로크를 모니터링 할 수 있습니다. SetWindowsHookEx()을 통한 메시지 후크는 WM_PASTE, EM_PASTESPECIAL, WM_COMMAND 등과 같이 붙여 넣기와 관련된 창 메시지를 모니터링 할 수 있습니다. 그렇다고하더라도 가능한 모든 붙여 넣기 작업을 감지 할 수있는 것은 아닙니다. 응용 프로그램은 원하는대로 붙여 넣기를 구현할 수 있습니다.

데이터를 클립 보드에 쿼리하는 다양한 Win32 API 함수를 직접 연결하기 위해 코드를 대상 프로세스에 삽입해야 할 것입니다.

  • CountClipboardFormats()
  • EnumClipboardFormats()
  • : 그럼 당신은 가짜 대상 프로세스가 시도 결과 (앱에 붙여 넣기 할 수 데이터가 없다고 생각하고 같은) 붙여 넣기 작업의 어떤 종류 중에 데이터를 검색 할 수 있습니다
  • IsClipboardFormatAvailable()
  • GetPriorityClipboardFormat()
  • GetUpdatedClipboardFormats()
  • GetClipboardData()OleGetClipboard()
관련 문제