用代码创建各种快捷方式

来源:互联网 发布:上海私人调查公司 知乎 编辑:程序博客网 时间:2024/05/16 18:18

 

 

//------------------------------------------------------------------------------------------------

#pragma once
#include <stdio.h>
#include <windows.h>
#include <shlobj.h>
#pragma comment(lib, "shell32.lib")

class CreateQuickrun
{
public:
 CreateQuickrun(void);
 ~CreateQuickrun(void);

 // 获取桌面路径
 static BOOL GetDesktopPath(char * pszDesktopPath);

 // //得到快速启动栏的路径
 static BOOL GetIEQuickLaunchPath(char* pszIEQueickLaunchPath);

 // 得到 开始->程序组 的路径
 static BOOL GetProgramsPath(char* pszProgramsPath);

 // 对指定文件在指定的目录下创建其快捷方式
 /*
函数功能:对指定文件在指定的目录下创建其快捷方式
函数参数:
lpszFileName    指定文件,为NULL表示当前进程的EXE文件。
lpszLnkFileDir  指定目录,不能为NULL。
lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。
wHotkey         为0表示不设置快捷键
pszDescription  备注
iShowCmd        运行方式,默认为常规窗口
*/
  static BOOL CreateFileShortcut(LPCSTR lpszFileName, LPCSTR lpszLnkFileDir, LPCSTR lpszLnkFileName,       LPCSTR lpszWorkDir, WORD wHotkey, LPCTSTR lpszDescription, int iShowCmd =

SW_SHOWNORMAL);
};

#include "StdAfx.h"
#include ".\reatequickrun.h"

CreateQuickrun::CreateQuickrun(void)
{
}

CreateQuickrun::~CreateQuickrun(void)
{
}

// 获取桌面路径
BOOL CreateQuickrun::GetDesktopPath(char * pszDesktopPath)
{
 LPITEMIDLIST  ppidl = NULL;
      
       if (SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &ppidl) == S_OK)
       {
              BOOL flag =   SHGetPathFromIDList(ppidl, pszDesktopPath);
              CoTaskMemFree(ppidl);
              return flag;
       }
 
 return false;
}

// //得到快速启动栏的路径
BOOL CreateQuickrun::GetIEQuickLaunchPath(char* pszIEQueickLaunchPath)
{
 LPITEMIDLIST  ppidl;                   
      
       if (SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &ppidl) == S_OK)
       {
              BOOL flag =   SHGetPathFromIDList(ppidl, pszIEQueickLaunchPath);
              strcat(pszIEQueickLaunchPath, "\\Microsoft\\Internet Explorer\\Quick Launch");
              CoTaskMemFree(ppidl);
              return flag;
       }
 return false;
}

// 得到 开始->程序组 的路径
BOOL CreateQuickrun::GetProgramsPath(char* pszProgramsPath)
{
   LPITEMIDLIST  ppidl;
      
       if (SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &ppidl) == S_OK)
       {
              BOOL flag = SHGetPathFromIDList(ppidl, pszProgramsPath);
              CoTaskMemFree(ppidl);
              return flag;
       }
 return false;
}

// 对指定文件在指定的目录下创建其快捷方式
/*
函数功能:对指定文件在指定的目录下创建其快捷方式
函数参数:
lpszFileName    指定文件,为NULL表示当前进程的EXE文件。
lpszLnkFileDir  指定目录,不能为NULL。
lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。
wHotkey         为0表示不设置快捷键
pszDescription  备注
iShowCmd        运行方式,默认为常规窗口
*/
BOOL CreateQuickrun::CreateFileShortcut(LPCSTR lpszFileName, LPCSTR lpszLnkFileDir, LPCSTR lpszLnkFileName,  LPCSTR lpszWorkDir, WORD wHotkey, LPCTSTR lpszDescription, int iShowCmd )
{
 if (lpszLnkFileDir == NULL)
              return FALSE;
 
       HRESULT hr;
       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);
}

 

 

//调用例子

 char  szPath[MAX_PATH];//快捷方式所在位置
 char  szFilePath[MAX_PATH];//可执行文件的完整路径

 


       CoInitialize(NULL);
 
    CreateQuickrun::GetDesktopPath(szPath);
    sprintf(szFilePath,"%s","c:\\unregularWindow.exe");

    
    if (CreateQuickrun::CreateFileShortcut(szFilePath, szPath, NULL, NULL, MAKEWORD(VK_F12, HOTKEYF_CONTROL), "That is a test"))
             AfxMessageBox("创建成功\n");
 
       CoUninitialize();
      

 

 

原创粉丝点击