如何实现快捷方式中的查找目标功能

2016-01-29 12:26 53 1 收藏

如何实现快捷方式中的查找目标功能,如何实现快捷方式中的查找目标功能

【 tulaoshi.com - C语言心得技巧 】

如何实现快捷方式中的查找目标功能

作者:梁永喜

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

下载源代码

  最近写一个开发辅助工具,在这个过程要做一个类似文件快捷方式中查找目标的功能,先查MSDN98,大家不要见笑,我现在一直都用它,没有相应的API,后又. Net 2003中的MSDN,找到了可以实现该功能的API,SHOpenFolderAndSelectItems()函数,它的原型如下:
(具体用法参考MSDN)“Opens a Microsoft® Windows® Explorer window with specified items in a particular folder selected.”

HRESULT SHOpenFolderAndSelectItems(    LPCITEMIDLIST pidlFolder,    UINT cidl,    LPCITEMIDLIST *apidl,    DWORD dwFlags);

  但是,它需要Windows XP及上,若在Win2000或Win98如何实现它呢?于是我就上网搜索,几经周折最终搜到的一篇文章,但它只是利用工具通过反汇编Windows API函数得到的代码,可能可以实现与快捷方式相同的对话框(我没有试过),但其代码可读性非常差,我只能参考一下大概的流程,他提到一个非常重要的一点,那就是使用一个未公开的API函数SHGetIDispatchForFolder,它可帮助我打开文件夹。好不多说了,下面是关键的部分:
  查找目标功能,分为两个步骤,首先打开或找到目标文件所在的文件夹,其次在打开的文件夹中选中相应的项目(即文件)。在说这个步骤之前,先认识一下,下面两个结构

typedef struct _SHITEMID {     USHORT cb;     BYTE   abID[1]; } SHITEMID, * LPSHITEMID; typedef const SHITEMID  * LPCSHITEMID; typedef struct _ITEMIDLIST {    SHITEMID mkid;} ITEMIDLIST, * LPITEMIDLIST; typedef const ITEMIDLIST * LPCITEMIDLIST; 
  这两个结构的数据保存的是项目定义符列表(仅是字面翻译),这个结构所表示的文件夹及文件除了正常的,还包括一些特殊的文件夹及文件(如目录,我的电脑等),SHGetIDispatchForFolder函数正是用它的做为参数,可以打开一些特殊的文件夹。SHGetIDispatchForFolder函数的原型是:
      HRESULT (WINAPI*gpfSHGetIDispatchForFolder)(ITEMIDLIST* pidl, IWebBrowserApp** ppIWebBrowserApp); 
  通常快捷方式给我的ITEMIDLIST是包含文件名的,若直接调用上面的函数,它将直接会打开出目标文件,而不是打开文件夹。下面是区分文件及文件夹的代码:
  pIdlFile = pidl;      /// 找出目标文件中文件名的偏移量while (cb = pIdlFile-mkid.cb) {pidl2 = pIdlFile;pIdlFile = (ITEMIDLIST*)((BYTE*)pIdlFile + cb);}cb = pidl2-mkid.cb;pidl2-mkid.cb = 0;
下面是打开文件夹及选中文件的代码,相信大家不难理解。
   /// 打开目标文件所在的文件夹if (SUCCEEDED(GetShellFolderViewDual(pidl, &pIShellFolderViewDual))) {pidl2-mkid.cb = cb;// 0 Deselect the item. // 1 Select the item. // 3 Put the item in edit mode. // 4 Deselect all but the specified item. // 8 Ensure the item is displayed in the view. // 0x10 Give the item the focus. COleVariant bszFile(pidl2);      if(pIShellFolderViewDual != NULL){/// 选中相应的选项pIShellFolderViewDual-SelectItem(bszFile, 0x1d);pIShellFolderViewDual-Release();}return TRUE;}
  源代码中包含了一个DEMO。下面是完整的函数,可以直接调用FindTarget(CString str)参数为文件名,若是快捷方式则会自动指向其目标。若代码中已做过COM的初始化工作,请删除CoInitialize(NULL);及CoUninitialize();语句。
HRESULT GetShellFolderViewDual(ITEMIDLIST* pidl, IShellFolderViewDual** ppIShellFolderViewDual){IWebBrowserApp* pIWebBrowserApp;IDispatch* pDoc;HWND hWnd;HRESULT hr;HINSTANCE ghSHDOCVW;HRESULT (WINAPI*gpfSHGetIDispatchForFolder)(ITEMIDLIST* pidl, IWebBrowserApp** ppIWebBrowserApp);*ppIShellFolderViewDual = NULL;ghSHDOCVW = LoadLibrary(_T("SHDOCVW.DLL"));if (ghSHDOCVW == NULL)return FALSE;pIWebBrowserApp=NULL;gpfSHGetIDispatchForFolder = (HRESULT (WINAPI*)(ITEMIDLIST*, IWebBrowserApp**)) GetProcAddress(ghSHDOCVW, "SHGetIDispatchForFolder");if (gpfSHGetIDispatchForFolder == NULL)return FALSE;/// 调用未公开的API函数 SHGetIDispatchFor
                        

来源:http://www.tulaoshi.com/n/20160129/1486115.html

延伸阅读
标签: windows 操作系统
快捷方式是Windows系统为方便用户而设计的一个快捷功能,有了它,我们就可以快速打开各种文件。其实,快捷方式除了它的本职之外,还有许多秘密。 1. 改变快捷方式图标 每个软件建立快捷方式的时候都会指定自己的图标,如果你嫌它没个性,没关系,改了它。右击它并选择“属性”,在“快捷方式”选项卡中选择“更改图标”,在...
标签: 电脑入门
在Windows上安装软件的时候,一般会在桌面建立一个相应的快捷图标,并且有一个快捷标示的小箭头,从Windows 98的时候,很多人就会应用各种方法去除它,优化、美化类工具软件大多也提供了去除快捷图标小箭头的选项,其实都是通过修改注册表选项实现的。 图标上的小箭头 Windows 优化大师中提供了去除快捷图标箭头的功能 Windows 7系统...
下面的代码向你演示在VB中如何创建一个快捷方式。 PrivateDeclareFunctionfCreateShellLinkLib"STKIT432.DLL"(ByVallpstrFolderNameAsString,ByVallpstrLinkNameAsString,ByVallpstrLinkPathAsString,ByVallpstrLinkArgsAsString)AsLong SubCommand1_Click() DimlReturnAsLong '添加到桌面 lReturn=fCre...
标签: Web开发
需将站点设为信任站点。              var fso = new ActiveXObject("Scripting.FileSystemObject");                var shell = new ActiveXObject("WScript.Shell");     ...
标签: windows 操作系统
作为微软历史上号称最人性化的操作系统,Vista在运行速度以及操作方便上均让人十分惊讶,例如,如果你想要删除桌面上一个快捷方式,竟然只需要7步就可以完成。 1.拥有一个不需要的快捷方式--如图“Microsoft Beta Client” 2.右键点击,删除--Vista会询问你是否确定 3.垃圾箱拒绝“收货”,Vista要求你再次确认是否要删除 4.Vista表示...

经验教程

117

收藏

39
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部