如何用MFC创建快捷方式

Posted on 2009-11-23 23:27  严武  阅读(1492)  评论(0编辑  收藏  举报

 

void NotifyShell(LONG wEventId,//事件标志
LPSTR szPath)//路径
{
    SHChangeNotify( wEventId, SHCNF_FLUSH | SHCNF_PATH, szPath,0);
    //取得szPath的父目录
    char* p;
    for( p=szPath+lstrlen(szPath)-1; *p != '//'; p--);
    *p='/0';
    SHChangeNotify(SHCNE_UPDATEDIR |SHCNE_INTERRUPT, SHCNF_FLUSH | SHCNF_PATH,szPath,0);
}

//创建快捷方式
BOOL CreateLink (LPSTR szPath,LPSTR szLink)

/*szPath 快捷方式的目标应用程序名

szLink快捷方式的数据文件名(*.lnk) */
{
    HRESULT hres ;
    IShellLink * psl ;
    IPersistFile* ppf ;
    WORD wsz[ MAX_PATH] ;

    ////初始化COM
    CoInitialize (NULL);

   //创建一个IShellLink实例
   hres = CoCreateInstance( CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER, IID_IShellLink,
(void **)&psl) ;
   if( FAILED( hres))
   {
      CoUninitialize ();
      return FALSE ;
   }

   //设置目标应用程序
   psl -> SetPath( szPath) ;

//设置快捷键(此处设为Shift+Ctrl+'R')
// psl -> SetHotkey( MAKEWORD( 'R',
// HOTKEYF_SHIFT |HOTKEYF_CONTROL)) ;

char* p;
for( p=szPath+lstrlen(szPath)-1; *p != '//'; p--);
   *p='/0';
   psl -> SetWorkingDirectory(szPath);

   //从IShellLink获取其IPersistFile接口
   //用于保存快捷方式的数据文件 (*.lnk)
   hres = psl -> QueryInterface( IID_IPersistFile, (void**)&ppf) ;
   if( FAILED( hres))
   {
      CoUninitialize ();
      return FALSE ;
   }

   // 确保数据文件名为ANSI格式
   MultiByteToWideChar( CP_ACP, 0, szLink, -1, wsz, MAX_PATH) ;

   //调用IPersistFile::Save
   //保存快捷方式的数据文件 (*.lnk)
   hres = ppf -> Save( wsz, STGM_READWRITE);
   //释放IPersistFile和IShellLink接口
   ppf -> Release( ) ;
   psl -> Release( ) ;
   CoUninitialize ();
   return TRUE;
}

void CreateThisAppShortcut()
{
    char szPath[MAX_PATH]=""; //快捷方式的目标应用程序名
    char szLink[MAX_PATH]=""; //快捷方式的数据文件名
    ////桌面快捷方式
    GetModuleFileName(NULL, szPath, MAX_PATH);
    GetWindowsDirectory(szLink, MAX_PATH);
    if(szLink[lstrlen(szLink)-1] == '//')
       lstrcat(szLink, "Desktop//EStk接收设置.lnk");
    else
        lstrcat(szLink, "//Desktop//EStk接收设置.lnk");
    // 创建快捷方式
    if(!CreateLink( szPath, szLink) )
         return;
    // 通知shell有关变化
    NotifyShell( SHCNE_CREATE|SHCNE_INTERRUPT,szLink) ;

    ////快速启动快捷方式
    GetModuleFileName(NULL, szPath, MAX_PATH);
    GetWindowsDirectory(szLink, MAX_PATH);
    if(szLink[lstrlen(szLink)-1] == '//')
        lstrcat(szLink, "Application Data//Microsoft//Internet Explorer//Quick Launch//EStk接收设置.lnk");
    else
        lstrcat(szLink, "//Application Data//Microsoft//Internet Explorer//Quick Launch//EStk接收设置.lnk");
     if(!CreateLink( szPath, szLink) )
        return;
    NotifyShell( SHCNE_CREATE|SHCNE_INTERRUPT, szLink) ;
}

Copyright © 2024 严武
Powered by .NET 8.0 on Kubernetes