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

Winapi 剪贴板查看器中延迟渲染的数据上的GetClipboardData会导致递归WM_DRAWCLIPBOARD,winapi,clipboard,Winapi,Clipboard,当其他程序将延迟渲染的数据放入剪贴板时(通过调用SetClipboardData(fmt,NULL)),我的剪贴板查看器将获得WM_DRAWCLIPBOARD。 当我的查看器调用GetClipboardData()时,我的窗口进程将与另一个WM_DRAWCLIPBOARD一起递归调用。 我找不到这方面的任何描述 #define MY_CF CF_RIFF LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM l

当其他程序将延迟渲染的数据放入剪贴板时(通过调用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;
}

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


接收WM_DRAWCLIPBOARD消息的每个窗口都必须调用 SendMessage函数,用于将消息传递到 剪贴板查看器链。链中下一个窗口的句柄是 由SetClipboardViewer返回,并且可能会根据 WM_更改CBCHAIN消息


第二,不幸的是,收到许多
WM\u
是很常见的。根据经验,通常在0到4之间接收
丑陋的技巧(有效)是在每次调用时获取时间戳,如果时间戳太接近上一次调用,则忽略。

或(重新)在每条消息上启动一个短计时器,当计时器过期时,则假设剪贴板内容已稳定。“首先,您没有正确处理WM_DRAWCLIPBOARD”我从示例中删除了很多代码我使用全局标志检查递归SetClipboardViewer()也调用窗口过程,如果我在其中获取剪贴板数据,则调用SetClipboardViewer()fails@basin如果处理了功能故障,但没有解决任何问题,请尝试使用计时器方法。在转发邮件之前,请确保解锁剪贴板。