`

window创建快捷方式

    博客分类:
  • MFC
 
阅读更多

有时候,为了方便用户使用我们编写的程序,需要在桌面,快速启动或程序组中创建程序的快捷方式。下面就介绍在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,高位上可以是ALT,CTRL等组合键。可以用MAKEWORD(low, high)来生成一个WORD,如Ctrl+F12可以用MAKEWORD(VK_F12, HOTKEYF_CONTROL)表示。

 

 

 

IPersistFile的部分函数

 

HRESULT Save(          保存快捷方式

 

  LPCOLESTR pszFileName, BOOL fRemember

 

);

 

第一个参数是要保存文件的文件名,要求是绝对路径。

 

第二个参数涉及COM的持续性问题(注1),一般传入TRUE即可。

 

 

 

要创建COM对象可以用CoCreateInstance()函数(见注2)和QueryInterface()函数(见注3)。下面给出了创建的代码:

 

IShellLink     *pLink;   //IShellLink对象指针

 

IPersistFile    *ppf;      //IPersisFil对象指针

 

创建IShellLink实例

 

CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&pLink);

 

IShellLink对象中获取IPersistFile接口

 

pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);

 

创建之后就可以对pLink设置目标,快捷键,备注等,设置完后再用ppf创建快捷方式文件就可以了。当然最后要记得释放资源,pLink->Release(); ppf->Release()

 

 

 

 

 

 

 

三.已封装好的函数代码

 

下面给出封装好的函数代码,可以在程序中直接使用(在XP+VC6.0下测试过)。

 

//得到当前桌面路径

 

BOOL GetDesktopPath(char *pszDesktopPath)

 

{

 

       LPITEMIDLIST  ppidl = NULL;

 

      

 

       if (SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &ppidl) == S_OK)

 

       {

 

              BOOLflag =   SHGetPathFromIDList(ppidl, pszDesktopPath);

 

              CoTaskMemFree(ppidl);

 

              return flag;

 

       }

 

 

 

       return FALSE;

 

}    

 

//得到快速启动栏的路径

 

BOOL GetIEQuickLaunchPath(char *pszIEQueickLaunchPath)

 

{    

 

       LPITEMIDLIST  ppidl;                   

 

      

 

       if (SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &ppidl) == S_OK)

 

       {

 

              BOOLflag =   SHGetPathFromIDList(ppidl, pszIEQueickLaunchPath);

 

              strcat(pszIEQueickLaunchPath, "\\Microsoft\\Internet Explorer\\Quick Launch");

 

              CoTaskMemFree(ppidl);

 

              return flag;

 

       }

 

 

 

       return FALSE;

 

}

 

//得到开始->程序组的路径

 

BOOL GetProgramsPath(char *pszProgramsPath)

 

{

 

       LPITEMIDLIST  ppidl;

 

      

 

       if (SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &ppidl) == S_OK)

 

       {

 

              BOOLflag = SHGetPathFromIDList(ppidl, pszProgramsPath);

 

              CoTaskMemFree(ppidl);

 

              return flag;

 

       }

 

 

 

       return FALSE;

 

}

 

/*

 

函数功能:对指定文件在指定的目录下创建其快捷方式

 

函数参数:

 

lpszFileName    指定文件,为NULL表示当前进程的EXE文件。

 

lpszLnkFileDir  指定目录,不能为NULL

 

lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。

 

wHotkey         0表示不设置快捷键

 

pszDescription  备注

 

iShowCmd        运行方式,默认为常规窗口

 

*/

 

BOOL CreateFileShortcut(LPCSTRlpszFileName, LPCSTRlpszLnkFileDir, LPCSTRlpszLnkFileName,       LPCSTRlpszWorkDir, WORDwHotkey, LPCTSTRlpszDescription, int iShowCmd = SW_SHOWNORMAL)

 

{

 

       if (lpszLnkFileDir == NULL)

 

              return FALSE;

 

 

 

       HRESULThr;

 

       IShellLink     *pLink;  //IShellLink对象指针

 

       IPersistFile   *ppf; //IPersisFil对象指针

 

      

 

       //创建IShellLink对象

 

       hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink);

 

       if (FAILED(hr))

 

              return FALSE;

 

      

 

       //IShellLink对象中获取IPersistFile接口

 

       hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);

 

       if (FAILED(hr))

 

       {

 

              pLink->Release();

 

              return FALSE;

 

       }

 

      

 

       //目标

 

       if (lpszFileName == NULL)

 

              pLink->SetPath(_pgmptr);

 

       else

 

              pLink->SetPath(lpszFileName);

 

      

 

       //工作目录

 

       if (lpszWorkDir != NULL)

 

              pLink->SetPath(lpszWorkDir);

 

      

 

       //快捷键

 

       if (wHotkey != 0)

 

              pLink->SetHotkey(wHotkey);

 

      

 

       //备注

 

       if (lpszDescription != NULL)

 

              pLink->SetDescription(lpszDescription);

 

      

 

       //显示方式

 

       pLink->SetShowCmd(iShowCmd);

 

 

 

 

 

       //快捷方式的路径 + 名称

 

       char szBuffer[MAX_PATH];

 

       if (lpszLnkFileName != NULL) //指定了快捷方式的名称

 

              sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, lpszLnkFileName);

 

       else  

 

       {

 

              //没有指定名称,就从取指定文件的文件名作为快捷方式名称。

 

              char *pstr;

 

              if (lpszFileName != NULL)

 

                     pstr = strrchr(lpszFileName, '\\');

 

              else

 

                     pstr = strrchr(_pgmptr, '\\');

 

 

 

              if (pstr == NULL)

 

              {    

 

                     ppf->Release();

 

                     pLink->Release();

 

                     return FALSE;

 

              }

 

              //注意后缀名要从.exe改为.lnk

 

              sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, pstr);

 

              int nLen = strlen(szBuffer);

 

              szBuffer[nLen - 3] = 'l';

 

              szBuffer[nLen - 2] = 'n';

 

              szBuffer[nLen - 1] = 'k';

 

       }

 

       //保存快捷方式到指定目录下

 

       WCHAR  wsz[MAX_PATH];  //定义Unicode字符串

 

       MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH);

 

      

 

       hr = ppf->Save(wsz, TRUE);

 

      

 

       ppf->Release();

 

       pLink->Release();

 

       return SUCCEEDED(hr);

 

}

 

调用如下例:

 

int main()

 

{

 

       char  szPath[MAX_PATH];

 

       CoInitialize(NULL);

 

 

 

       GetDesktopPath(szPath);

 

       if (CreateFileShortcut(NULL, szPath, NULL, NULL, MAKEWORD(VK_F12, HOTKEYF_CONTROL), "That is a test"))

 

              printf("创建成功\n");

 

 

 

       CoUninitialize();

 

       return 0;

 

}

 

头文件及引用库:

 

#include <stdio.h>

 

#include <windows.h>

 

#include <shlobj.h>

 

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

 

效果如图:

 

 

 

 

 

 

注1          参见http://www.vckbase.com/document/viewdoc/?id=1546

 

注2          参见http://baike.baidu.com/view/1141927.htm

 

注3          参见http://baike.baidu.com/view/5395542.htm

转载请标明出处,原文地址:http://www.cnblogs.com/morewindows/archive/2011/08/14/2138412.html

分享到:
评论

相关推荐

    c++快捷方式创建与删除

    c++快捷方式创建与删除

    Ubuntu系统安装JetBrainsToolbox,PyCharm,并创建桌面快捷方式(csdn)————程序..pdf

    Ubuntu系统安装JetBrainsToolbox,PyCharm,并创建桌面快捷方式(csdn)————程序.

    今日屏幕快捷方式插件

    Window Mobile 设备今日屏幕插件,创建系统快捷方式源码,从Windows Mobile 6 SDK\Samples\PocketPC\CPP\win32\memwatcher修改而来的

    install.zip

    bat实现开机启动安装,创建快捷方式,增加系统兼容,window脚本实现开机启动安装,创建快捷方式,增加系统兼容

    WindowTool

    主要对WINDOW上的一些窗口进行操作,比如记录窗口位置,下次恢复。或者隐藏/显示一些窗口。还可以创建快捷图标放在桌面上

    ppms客户端.zip

    java fx客户端 ,安装好jdk 运行环境的话就可以直接双击执行 vbs为创建window桌面快捷方式

    Window-Fill:更轻松地在大分辨率显示器上管理窗口的实用程序(仅适用于 Windows 操作系统)

    推荐:通过在shell:startup创建快捷方式将Window Fill.exe添加到 Windows shell:startup 。 您还可以具有通知区域 GUI 而不是控制台窗口的(旧)版本。 建造 使用create_distributable.py将run_with_console.py...

    定时保护眼睛小工具

    适用于window的定时弹出保护眼睛的小工具,非常非常小的小工具,没任何插件和广告 非常简易的【护眼】... 第一步、创建AutoTimer.exe的快捷方式, 第二步、将快捷方式拖入以下位置【开始-&gt;所有程序-&gt;启动】,完成!

    定时保护眼睛小工具(源码)

    核心技术: 1.Timer 定时器的运用方式 2.Window之间的值传递 3.系统托盘图标的使用 4.Window全屏置顶显示...第一步、创建AutoTimer.exe的快捷方式, 第二步、将快捷方式拖入以下位置【开始-&gt;所有程序-&gt;启动】,完成!

    Trading Risk Manager-crx插件

    语言:English 在购买证券之前,帮助交易者进行计算。 这个应用程序使您可以在开始新交易时快速获得几个重要计算的结果。...3-单击“更多工具” 4-单击“创建快捷方式”请注意,我们不会存储您的任何信息。

    win7右键菜单管理工具(新建/清理菜单).rar

    添加新文件夹和程序快捷方式到右键菜单以便于你快速访问常用的文件夹和程序。添加新的文件夹快捷方式到右键发送到菜单,以便于您快速复制文件和文件夹到其他位置。、移除/禁用IE的现有右键上下文菜单项目或添加新的...

    部署web项目到本地服务器(windows)

    在同一网络下,如果想要让别人能...创建了桌面快捷方式,双击运行 这个图标由红–黄–绿变化,当变成绿色时,说明启动成功了 重启服务 打开cmd,输入ipconfig可查看当前ip 在浏览器输入对应地址,即可访问该项目

    精通WindowsAPI 函数 接口 编程实例

    3.5.2 Visual Studio快捷方式 64 3.5.3 生成项目 64 3.5.4 调试 65 3.5.5 选项与设置 65 3.6 开发环境配置总结 66 第4章 文件系统 67 4.1 概述 67 4.1.1 文件系统的基本概念 67 4.1.2 文件系统...

    wm4noobs:使用Window Manager成为Linux向导

    配置文件3.1- 了解基本概念3.2-创建自己的快捷方式3.3- Exec和Exec_Always 3.4- 基本工具栏设置 4.状态栏4.1- i3blocks 4.2- Polybar 5.应用启动器5.1- dmenu 5.2- rofi 6.终端6.1-如何更改默认终端6.2- 自定义终端 ...

    编译 telepresence_2.1.0 :(doubango_2.0.7z.001)

    可在ooo-sdk目录下,对此命令文件建立一快捷方式“setsdkenv_win_c_user.bat.lnk”: C:\Users\Administrator\AppData\Roaming\OpenOffice_4.0_SDK\setsdkenv_windows.bat (2)利用工具cppumaker 生成缺失头文件...

    wps破解方法

    1、用光盘启动Lunux系统在桌面上会有一个 minidwe-gtk 快捷方式。 2、启动软件后在加密方式那里选择 wpa/apa2 再接 扫描就可以了。 3、找到无线网络后再点右边的第四个图标“reaver” 启动破解接着会有个对话框,...

    MFC教程入门知识全集.rar

    6.1.4 创建快捷方式菜单 6.2 工具栏 6.2.1 工具栏介绍 6.2.1.1 熟悉CToolBar 类 6.2.1.2 AppWizard 是如何创建工具栏 6.2.1.3 利用工具栏编辑器设计工具栏按钮 6.2.2 新建一个工具栏 6.2.3 显示/隐藏工具栏 ...

    tab-shifter:IntelliJ IDEA插件,用于移动和拆分编辑器选项卡

    MacOS快捷方式: ctrl + alt + ] -将制表符移到右边的分隔符(如果是最右边的分隔符,则创建一个新的分隔符) ctrl + alt + [ -将制表符移到左侧拆分器ctrl + alt + P将选项卡移至上方的拆分器ctrl + alt + ' -将...

    Open Chrome URLs-crx插件

    语言:English ...只需使用以下地址创建一个桌面快捷方式:“ C:\ Program Files \ Google \ Chrome \ Application \ chrome.exe” --new-window chrome-extension://dbbbifdnlcppldcgbfopgpcienlemhnm/open....

Global site tag (gtag.js) - Google Analytics