经常会用到在本地硬盘里面复制一个图片文件(静态、动态),然后粘贴到QQ聊天窗口,图片就直接显示出来了。到底是怎么实现的呢?首先复制文件,通过程序读取粘贴板内容分析,发现格式如下:
Version:0.9
StartHTML:00000097
EndHTML:00000224
StartFragment:00000111
EndFragment:00000188
<html><body>
<!--StartFragment -->
<img src="file:///C:\Users\HiWin81\Desktop\3.gif" />
<!--EndFragment-->
</body>
</html>
于是实现了这样一个接口:
void CopyToClipboard(char* lpszFile)
{
// Version:0.9
// StartHTML:0000000105
// EndHTML:0000000229
// StartFragment:0000000141
// EndFragment:0000000193
// <html>
// <body>
// <!--StartFragment--><img src="file:///C:/Users/HiWin81/Desktop/2.gif" /><!--EndFragment-->
// </body>
// </html>
// Version:0.9
// StartHTML:00000097
// EndHTML:00000224
// StartFragment:00000111
// EndFragment:00000188
// <html><body>
// <!--StartFragment -->
// <img src="file:///C:\Users\HiWin81\Desktop\3.gif" />
// <!--EndFragment-->
// </body>
// </html>
char *buf = new char [400 + strlen(lpszFile)];
if(!buf) return;
static int cfid = 0;
if(!cfid) cfid = RegisterClipboardFormat("HTML Format");
strcpy(buf,
"Version:0.9\r\n"
"StartHTML:00000000\r\n"
"EndHTML:00000000\r\n"
"StartFragment:00000000\r\n"
"EndFragment:00000000\r\n"
"<html>\r\n<body>\r\n"
"<!--StartFragment-->");
strcat(buf, "<img src=\"file:///");//C:/Users/HiWin81/Desktop/2.gif"
strcat(buf, lpszFile);
strcat(buf, "\" />");
strcat(buf,
"<!--EndFragment-->\r\n"
"</body>\r\n"
"</html>");
char *ptr = strstr(buf, "StartHTML");
wsprintf(ptr+10, "%08u", strstr(buf, "<html>") - buf);
*(ptr+10+8) = '\r';
ptr = strstr(buf, "EndHTML");
wsprintf(ptr+8, "%08u", strlen(buf));
*(ptr+8+8) = '\r';
ptr = strstr(buf, "StartFragment");
wsprintf(ptr+14, "%08u", strstr(buf, "<!--StartFrag") - buf);
*(ptr+14+8) = '\r';
ptr = strstr(buf, "EndFragment");
wsprintf(ptr+12, "%08u", strstr(buf, "<!--EndFrag") - buf);
*(ptr+12+8) = '\r';
if(OpenClipboard(0)) {
EmptyClipboard();
HGLOBAL hText = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, strlen(buf)+4);
char *ptr = (char *)GlobalLock(hText);
strcpy(ptr, buf);
GlobalUnlock(hText);
::SetClipboardData(cfid, hText);
CloseClipboard();
GlobalFree(hText);
}
delete [] buf;
}