现在的位置: 首页 > 综合 > 正文

VC 为程序创建快捷方式的详细讲解

2012年08月25日 ⁄ 综合 ⁄ 共 3473字 ⁄ 字号 评论关闭

有时候,为了方便用户使用我们编写的程序,需要在桌面,快速启动或程序组中创建程序的快捷方式。下面就介绍在VC下如何为程序创建快捷方式。

一.得到桌面,快速启动或程序组的路径

这里介绍二个win32 API函数来完成这个任务。

第一个函数 获得系统特殊路径

HRESULT SHGetSpecialFolderLocation(

HWND hwndOwner,  int nFolder, PIDLIST_ABSOLUTE *ppidl

);

第一个参数表示所有者窗口句柄,一般传入NULL就可以了。

第二个参数要示是一个整数id,决定哪个目录是待查找目录,它的取值可能是

  CSIDL_BITBUCKET            回收站

  CSIDL_CONTROLS            控制面板

  CSIDL_DESKTOP              Windows桌面desktop;

  CSIDL_DESKTOPDIRECTORY   desktop的目录;

  CSIDL_DRIVES                我的电脑

  CSIDL_FONTS                 字体目录

  CSIDL_NETHOOD             网上邻居

  CSIDL_NETWORK             网上邻居virtual folder

  CSIDL_PERSONAL             我的文档

  CSIDL_PRINTERS              打印机

  CSIDL_PROGRAMS             程序组

  CSIDL_RECENT                最近打开文档

  CSIDL_SENDTO                发送到菜单项

  CSIDL_STARTMENU            快速启动菜单

  CSIDL_STARTUP               启动目录

  CSIDL_TEMPLATES            临时文档

第三个参数表示一个条目标识符列表指针,可以传入一个LPITEMIDLIST类型变量,再从这个变量中得到表示路径的字符串。使用完后,要用void CoTaskMemFree(void * pv)来释放资源。

 

第二个函数 将一个条目标识符列表转换为一个文件系统路径

BOOL SHGetPathFromIDList( 

PCIDLIST_ABSOLUTE pidl,  LPTSTR pszPath

);

第一个参数 pidl就是用第一个函数所得到的条目标识符列表指针。

第二个参数pszPath返回表示路径的字符串。

 

这二个函数的头文件均为<shlobj.h>并要引入shell32.lib

 

下面给出了一个程序,用来列举你电脑上一些系统特殊路径:

#include <stdio.h>

#include <windows.h>

#include <shlobj.h>

#pragma comment(lib, "shell32.lib")

 

int main()

{

       const int ENDNUMBER = -1;//哨兵,在遍历数组时遇到此数表示已经到达了数组的最后。

       //设置这个后,你可以在nFolders数组中任意添加删除数据而不用在遍历数组时考虑其中有多少个数据。

 

       CoInitialize(NULL);

       int nFolders[] = {

              CSIDL_BITBUCKET, CSIDL_CONTROLS, CSIDL_DESKTOP, CSIDL_DESKTOPDIRECTORY,

              CSIDL_DRIVES, CSIDL_FONTS, CSIDL_NETHOOD, CSIDL_NETWORK, CSIDL_PERSONAL,

              CSIDL_PRINTERS, CSIDL_PROGRAMS, CSIDL_RECENT, CSIDL_SENDTO, CSIDL_STARTMENU,

              CSIDL_STARTUP, CSIDL_TEMPLATES, ENDNUMBER

       };

 

       HRESULT       hr;

       LPITEMIDLIST  ppidl;

       char          szPath[MAX_PATH];

 

       int i = 0; 

       while (nFolders[i] != ENDNUMBER)

       {

              hr = SHGetSpecialFolderLocation(NULL, nFolders[i], &ppidl);

              if (hr != S_OK)

              {

                     printf("SHGetSpecialFolderLocation Error\n");

              }

              else

              {

                     if (SHGetPathFromIDList(ppidl, szPath))

                            printf("%s\n", szPath);

                     else

                            printf("SHGetPathFromIDList Error\n");

                     CoTaskMemFree(ppidl);

              }

 

              i++;

       }

       CoUninitialize();

       return 0;

}

由于系统的差异,有时会输出“SHGetPathFromIDList Error”,在我电脑上就输出了5次。有了这个例子,相信不难写出得到桌面桌面(CSIDL_DESKTOP),快速启动CSIDL_APPDATA),程序组(CSIDL_PROGRAMS)的路径函数。

不过要稍稍注意下快捷启动,要再加上"\\Microsoft\\Internet Explorer\\Quick Launch"

 

二.创建快捷方式文件

完成第一步的任务后接下来的问题是如何创建快捷方式文件即.lnk文件。首先要了解快捷方式文件要设置什么,然后了了解怎样设置。

2.1快捷方式文件有哪些要设置的内容

下面给出了Spy++Kmplayer Plus二个程序的快捷方式。

快捷方式必须设置目标,起始位置,快捷键,备注都可以选择性的设置,运行方式一般取默认值----常规窗口。

2.2如何设置快捷方式文件的内容

这要用到二个COM接口IShellLinkIPersistFile。由于篇幅问题,这里只讲解二个接口的部分函数。

IShellLink的部分函数

HRESULT SetPath(LPCTSTR pszFile);             设置目标

HRESULT SetWorkingDirectory(LPCTSTR pszDir);  设置起始位置

HRESULT SetHotkey(WORD wHotkey);           设置快捷键

HRESULT SetShowCmd(int iShowCmd);           设置运行方式

       有三种选择SW_SHOWNORMAL常规窗口

SW_SHOWMAXIMIZED最大化SW_SHOWMINNOACTIVE最小化

HRESULT SetDescription(LPCTSTR pszName);      设置备注

要特别说下SetHotkey()中的参数WORD wHotkeyMSDN上对其的解释为:

The address of the hot key. The virtual key code is in the low-order byte, and the modifier flags are in the high-order byte. The modifier flags can be a combination of the following values.

HOTKEYF_ALT        ALT key

HOTKEYF_CONTROL   CTRL key

HOTKEYF_EXT        Extended key

HOTKEYF_SHIFT      SHIFT key

意思就是对这个WORD值,低位上是virtual key code,高位上可以是

抱歉!评论已关闭.