1. 程式人生 > >將已存在的程式新增快捷方式到工作列

將已存在的程式新增快捷方式到工作列

注意:在編譯時選擇靜態編譯 

我使用的編編譯器是vs 2013 ,需要在 專案 > 屬性 > 配置屬性>MFC的使用 選擇  在靜態庫中使用MFC 


// Test.cpp : Win32控制檯應用程式
#include "stdafx.h"
using namespace std;
#include <iostream>

#include <Windows.h>
#include <ShlObj.h>

#include <atlbase.h>

/********************************************************************
函式功能:建立快捷方式
引數:
szExeFileName	可執行檔案完整路徑
szWorkDir		當前工作目錄(通常是szExeFileName所在目錄)
szDescription	快捷方式的描述資訊(備註)
szIconPath		設定快捷方式的圖示
iIcon			指定圖示在szIconPath中的序號,通常為0
szLnkFileName	儲存快捷方式的完整路徑
返回值:
TRUE	成功
FALSE	失敗
********************************************************************/
BOOL CreateShortcut(PCTSTR szExeFileName, PCTSTR szWorkDir, PCTSTR szDescription,
	PCTSTR szIconPath, int iIcon, PCTSTR szLnkFileName)
{
	BOOL bOk;
	HRESULT hr;

	IShellLink *pLink;
	IPersistFile *pFile;

	//初始化COM元件
	if (FAILED(CoInitialize(NULL)))
	{
		cerr << "COM初始化失敗!" << endl;
		return FALSE;
	}

	//建立IShellLink的例項
	hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&pLink);
	if (SUCCEEDED(hr))
	{
		//從IShellLink物件獲取IPersistFile介面
		hr = pLink->QueryInterface(IID_IPersistFile, (void **)&pFile);
		if (SUCCEEDED(hr))
		{
			//設定快捷方式的目標
			pLink->SetPath(szExeFileName);
			//設定快捷方式的起始位置(當前工作目錄)
			pLink->SetWorkingDirectory(szWorkDir);
			//設定快捷方式的描述資訊(備註)
			pLink->SetDescription(szDescription);
			//設定快捷方式的圖示
			pLink->SetIconLocation(szIconPath, iIcon);

			//儲存快捷方式
			hr = pFile->Save(szLnkFileName, TRUE);
			if (SUCCEEDED(hr))
				bOk = TRUE;

			//釋放IPersistFile介面
			pFile->Release();
		}
		else
		{
			cerr << "無法獲取IPersistFile介面!" << endl;
			bOk = FALSE;
		}

		//釋放IShellLink介面
		pLink->Release();
	}
	else
	{
		cerr << "無法建立IShellLink例項!" << endl;
		bOk = FALSE;
	}

	//釋放COM元件
	CoUninitialize();

	return bOk;
}

/********************************************************************
函式功能:將一個可執行程式固定到Win7/Win8工作列
引數:
szExeFileName	可執行檔案完整路徑
szWorkDir		當前工作目錄(通常是szExeFileName所在目錄)
szDescription	快捷方式的描述資訊(備註)
szIconName		工作列圖示的名稱
szIconPath		設定快捷方式的圖示
iIcon			指定圖示在szIconPath中的序號,通常為0
返回值:
TRUE	成功
FALSE	失敗
備註:
1.	工作列圖示的名稱指的是當滑鼠停留在工作列按鈕上時顯示的提示資訊
例如用“記事本”比用“Notepad”更合理。
2.	ShellExecute函式不支援直接將可執行檔案固定到工作列,必須先創
建一個對應的快捷方式,然後再將快捷方式固定到工作列,最後再刪除
快捷方式。
********************************************************************/
BOOL PinToTaskBar(PCTSTR szExeFileName, PCTSTR szWorkDir, PCTSTR szDescription,
	PCTSTR szIconName, PCTSTR szIconPath, int iIcon)
{
	BOOL bOk = FALSE;

	//獲取臨時資料夾(假設為"C:\\Temp")
	TCHAR szLnkFileName[MAX_PATH];
	GetTempPath(MAX_PATH, szLnkFileName);

	//拼接快捷方式路徑"C:\\Temp\\"
	if (_tcscat_s(szLnkFileName, _T("\\")) != 0)
	{
		cerr << "指定的可執行檔案路徑或圖示名稱太長!" << endl;
		return FALSE;
	}

	//拼接快捷方式路徑"C:\\Temp\\記事本"
	if (_tcscat_s(szLnkFileName, szIconName) != 0)
	{
		cerr << "指定的可執行檔案路徑或圖示名稱太長!" << endl;
		return FALSE;
	}

	//拼接快捷方式路徑"C:\\Temp\\記事本.lnk"
	if (_tcscat_s(szLnkFileName, _T(".lnk")) != 0)
	{
		cerr << "指定的可執行檔案路徑或圖示名稱太長!" << endl;
		return FALSE;
	}

	//第1步:在臨時資料夾中建立快捷方式
	bOk = CreateShortcut(szExeFileName, szWorkDir, szDescription, szIconPath, iIcon, szLnkFileName);
	if (bOk)
	{
		//第2步:固定到工作列
		int nRet = (int)::ShellExecute(NULL, _T("TaskbarPin"), szLnkFileName, NULL, NULL, SW_SHOW);
		//返回值大於32表示成功
		if (nRet <= 32)
			cerr << "無法將快捷方式固定到工作列!" << endl;
		//第3步:刪除臨時資料夾中建立的快捷方式
		DeleteFile(szLnkFileName);
	}

	return bOk;
}


//從工作列取消固定指定名稱的程式
BOOL UnPinFromTaskBar(PCTSTR szIconName)
{
	BOOL bOk;

	//獲取使用者應用程式配置資料的儲存位置
	TCHAR szPath[MAX_PATH];
	SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szPath);

	//定位到工作列圖示所在位置
	_tcscat_s(szPath, _T("\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\"));

	//定位到指定圖示
	if (_tcscat_s(szPath, szIconName) != 0)
	{
		cerr << "指定的圖示名稱太長!" << endl;
		return FALSE;
	}
	if (_tcscat_s(szPath, _T(".lnk")) != 0)
	{
		cerr << "指定的圖示名稱太長!" << endl;
		return FALSE;
	}

	//從工作列取消固定某個快捷方式
	int nRet = (int)::ShellExecute(NULL, _T("TaskbarUnPin"), szPath, NULL, NULL, SW_SHOW);
	if (nRet <= 32)
	{
		cerr << "無法刪除指定的圖示!" << endl;
		bOk = FALSE;
	}
	else
	{
		bOk = TRUE;
	}

	return bOk;

}


void cre()
{
	cout << "正在建立......\n" << endl;
	PinToTaskBar(_T("C:\\Windows\\Notepad.exe"), _T("C:\\Windows"), _T("使用記事本編寫簡單文字"), _T("記事本"), _T("C:\\Users\\mycomputer\\Pictures\\1.ico"), 0);
	exit(0);
}
void del()
{
	cout << "正在刪除......\n" << endl;
	UnPinFromTaskBar(_T("記事本"));
	exit(0);
}


int _tmain()
{
	//cout << "演示程式:固定“記事本”到工作列,並指定使用“計算器”程式的圖示\n\n" << endl;
	//system("pause");
	//PinToTaskBar(_T("C:\\Windows\\Notepad.exe"), _T("C:\\Windows"), _T("使用記事本編寫簡單文字"), _T("記事本"),_T("C:\\Windows\\System32\\calc.exe"), 0);

	int i;
	while (1) {
		printf("選擇選單:\n1 在工作列建立後臺快捷方式\n2 刪除在工作列建立的後臺快捷方式\n3 退出\n");

		scanf_s("%d", &i);
		if (i == 1)
		{
			cre();
		}
		if (i == 2)
		{
			del();
		}
		if (i == 3)
		{
			exit(0);
		}
	}

}

/*	附錄

IShellLink主要成員:
1、GetArguments:獲得引數資訊
2、GetDescription:獲得描述資訊(備註行)
3、GetHotkey:獲得快捷鍵
4、GetIconLocation:獲得圖示
5、GetIDList:獲得快捷方式的目標物件的item identifier list
(Windows外殼中的每個物件如檔案,目錄和印表機等都有唯一的item identifiler list)
6、GetPath: 獲得快捷方式的目標檔案或目錄的全路徑
7、GetShowCmd:獲得快捷方式的執行方式,比如常規視窗,最大化
8、GetWorkingDirectory:獲得工作目錄
9、Resolve:按照一定的搜尋規則試圖獲得目標物件,即使目標物件已經被刪除或移動,重新命名
下面是對應資訊的設定方法
10、SetArguments
11、SetDescription
12、SetHotkey
13、SetIconLocation
14、SetIDList
15、SetPath
16、SetRelativePath
17、SetShowCmd
18、SetWorkingDirectory

*/