对剪贴板查看器内的延迟渲染数据的GetClipboardData会导致递归WM_DRAWCLIPBOARD

时间:2013-09-19 13:23:21

标签: winapi clipboard

当其他程序将延迟渲染数据放入剪贴板时(通过调用SetClipboardData(fmt,NULL)),我的剪贴板查看器获取WM_DRAWCLIPBOARD。
当我的查看器调用GetClipboardData()时,我的窗口proc以另一个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;
}

1 个答案:

答案 0 :(得分:1)

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

  

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

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