如何使用C ++在后台跟踪剪贴板更改

g00*_*v1n 3 c++ windows clipboard winapi

我需要在后台应用程序中处理剪贴板的内容。

我怎样才能做到这一点?

我需要一个每次更换剪贴板时都会调用的事件。从哪个应用程序复制都没有关系。

我知道读写功能,例如GetClipboardData()SetClipboardData()

有任何想法如何在C ++中做到这一点?

提前致谢!

Mar*_*ryl 5

从Windows Vista开始,正确的方法是使用剪贴板格式的侦听器:

case WM_CREATE: 
  // ...
  AddClipboardFormatListener(hwnd);
  // ...
  break;

case WM_DESTROY: 
  // ...
  RemoveClipboardFormatListener(hwnd);
  // ...
  break;

case WM_CLIPBOARDUPDATE:
  // Clipboard content has changed
  break;
Run Code Online (Sandbox Code Playgroud)

请参阅监视剪贴板内容

有三种监视剪贴板更改的方法。最古老的方法是创建剪贴板查看器窗口。Windows 2000添加了查询剪贴板序列号的功能,Windows Vista添加了对剪贴板格式侦听器的支持。支持剪贴板查看器窗口,以便与早期版本的Windows向后兼容。新程序应使用剪贴板格式的侦听器或剪贴板的序列号。


duD*_*uDE 3

看一下监视剪贴板内容

剪贴板查看器窗口显示剪贴板的当前内容,并在剪贴板内容更改时接收消息。要创建剪贴板查看器窗口,您的应用程序必须执行以下操作:

Add the window to the clipboard viewer chain.
Process the WM_CHANGECBCHAIN message.
Process the WM_DRAWCLIPBOARD message.
Remove the window from the clipboard viewer chain before it is destroyed.
Run Code Online (Sandbox Code Playgroud)

将窗口添加到剪贴板查看器链:

case WM_CREATE: 

    // Add the window to the clipboard viewer chain. 

    hwndNextViewer = SetClipboardViewer(hwnd); 
    break;
Run Code Online (Sandbox Code Playgroud)

处理 WM_CHANGECBCHAIN 消息:

case WM_CHANGECBCHAIN: 

    // If the next window is closing, repair the chain. 

    if ((HWND) wParam == hwndNextViewer) 
        hwndNextViewer = (HWND) lParam; 

    // Otherwise, pass the message to the next link. 

    else if (hwndNextViewer != NULL) 
        SendMessage(hwndNextViewer, uMsg, wParam, lParam); 

    break;
Run Code Online (Sandbox Code Playgroud)

  • 不建议在新程序中使用剪贴板查看器。行为不当的剪贴板查看器可能会导致剪贴板无法使用。如果有两个剪贴板查看器并且其中一个行为不当,则另一个剪贴板查看器将不会收到通知。剪贴板格式侦听器更加强大。 (4认同)
  • 来自同一页面:“新程序应使用剪贴板格式侦听器或剪贴板序列号。” 使用 AddClipboardFormatListener。 (3认同)