有时候,为了方便用户使用我们编写的程序,需要在桌面,快速启动或程序组中创建程序的快捷方式。下面就介绍在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接口IShellLink和IPersistFile。由于篇幅问题,这里只讲解二个接口的部分函数。
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 wHotkey。MSDN上对其的解释为:
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++快捷方式创建与删除
Ubuntu系统安装JetBrainsToolbox,PyCharm,并创建桌面快捷方式(csdn)————程序.
Window Mobile 设备今日屏幕插件,创建系统快捷方式源码,从Windows Mobile 6 SDK\Samples\PocketPC\CPP\win32\memwatcher修改而来的
bat实现开机启动安装,创建快捷方式,增加系统兼容,window脚本实现开机启动安装,创建快捷方式,增加系统兼容
主要对WINDOW上的一些窗口进行操作,比如记录窗口位置,下次恢复。或者隐藏/显示一些窗口。还可以创建快捷图标放在桌面上
java fx客户端 ,安装好jdk 运行环境的话就可以直接双击执行 vbs为创建window桌面快捷方式
推荐:通过在shell:startup创建快捷方式将Window Fill.exe添加到 Windows shell:startup 。 您还可以具有通知区域 GUI 而不是控制台窗口的(旧)版本。 建造 使用create_distributable.py将run_with_console.py...
适用于window的定时弹出保护眼睛的小工具,非常非常小的小工具,没任何插件和广告 非常简易的【护眼】... 第一步、创建AutoTimer.exe的快捷方式, 第二步、将快捷方式拖入以下位置【开始->所有程序->启动】,完成!
核心技术: 1.Timer 定时器的运用方式 2.Window之间的值传递 3.系统托盘图标的使用 4.Window全屏置顶显示...第一步、创建AutoTimer.exe的快捷方式, 第二步、将快捷方式拖入以下位置【开始->所有程序->启动】,完成!
语言:English 在购买证券之前,帮助交易者进行计算。 这个应用程序使您可以在开始新交易时快速获得几个重要计算的结果。...3-单击“更多工具” 4-单击“创建快捷方式”请注意,我们不会存储您的任何信息。
添加新文件夹和程序快捷方式到右键菜单以便于你快速访问常用的文件夹和程序。添加新的文件夹快捷方式到右键发送到菜单,以便于您快速复制文件和文件夹到其他位置。、移除/禁用IE的现有右键上下文菜单项目或添加新的...
在同一网络下,如果想要让别人能...创建了桌面快捷方式,双击运行 这个图标由红–黄–绿变化,当变成绿色时,说明启动成功了 重启服务 打开cmd,输入ipconfig可查看当前ip 在浏览器输入对应地址,即可访问该项目
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 文件系统...
配置文件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- 自定义终端 ...
可在ooo-sdk目录下,对此命令文件建立一快捷方式“setsdkenv_win_c_user.bat.lnk”: C:\Users\Administrator\AppData\Roaming\OpenOffice_4.0_SDK\setsdkenv_windows.bat (2)利用工具cppumaker 生成缺失头文件...
1、用光盘启动Lunux系统在桌面上会有一个 minidwe-gtk 快捷方式。 2、启动软件后在加密方式那里选择 wpa/apa2 再接 扫描就可以了。 3、找到无线网络后再点右边的第四个图标“reaver” 启动破解接着会有个对话框,...
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 显示/隐藏工具栏 ...
MacOS快捷方式: ctrl + alt + ] -将制表符移到右边的分隔符(如果是最右边的分隔符,则创建一个新的分隔符) ctrl + alt + [ -将制表符移到左侧拆分器ctrl + alt + P将选项卡移至上方的拆分器ctrl + alt + ' -将...
语言:English ...只需使用以下地址创建一个桌面快捷方式:“ C:\ Program Files \ Google \ Chrome \ Application \ chrome.exe” --new-window chrome-extension://dbbbifdnlcppldcgbfopgpcienlemhnm/open....