实现文件右键“打开方式”菜单功能(查看系统这种功能对比实现)
2011-04-29 15:58
776 查看
项目需要实现此功能,刚开始看这个功能的时候感觉很简单,想着肯定有一定的API函数能实现,没那么麻烦,可真正让我自己编码,去查找资料的时候我发觉对我有点困难,在此我想记录下我实现这个功能的步骤,寻找的资料 和方法。以供自己后续学习和进步
1.首先获取File关联的OpenWithList。。。
在网上查有关信息得到下面描述~~~
下面引用网站说法:::::::
最近因为的项目的原因,有一个机能要实现,什么机能呢?
其实很简单,得到一个文件的打开方式,也就是OpenWithList,当用户在一个文件上点击右键时,就会出现一个“打开方式”菜单项,英文中是”Open With”,我现在要做的就是取得这些打开方式列表。
我在网上调查了很久,没有找到一个很好的解决办法,我知道这些信息都存在于注册表中,而且我也知道存在哪里的,我写过一个程序来从注册表中取,行是行,但有效率问题,还有可能不准确,这方面的API也不多,还好,现在终于把这个问题解决了,完美解决,现在把它拿出来与大家分享一下。
用到的API和接口如下:
SHAssocEnumHandler,它可以得到一些接口的指针,其原型如下:
HRESULT SHAssocEnumHandlers(
LPCWSTR pszExtra,
ASSOC_FILTER afFilter,
IEnumAssocHandlers **ppEnumHandler);
具体的请参见MSDN,那么这个API就可以得到一个IEnumAssocHandlers类型的指针。我们再来看看IEnumAssocHandlers是什么东西。
IEnumAssocHandlers
Exposes a method that allows enumeration of a collection of handlers associated with particular file extensions(MSDN解释)
IEnumAssocHandlers
它提供了一个Next函数,用他就可以得到IAssocHandler 指针,IAssocHandler 这个接口就提供了取得打开方式列表的属性,如路径,图标,描述信息等。
以下是我写的代码:
WCHAR *pFileExt = L”.txt”; //扩展名
IEnumAssocHandlers *peah = NULL;
IAssocHandler *pah = NULL;
HRESULT hr = S_OK;
hr = SHAssocEnumHandlers(pFileExt, ASSOC_FILTER_RECOMMENDED, &peah);
if (SUCCEEDED(hr))
{
ULONG celtFetched = 0;
while(SUCCEEDED(peah->Next(1, &pah, &celtFetched)))
{
WCHAR *pFileName = NULL; // 文件路径
WCHAR *pFileDescription = NULL; // 文件描述,如Notepad.exe,就是记事本
if ( SUCCEEDED(pah->GetName(&pFileName))
&& SUCCEEDED(pah->GetUIName(&pFileDescription)) )
{
// 这里循环取得打开方式列表,你可以用一个数据把其存放起来
// To do what you want
}
pah->Release();
}
peah->Release();
}
注意
1.此处peah->Next(1, &pah, &celtFetched)的第一个参数要传1,因为每次取一个,用一个循环来处理,每次取一个,直到取完,我之前传的就不是1,结果取得的IAssocHandler指针它包含了多个Handler,所以就不能正确释放资源,就会出问题,因此Next的第一个参数要传1。
2.这些API和接口是Vista的,所以在XP上我不能保证能正常运行。
3.头文件shobjidl.h是需要的,如果头文件也加了,链接不过的话,把shell32.lib加入到工程中,如#param comment(“lib”, shell32.lib);
我的程序运行结果:
输入一个扩展名,如.txt,我利用程序可以得以得到它的关联打开方式的C:/Windows/notepad.exe,文件描述是“记事本”。
我这里只取了它的第一个文件,当然还可以取多个。
我这里还有一个功能,根据C:/Windows/notepad.exe路径,把它的图标提取出来。
具体做法,以后再写啦,就在不久的将来。
=============================================================================================
2.我用他的方法新建了个VC工程测试,尽管加了.h和lib 还是不管用的(我用的系统是Windows7),还是不行,结果我选择了从注册表中读取。。。
3.我用他的方法新建了个VC工程测试,尽管加了.h和lib 还是不管用的(我用的系统是Windows7),还是不行,结果我发现我本机的SDK中shobjidl.h并没有函数SHAssocEnumHandlers(),又上MSDN上查看这个函数,由经同事指点,我安装了Vista-SDK包,我在VC环境中Tools—Options-Directories中引入了我安装的Vista—Sdk路径(Include、Lib),用新安装SDK下Shobjidl.h替换了我旧的SDK,结果还是编译没通过。。。。。 后来又把这些代码拿在VS08(新建MFC工程)试了下,编译通过,它能完全的获取OpenWithList(),我把工程编译成功在XP 上实验,结果XP是不支持的,这些API和接口是Vista的,在XP上不能正常运行。。。。。。
文章中描述不专业,就算慢慢学习 ,慢慢积累经验。。。。 记录下自己的点点滴滴,逐步改进。。。
1.首先获取File关联的OpenWithList。。。
在网上查有关信息得到下面描述~~~
下面引用网站说法:::::::
最近因为的项目的原因,有一个机能要实现,什么机能呢?
其实很简单,得到一个文件的打开方式,也就是OpenWithList,当用户在一个文件上点击右键时,就会出现一个“打开方式”菜单项,英文中是”Open With”,我现在要做的就是取得这些打开方式列表。
我在网上调查了很久,没有找到一个很好的解决办法,我知道这些信息都存在于注册表中,而且我也知道存在哪里的,我写过一个程序来从注册表中取,行是行,但有效率问题,还有可能不准确,这方面的API也不多,还好,现在终于把这个问题解决了,完美解决,现在把它拿出来与大家分享一下。
用到的API和接口如下:
SHAssocEnumHandler,它可以得到一些接口的指针,其原型如下:
HRESULT SHAssocEnumHandlers(
LPCWSTR pszExtra,
ASSOC_FILTER afFilter,
IEnumAssocHandlers **ppEnumHandler);
具体的请参见MSDN,那么这个API就可以得到一个IEnumAssocHandlers类型的指针。我们再来看看IEnumAssocHandlers是什么东西。
IEnumAssocHandlers
Exposes a method that allows enumeration of a collection of handlers associated with particular file extensions(MSDN解释)
IEnumAssocHandlers
它提供了一个Next函数,用他就可以得到IAssocHandler 指针,IAssocHandler 这个接口就提供了取得打开方式列表的属性,如路径,图标,描述信息等。
以下是我写的代码:
WCHAR *pFileExt = L”.txt”; //扩展名
IEnumAssocHandlers *peah = NULL;
IAssocHandler *pah = NULL;
HRESULT hr = S_OK;
hr = SHAssocEnumHandlers(pFileExt, ASSOC_FILTER_RECOMMENDED, &peah);
if (SUCCEEDED(hr))
{
ULONG celtFetched = 0;
while(SUCCEEDED(peah->Next(1, &pah, &celtFetched)))
{
WCHAR *pFileName = NULL; // 文件路径
WCHAR *pFileDescription = NULL; // 文件描述,如Notepad.exe,就是记事本
if ( SUCCEEDED(pah->GetName(&pFileName))
&& SUCCEEDED(pah->GetUIName(&pFileDescription)) )
{
// 这里循环取得打开方式列表,你可以用一个数据把其存放起来
// To do what you want
}
pah->Release();
}
peah->Release();
}
注意
1.此处peah->Next(1, &pah, &celtFetched)的第一个参数要传1,因为每次取一个,用一个循环来处理,每次取一个,直到取完,我之前传的就不是1,结果取得的IAssocHandler指针它包含了多个Handler,所以就不能正确释放资源,就会出问题,因此Next的第一个参数要传1。
2.这些API和接口是Vista的,所以在XP上我不能保证能正常运行。
3.头文件shobjidl.h是需要的,如果头文件也加了,链接不过的话,把shell32.lib加入到工程中,如#param comment(“lib”, shell32.lib);
我的程序运行结果:
输入一个扩展名,如.txt,我利用程序可以得以得到它的关联打开方式的C:/Windows/notepad.exe,文件描述是“记事本”。
我这里只取了它的第一个文件,当然还可以取多个。
我这里还有一个功能,根据C:/Windows/notepad.exe路径,把它的图标提取出来。
具体做法,以后再写啦,就在不久的将来。
=============================================================================================
2.我用他的方法新建了个VC工程测试,尽管加了.h和lib 还是不管用的(我用的系统是Windows7),还是不行,结果我选择了从注册表中读取。。。
3.我用他的方法新建了个VC工程测试,尽管加了.h和lib 还是不管用的(我用的系统是Windows7),还是不行,结果我发现我本机的SDK中shobjidl.h并没有函数SHAssocEnumHandlers(),又上MSDN上查看这个函数,由经同事指点,我安装了Vista-SDK包,我在VC环境中Tools—Options-Directories中引入了我安装的Vista—Sdk路径(Include、Lib),用新安装SDK下Shobjidl.h替换了我旧的SDK,结果还是编译没通过。。。。。 后来又把这些代码拿在VS08(新建MFC工程)试了下,编译通过,它能完全的获取OpenWithList(),我把工程编译成功在XP 上实验,结果XP是不支持的,这些API和接口是Vista的,在XP上不能正常运行。。。。。。
文章中描述不专业,就算慢慢学习 ,慢慢积累经验。。。。 记录下自己的点点滴滴,逐步改进。。。
相关文章推荐
- 实现文件右键“打开方式”菜单功能(查看系统这种功能对比实现)(读注册表的方法)
- XP中完美实现vista中快捷方式右键添加“打开文件位置”功能
- python实现应用程序在右键菜单中添加打开方式功能
- 右键菜单的“打开方式―选择程序”功能不能使用
- ListView实现XP系统打开文件夹和文件功能
- C# 系统应用之ListView控件 (三).添加ContextMenuStrip右键菜单打开删除文件
- ASP.NET 2.0实现类似QQ邮箱中‘HTML方式查看’功能查看Office文件
- 把程序注册到系统右键菜单,并获取打开的文件地址信息。
- windows客户端实现类似windows系统右键新建菜单功能
- 为快捷方式文件(lnk文件)右键菜单添加“打开所在文件夹”
- Sublime Text2篇之如何在window中的右键菜单中添加用st2打开方式以及将st2添加至系统的环境变量
- [转]编程实现自定义系统右键菜单功能
- 将sublime text 3打开方式添加到系统右键菜单中
- mfc使用CListCtrl添加右键菜单及双击(以默认方式)打开文件。
- Intent机制及详解-调用系统功能,邮件发送方式,各种文件打开方法
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- android如何实现文件打开方式可供选择功能
- [原创]对于“优盘变成了RAW的文件系统,双击提示需要格式化,右键查看属性是0字节,也无法打开”的解决办法
- [ahk]右键菜单打开文件所在文件夹(快捷方式也适用)
- Android 实现文件打开方式可供选择功能