当其他程序将延迟渲染数据放入剪贴板时(通过调用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;
}
答案 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之间接收是很常见的。
丑陋的技巧(有效)是为每个调用获取时间戳,如果它与前一个调用太接近,则忽略。