找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1024|回复: 8

[每日一码] 剪切板内容的数据格式

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-1-16 10:56:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

// 【MoreWindows工作笔记11】EnumClipboardFormats 剪切板内容的数据格式  
// http://blog.csdn.net/morewindows/article/details/17655299  
// 参考http://msdn.microsoft.com/en-us/library/windows/desktop/ms649013(v=vs.85).aspx  
#include <Windows.h>  
#include <iostream>  
#include <cstdio>  
using namespace std;  
int main()  
{  
        printf("   【MoreWindows工作笔记11】OleGetClipboard 访问剪切板的文本内容\n");  
        printf(" - http://blog.csdn.net/morewindows/article/details/17655053 -\n");  
        printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");  

        if (OpenClipboard(NULL))   
        {  
                // 由于设置了VX在复制时带上文字颜色,所以从VS2008中拷贝文本时,数据格式不为CF_UNICODETEXT  
                UINT clipboard_format;  
                while (clipboard_format = EnumClipboardFormats(0))   
                {  
                        printf("Clipboard Data Format = 0x%x\n", clipboard_format);  
                        HGLOBAL global_memory = GetClipboardData(clipboard_format);  
                        LPCSTR clipboard_data = (LPCSTR)GlobalLock(global_memory);  
                        if (clipboard_data != NULL)   
                        {  
                                // 剪切板上数据的地址  
                                printf("Clipboard Data Address = 0x%x\n", global_memory);  

                                // 剪切板上数据大小  
                                DWORD data_size = GlobalSize(global_memory);  
                                printf("Data Size = %d\n", data_size);  

                                // 16进制输出数据  
                                printf("Data: ");  
                                for (DWORD i = 0; i < data_size; i++)   
                                {  
                                        if (i % 8 == 0) putchar(' ');  
                                        if (i % 16 == 0) putchar('\n');  
                                        printf("%02x ", (UCHAR)clipboard_data[i]);  
                                }  
                                putchar('\n');  

                                // 输出部分数据  
                                switch (clipboard_format)   
                                {  
                                case CF_TEXT:  
                                        printf(" 数据格式:CF_TEXT   数据内容:\n%s\n", clipboard_data);  
                                        break;  
                                case CF_UNICODETEXT:  
                                        printf(" 数据格式:CF_UNICODETEXT 数据内容:\n%ls\n", (LPCWSTR)clipboard_data);  
                                        break;  
                                }  
                                GlobalUnlock(global_memory);  
                        }  
                }CloseClipboard();  
        }  
        return 0;  
} 


  • 先复制文本内容,再运行程序。

0.jpg

然后复制文件,再运行程序。

1.jpg





论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2017-1-16 11:05:56 | 显示全部楼层
回的人少,我来小顶一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2017-1-16 11:06:16 | 显示全部楼层
本帖最后由 csharp 于 2017-1-16 11:08 编辑

剪贴板数据格式除了系统标准格式,每个程序还可以自定义格式,AutoCAD 的剪贴板格式在 clipdata.h 中定义的
  1. typedef struct tagClipboardInfo {
  2.     ACHAR        szTempFile[nBlockFileSize];     // block temp file name
  3.     ACHAR        szSourceFile[nBlockFileSize];   // file name of drawing from which selection was made
  4.     ACHAR        szSignature[4];                 // szClipSignature
  5.     int         nFlags;                         // kbDragGeometry: dragging geometry from AutoCAD?
  6.     AcGePoint3d dptInsert;                      // original world coordinate of insertion point
  7.     RECT        rectGDI;                        // GDI coord bounding rectangle of sset
  8.     void*       mpView;                         // Used to verify that this object was created in this view (CDwgView*)
  9.     DWORD       m_dwThreadId;                   // AutoCAD thread that created this DataObject
  10.     int         nLen;                           // Length of next segment of data, if any, starting with chData
  11.     int         nType;                          // Type of data, if any (eExpandedClipDataTypes)
  12.     ACHAR        chData[1];                      // Start of data, if any.
  13. } ClipboardInfo;
复制代码


其中 的 Ctrl+C  命令实质是 wblock 一个临时文件,文件名就保存在  szTempFile 中
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-1-16 12:50:42 | 显示全部楼层

上面哪个是定义格式的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2017-1-17 00:31:55 | 显示全部楼层

我试过删除这个临时文件,照样可以粘贴,而且这个文件不再出现。
我没搞懂,既然可以不要,为什么要生成
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-1-17 00:45:51 | 显示全部楼层

粘贴就是一个对临时数据库的wblockClone,设计的初衷应该是既生成一个临时的文件,同时ADESK对剪切板的数据直接生成个database,因为ADESK了解剪切板的DWG数据结构啊,但是为什么要保留个临时的文件呢,我想是给那些要“定制”自己的粘贴功能的时候给程序员用的,因为普通的开发者不了解剪切板的数据结构,需要用这个临时文件创建数据库。

比如,有的软件,“截获”粘贴命令,然后用自己的代码去“自由”粘贴什么的,用户看起来还是在执行粘贴命令,但是代码其实被应用程序接管了。这个功能就是通过反应器lockDocument的时候,执行veto 来终止“内部”的粘贴命令去执行定制的代码的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2017-1-17 09:07:22 | 显示全部楼层


AutoCAD 内部的粘贴肯定是不依赖外部文件的,Ctrl+C 后找到这个文件,删除,回到AutoCAD,执行粘贴仍旧正确粘贴
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 25个

财富等级: 恭喜发财

发表于 2018-8-13 18:33:09 | 显示全部楼层
楼主保存什么格式的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2018-8-14 06:45:02 来自手机 | 显示全部楼层
高版本复制粘贴到低版本要怎样做呢?
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-26 09:26 , Processed in 0.406016 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表