博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 获取桌面(Desktop)选中项
阅读量:6092 次
发布时间:2019-06-20

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

代码思路来源于开源项目 ,并做了简化.

开始

在VS2017 下创建C++控制台项目,在预编译头文件添加适当的include

#ifndef PCH_H#define PCH_H// TODO: 添加要在此处预编译的标头#include
#include
#include
#include
#include
#include
#include
#include
#include
#endif //PCH_H// 以上为QuickLook所添加的头文件.复制代码

创建函数定义

void GetSelectedInternernal(CComQIPtr
pwba);void ObtainFirstItem(CComPtr
dao);void getSelectedFromDesktop();复制代码

main 函数

int main(){	for (;;)	{		getSelectedFromDesktop();		Sleep(1000);	}}// 考虑到测试用途直接来个无限循环+Sleep复制代码

getSelectedFromDesktop

void getSelectedFromDesktop() {    // 初始化	CoInitialize(nullptr);	CComPtr
psw; CComQIPtr
pwba; // 获取 IShellWindows 实例 if (FAILED(psw.CoCreateInstance(CLSID_ShellWindows))) return; VARIANT pvarLoc; VariantInit(&pvarLoc); long phwnd; // 获取 IWebBrowserApp 实例 if (FAILED(psw->FindWindowSW(&pvarLoc, &pvarLoc, SWC_DESKTOP, &phwnd, SWFO_NEEDDISPATCH, reinterpret_cast
( &pwba)))) return; GetSelectedInternernal(pwba);}复制代码

GetSelectedInternernal

// 层层递进取得最终的IShellView,并取出选中项(SVGIO_SELECTION)void GetSelectedInternernal(CComQIPtr
pwba) { CComQIPtr
psp; if (FAILED(pwba->QueryInterface(IID_IServiceProvider, reinterpret_cast
(&psp)))) { return; } CComPtr
psb; if (FAILED(psp->QueryService(SID_STopLevelBrowser, IID_IShellBrowser, reinterpret_cast
(&psb)))) { return; } CComPtr
psv; if (FAILED(psb->QueryActiveShellView(&psv))) { return; } CComPtr
dao; if (FAILED(psv->GetItemObject(SVGIO_SELECTION, IID_IDataObject, reinterpret_cast
(&dao)))) { return; } ObtainFirstItem(dao);}复制代码
// 最终提取文件地址void ObtainFirstItem(CComPtr
dao) { FORMATETC formatetc; STGMEDIUM medium = { sizeof medium }; formatetc.cfFormat = CF_HDROP; formatetc.ptd = nullptr; formatetc.dwAspect = DVASPECT_CONTENT; formatetc.lindex = -1; formatetc.tymed = TYMED_HGLOBAL; medium.tymed = TYMED_HGLOBAL; if (FAILED(dao->GetData(&formatetc, &medium))) return; // 获取选中数量 int n = DragQueryFile(HDROP(medium.hGlobal), 0xFFFFFFFF, nullptr, 0); if (n < 1) return; WCHAR buffer[260] = { '\0' }; // 选择第一个 DragQueryFile(HDROP(medium.hGlobal), 0, buffer, MAX_PATH - 1); // 输出 std::wcout << buffer << std::endl;}复制代码

转载于:https://juejin.im/post/5bbf403de51d450e40070af5

你可能感兴趣的文章
记录使用Vue相关API开发项目时遇到的问题难点整理(不定时更新)
查看>>
《Java8实战》-第五章读书笔记(使用流Stream-02)
查看>>
vue轮播图插件之vue-awesome-swiper
查看>>
Cabloy.js:基于EggBorn.js开发的一款顶级Javascript全栈业务开发框架
查看>>
HTTP相关知识汇总
查看>>
使用wagon-maven-plugin部署Java项目到远程服务器
查看>>
新书推荐 |《PostgreSQL实战》出版(提供样章下载)
查看>>
JavaScript/数据类型/function/closure闭包
查看>>
30个免费资源:涵盖机器学习、深度学习、NLP及自动驾驶
查看>>
express中间层搭建前端项目3
查看>>
【刷算法】我知道的所有类似斐波那契数列的问题
查看>>
centos下安装JAVA开发工具(3)------Mysql
查看>>
JS 实现文字滚动显示
查看>>
php实现依赖注入(DI)和控制反转(IOC)
查看>>
如何搭建高质量、高效率的前端工程体系--页面结构继承
查看>>
白山云科技 CTO 童剑:空降后,如何有技术又有艺术地破局?
查看>>
自动化运维工具Ansible之roles
查看>>
MongoDB分片搭建
查看>>
5、Jenkins Email Extension Plugin插件使用说明
查看>>
Flex(mx:DataGrid)实现数据过滤显示
查看>>