2017-10-11 10 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_DRAWCLIPBOARDとというメッセージが視聴者/リスナーに送信されます。データがクリップボードから貼り付けられているときには、メッセージは送信されません。

クリップボードビューア/リスナーではペーストを検出できません。そのタスクは、それらのAPIが設計するものではありません。

あなたが望むことをするには、いくつかのグローバルフックを使用する必要があります。 SetWindowsHookEx()またはRegisterRawInputDevices()によるキーボードフックは、Ctrl + Vのキーストロークを監視できます。 SetWindowsHookEx()を経由してメッセージフックはWM_PASTEなどの貼り付けに関連したウィンドウメッセージ、EM_PASTESPECIALWM_COMMANDなどを監視することができますしかし、たとえそうであっても、これはすべての可能なペースト操作を検出する保証するものではありません。アプリケーションはペーストを実装することは自由ですが、彼らは必要です。

あなたはおそらく、直接データのためのクリップボードを照会さまざまなWin32 API関数をフックするターゲット・プロセスにコードを注入することに頼る必要があります。

  • CountClipboardFormats()
  • EnumClipboardFormats()
  • :ターゲット・プロセスがペースト操作の あらゆる種類(アプリを作るような貼り付けるために利用可能なデータが存在しないと思います)の間にデータを取得しようとしたとき、あなたは偽の結果をすることができます
  • IsClipboardFormatAvailable()
  • GetPriorityClipboardFormat()
  • GetUpdatedClipboardFormats()
  • GetClipboardData()および
関連する問題