剪贴板查看器中延迟呈现数据的GetClipboardData导致递归WM_DRAWCLIPBOARD [英] GetClipboardData on a delay rendered data inside a clipboard viewer causes recursive WM_DRAWCLIPBOARD

查看:316
本文介绍了剪贴板查看器中延迟呈现数据的GetClipboardData导致递归WM_DRAWCLIPBOARD的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当其他某个程序将延迟渲染的数据放到剪贴板上时(通过调用SetClipboardData(fmt,NULL)),我的剪贴板查看器将获得WM_DRAWCLIPBOARD。
当我的查看器调用GetClipboardData()时,我的窗口proc是

我找不到关于它的任何描述。

When some other program puts a delay rendered data to clipboard (by calling SetClipboardData(fmt, NULL)), my clipboard viewer gets WM_DRAWCLIPBOARD.
When my viewer calls GetClipboardData(), my window proc is called recursively with another WM_DRAWCLIPBOARD.
I can't find any description of that.

#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 ,应该让消息转发到其他窗口

First, you don't handle WM_DRAWCLIPBOARD properly you should let the message forward to other windows


http://msdn.microsoft .com / zh-CN / library / windows / desktop / ms649025%28v = vs.85%29.aspx

每个收到WM_DRAWCLIPBOARD消息的窗口都必须调用
SendMessage函数将消息传递到
剪贴板查看器链中的下一个窗口。链中下一个窗口的句柄是SetClipboardViewer返回的
,它可能会响应
WM_CHANGECBCHAIN消息而更改。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms649025%28v=vs.85%29.aspx
Each window that receives the WM_DRAWCLIPBOARD message must call the SendMessage function to pass the message on to the next window in the clipboard viewer chain. The handle to the next window in the chain is returned by SetClipboardViewer, and may change in response to a WM_CHANGECBCHAIN message.

第二,很不幸收到很多 WM_DRAWCLIPBOARD 。根据经验,通常会收到0到4之间的信号。
丑陋的窍门(起作用)是获取每次呼叫的时间戳,如果距离太近,则忽略它。

Second, unfortunately receiving many WM_DRAWCLIPBOARD is common. By experience it's common to receive between 0 and 4.
The ugly trick (which works) is to get timestamps on each call, and if it's too close to the previous one simply ignore.

这篇关于剪贴板查看器中延迟呈现数据的GetClipboardData导致递归WM_DRAWCLIPBOARD的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆