博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows粘贴板操作-自己的应用和windows右键互动
阅读量:7143 次
发布时间:2019-06-29

本文共 4409 字,大约阅读时间需要 14 分钟。

一、粘贴板操作函数

BOOL OpenClipboard(HWND hWnd);参数 hWnd 是打开剪贴板的窗口句柄,成功返回TRUE,失败返回FALSE

BOOL CloseClipboard();关闭剪贴板
BOOL EmptyClipboard();清空剪贴板
HANDLE SetClipboardData(CF_HDROP, hGblFiles );往剪切板设置数据
HANDLE GetClipboardData(UINT uFormat); 得到剪贴板中的数据,uFormat是所需要数据的格式,例如本文拖放对象的格式为CF_HDROP
UINT uDropEffect=RegisterClipboardFormat("Preferred DropEffect"); 注册数据类型

详细函数阅读:

往剪贴板中放的数据必须是内存对象:HGLOBAL。这个对象可以通过GlobalAlloc来生成。然后使用GlobalLock就可以得到该对象的内存地址,继而往里面写 数据。实际上在Win32中由于进程拥有独立的内存空间,因而常规的内存分配已经不需要GlobalLock了,看看MSDN就知道该函数主要就是为DDE和剪贴板服务的。

二、操作文本数据

1、复制文本数据

1 void CopyText(const QString & test) 2 { 3     if (OpenClipboard(nullptr))//打开剪贴板 4     { 5         HANDLE hClip; 6         char* pBuf; 7         EmptyClipboard();//清空剪贴板 8         //写入数据 9         hClip = GlobalAlloc(GMEM_MOVEABLE, test.size() + 1);10         pBuf = (char *)GlobalLock(hClip);11         strcpy(pBuf, test.toStdString().c_str());12         GlobalUnlock(hClip);//解锁13         SetClipboardData(CF_TEXT, hClip);//设置格式14 15         //关闭剪贴板16         CloseClipboard();17     }18 }

2、粘贴文本数据

1 QString PasteText() 2 { 3     QString data; 4     if (OpenClipboard(nullptr))//打开剪贴板   5     {   6         if (IsClipboardFormatAvailable(CF_TEXT))//判断格式是否是我们所需要   7         {   8             HANDLE hClip;   9             char * pBuf;  10             //读取数据  11             hClip = GetClipboardData(CF_TEXT);  12             pBuf = (char*)GlobalLock(hClip);  13             GlobalUnlock(hClip);  14             CloseClipboard(); 15 16             data.append(pBuf);17         }  18     } 19 20     return data;21 }

三、操作文件

1、复制文件

1 #include 
2 #include
3 #include
4 5 void CutOrCopyFiles(const char * lpBuffer, uint uBufLen, bool bCopy) 6 { 7 UINT uDropEffect; 8 DROPFILES dropFiles; 9 UINT uGblLen, uDropFilesLen;10 HGLOBAL hGblFiles, hGblEffect;11 char *szData, *szFileList;12 13 DWORD *dwDropEffect;14 15 uDropEffect = RegisterClipboardFormat("Preferred DropEffect");16 hGblEffect = GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));17 dwDropEffect = (DWORD *)GlobalLock(hGblEffect);18 if(bCopy)19 *dwDropEffect = DROPEFFECT_COPY;20 else 21 *dwDropEffect = DROPEFFECT_MOVE;22 GlobalUnlock(hGblEffect);23 24 uDropFilesLen = sizeof(DROPFILES);25 dropFiles.pFiles = uDropFilesLen;26 dropFiles.pt.x = 0;27 dropFiles.pt.y = 0;28 dropFiles.fNC = FALSE;29 dropFiles.fWide = TRUE;30 31 uGblLen = uDropFilesLen + uBufLen * 2 + 8;32 hGblFiles = GlobalAlloc(GMEM_ZEROINIT | GMEM_MOVEABLE | GMEM_DDESHARE, uGblLen);33 szData = (char *)GlobalLock(hGblFiles);34 memcpy(szData,(LPVOID)(&dropFiles), uDropFilesLen);35 szFileList = szData + uDropFilesLen;36 37 MultiByteToWideChar(CP_ACP, MB_COMPOSITE,38 lpBuffer, uBufLen, (WCHAR *)szFileList, uBufLen);39 40 GlobalUnlock(hGblFiles);41 42 if( OpenClipboard(NULL) )43 {44 EmptyClipboard();45 SetClipboardData(CF_HDROP, hGblFiles );46 SetClipboardData(uDropEffect, hGblEffect);47 CloseClipboard();48 }49 }

2、粘贴文件

1 void PasteFile() 2 { 3     UINT uDropEffect = RegisterClipboardFormat("Preferred DropEffect"); 4  5     if(OpenClipboard( nullptr)) 6     {     7         HDROP hDrop = HDROP( GetClipboardData( CF_HDROP)); 8         if(hDrop)  9         {10             DWORD dwEffect, *dw;11             dw = (DWORD *)(GetClipboardData( uDropEffect));12             if(dw == NULL)13                 dwEffect = DROPEFFECT_COPY;14             else15                 dwEffect = *dw;16 17             char Buf[4096];18             Buf[0] = 0;19             UINT cFiles = DragQueryFile( hDrop, (UINT) -1, NULL, 0);20             POINT Point;21             char szFile[ MAX_PATH];22             for(UINT count = 0; count < cFiles; ++count) 23             {24                 DragQueryFile( hDrop, count, szFile, sizeof( szFile));25                 lstrcat(Buf,szFile);26                 lstrcat(Buf," ");27             }28 29             if(dwEffect & DROPEFFECT_MOVE) 30             {31                 MessageBox(NULL, Buf, "Move Files", MB_OK);32             } else    if(dwEffect & DROPEFFECT_COPY) 33             {34                 MessageBox(NULL, Buf, "Copy Files", MB_OK);35             }36 37             CloseClipboard();38         }39     } 40 }

四、参考文章

  :文件操作

  :文本操作

  :操作函数说明

转载地址:http://degrl.baihongyu.com/

你可能感兴趣的文章
java switch
查看>>
java基础-this关键字
查看>>
PMI-ACP练习题知识积累-打印版
查看>>
微信公众平台注册
查看>>
[若有所悟]打造知识共享型团队
查看>>
C语言中变量的储存类别
查看>>
使用Newtonsoft将DataTable转Json
查看>>
HDU1598:find the most comfortable road(并查集 + 枚举)
查看>>
《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(3)--- 服务访问和配置模式...
查看>>
我现在有个表,里面有100个不同的单词,每个单词对应有大概20个词组,我想通过sql,每个单词随机获取对应的3个词组,请问怎么写可以实现?...
查看>>
第十六讲-对抗样本与对抗训练3
查看>>
Objective-C语法汇总
查看>>
BFS --- 模板题
查看>>
React入门
查看>>
IOS给任意UIView截屏
查看>>
codeforces 765 F Souvenirs 线段树+set
查看>>
redhat9 linux 网卡无法激活排障
查看>>
数据库将某个字段由可为空改为非空
查看>>
POJ-2431 优先队列
查看>>
Python框架Django的入门
查看>>