`

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

分享到:
评论

相关推荐

    jQuery点击弹出创建快捷方式代码.zip

    Bootstrap的参与可能体现在UI设计上,比如使用Bootstrap的按钮样式和模态框来提供一个友好的用户界面,让用户在点击后看到一个提示或者确认框,告知用户即将创建快捷方式,并允许他们取消操作。 文件“说明.htm”很...

    java创建快捷方式

    Java 创建快捷方式是一种常见的自动化操作,特别是在开发工具或者系统集成中。这个过程涉及到Java的桌面集成API,允许程序与用户的操作系统进行交互,如创建、修改或打开文件、URL等。以下将详细介绍如何使用Java来...

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

    Windows API提供了`CoCreateInstance`函数来实例化`IShellLink`对象,这将是创建快捷方式的关键。 1. **创建快捷方式** 创建快捷方式的过程涉及以下步骤: - 初始化`IShellLink`接口:通过调用`CoCreateInstance`...

    Java建立及解析Windows快捷方式

    在项目中引入`mslinks-1.0.2`库后,我们可以利用其提供的功能来创建快捷方式。 创建Windows快捷方式的步骤如下: 1. 引入`mslinks`库。在Maven项目中,可以在`pom.xml`文件中添加依赖: ```xml &lt;groupId&gt;...

    jQuery点击弹出创建快捷方式代码

    创建快捷方式的过程通常涉及到浏览器的API,如`window.createShortCut()`,但需要注意的是,这个API并不被所有浏览器支持,主要在IE中可用。因此,实现跨浏览器的解决方案可能需要借助于Flash或JavaScript的...

    创建桌面快捷方式

    然后,在你的服务或单独的工具类中,添加创建快捷方式的逻辑: ```java private fun createShortcut(context: Context) { val shortcutManager = context.getSystemService(Context.SHORTCUT_SERVICE) as ...

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

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

    生成桌面快捷方式的工具

    本工具利用MFC进行编程,实现了自动在桌面上创建快捷方式的功能。下面我们将详细探讨MFC、界面编程以及如何通过MFC实现快捷方式的创建。 MFC是微软为简化Windows API编程而设计的一个类库。它将Windows API中的许多...

    C++ 创建桌面快捷方式 开始菜单的实现代码

    代码如下:void CInstall_ProgressDlg::CreateShortCut(CString csLinkPath, CString csExePath, CString csIconPath){ HRESULT hres; hres = ::CoInitialize(NULL); if(S_OK == hres) { //delete old link ...

    c#通过纯代码创建桌面快捷方式、创建程序菜单项、将网页添加到收藏夹

    // 创建快捷方式对象 WshShell shell = new WshShell(); IShortcut shortcut = (IShortcut)shell.CreateShortcut(Path.Combine(desktopPath, shortcutPath + ".lnk")); // 设置快捷方式属性 shortcut....

    jQuery点击弹出创建快捷方式特效代码

    4. **创建快捷方式**:在用户确认后,代码将使用JavaScript的`window.createShortcut()`方法(非标准浏览器API,可能仅限于某些环境)或者模拟鼠标操作来创建桌面快捷方式。如果浏览器不支持这些功能,可以提示用户...

    C#开发直接调用浏览器打开网站快捷方式

    在Windows上,我们可以使用`System.IO.File`和`System.IO.Path`类来创建快捷方式文件(.lnk),然后设置其目标为C#程序,并传递网站链接作为参数。这样用户只需点击快捷方式,程序就会自动启动并打开指定网站。 总...

    去掉桌面快捷方式图标的小箭头

    ### 去掉桌面快捷方式图标的小箭头 在日常使用电脑的过程中,用户经常会遇到桌面快捷方式图标上显示的小箭头问题。这些小箭头在Windows系统中默认用于标识某个图标是快捷方式而非原始文件或应用程序的位置。对于...

    Window权限维持(四):快捷方式修改1

    SharPersist可以创建Internet Explorer快捷方式,当用户登录时执行任意有效负载,并打开Meterpreter会话。PoshC2则可以直接在启动文件夹中创建.LNK文件,通过执行注册表项上的值(包含base64编码的stager)来实现...

    去掉window7-64位系统桌面快捷方式箭头

    在Windows 7 64位操作系统中,桌面快捷方式图标通常会带有小箭头的标记,这可以帮助用户识别这些图标是快捷方式而不是实际的应用程序或文件。然而,有些人可能觉得这些箭头影响了桌面的美观,希望去除它们。在本文中...

    今日屏幕快捷方式插件

    "今日屏幕快捷方式插件"是一款专为Window Mobile设备设计的实用工具,它允许用户在今日屏幕上快速访问常用的功能或应用。这个插件是基于Windows Mobile 6 SDK中的Samples项目,具体来说,是从"PocketPC"目录下的"CPP...

    Free Internet Window Washer

    安装过程中,用户可能需要选择安装路径、接受许可协议,并设置是否创建桌面快捷方式。安装完成后,用户可以在桌面图标或者开始菜单中启动"Free Internet Window Washer"。 该软件的操作界面一般会提供简洁明了的...

    windowbuilder 免安装绿色版插件

    1. **可视化界面设计**:WindowBuilder支持Swing和 SWT (Standard Widget Toolkit) 框架,允许开发者通过直观的GUI编辑器创建和修改窗口布局。在设计视图中,每个组件都可以直接拖放到工作区,调整大小,设置属性,...

Global site tag (gtag.js) - Google Analytics