0

当其他一些程序将延迟渲染的数据放入剪贴板时(通过调用 SetClipboardData(fmt, NULL)),我的剪贴板查看器将获得 WM_DRAWCLIPBOARD。
当我的查看器调用 GetClipboardData() 时,我的窗口过程被另一个 WM_DRAWCLIPBOARD 递归调用。
我找不到任何描述。

#define MY_CF CF_RIFF

LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch (uMsg) {
        case WM_DRAWCLIPBOARD:
            OpenClipboard(hwnd);
            HGLOBAL hglob = GetClipboardData(MY_CF); // Sends recursive WM_DRAWCLIPBOARD
            break;
        default:
            return DefWindowProc( hwnd,uMsg,wParam,lParam);
    }
    return 0;
}
4

1 回答 1

1

首先,你没有WM_DRAWCLIPBOARD正确处理你应该让消息转发到其他窗口

http://msdn.microsoft.com/en-us/library/windows/desktop/ms649025%28v=vs.85%29.aspx
每个接收到 WM_DRAWCLIPBOARD 消息的窗口都必须调用 SendMessage 函数将消息传递给剪贴板查看器链中的下一个窗口。链中下一个窗口的句柄由 SetClipboardViewer 返回,并且可以响应 WM_CHANGECBCHAIN 消息而改变。

其次,不幸的是,收到很多WM_DRAWCLIPBOARD是很常见的。根据经验,通常会收到 0 到 4 之间
的值。丑陋的技巧(有效)是在每次调用时获取时间戳,如果它与前一个调用太接近,则只需忽略。

于 2013-09-19T15:19:30.643 回答