VC创建快捷方式

快捷方式:
现在,几乎所有的安装 程序都是在“开始”菜单中添加新的菜单项,或者在桌面上建立新的快捷方式(Shortcut)(有时还要建立相应的菜单组或文件夹来包含多个菜单项或快捷
方式),以便于用户使用时方便快捷地启动软件。当启动一个安装程序后,程序安装完成后会自动创建相应的快捷方式。

Windows 的快捷方式实际上是一个带有扩展名LNK的数据文件,其中包含有用于访问Windows某一对象(即在资源管理器中所能浏览的所有对象,包括文件,文件 夹,驱动器及打印机等)的有关信息,如目标对象的路径和名称,工作目录,要传递的命令行参数,运行时的初始显示状态,图标及其快捷键等。通过在快捷方式上单击鼠标右键并在弹出菜单中选择“属性”可以观察该快捷方式的这些性质。

Windows外壳(Shell)的快捷方式是以OLE技术的组件对象模型COM(Component Object Modal)为基础而设计的。利用COM模型,一个应用程序可以调用另一应用程序的某些功能。这方面的技术细节请参阅有关文献。

在了解了上述基本原理后,创建Windows的快捷方式就比较容易了。首先利用OLE通过调用CoCreateInstance()函数建立一个 IID_IShellLink实例,并同时得到其接口指针。利用这个接口指针可以对其各项属性进行设置。为了使这些信息以快捷方式的数据文件 (*.lnk)格式保存起来,还需要从IID_IShellLink对象取得其IID_IPersistFile接口指针,以便于调用其成员函数Save()保存前面设置的信息。至于如何删除快捷方式以及创建和删除文件夹,则只需要简单地调用文件操作函数SHFileOperation()就可以了。另外应该注意,在完成上述操作之后,都要调用SHChangeNotify()函数通知Windows外壳有关变化以使之及时更新其显示状态。


相关函数与说明:
1、获得系统特殊路径:
HRESULT SHGetSpecialFolderLocation(HWND hwndOwner,  int nFolder, PIDLIST_ABSOLUTE *ppidl);
  1.第一个参数表示所有者窗口句柄,一般传入NULL就可以了。
  2.第二个参数要示是一个整数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            临时文档
  3.第三个参数表示一个条目标识符列表指针,可以传入一个LPITEMIDLIST类型变量,再从这个变量中得到
表示路径的字符串。使用完后,要用void CoTaskMemFree(void * pv)来释放资源。

2、将一个条目标识符列表转换为一个文件系统路径:
BOOL SHGetPathFromIDList( PCIDLIST_ABSOLUTE pidl,  LPTSTR pszPath);
  1.第一个参数pidl就是用第一个函数所得到的条目标识符列表指针。
  2.第二个参数pszPath返回表示路径的字符串。
 
这二个函数的头文件均为<shlobj.h>并要引入shell32.lib。

3、设置快捷方式文件的内容:
这要用到二个COM接口IShellLink和IPersistFile。这里只讲解二个接口的部分函数。

1.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:
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)表示。
 
2.IPersistFile的部分函数:
HRESULT Save(LPCOLESTR pszFileName, BOOL fRemember);   保存快捷方式
  第一个参数是要保存文件的文件名,要求是绝对路径。
  第二个参数涉及COM的持续性问题,一般传入TRUE即可。
 
要创建COM对象可以用CoCreateInstance()函数和QueryInterface()函数。下面给出了创建的代码:
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()。


以下提供一个已封装相关功能的完整代码:

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

//得到当前桌面路径
BOOL 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 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 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 CreateFileShortcut(LPCSTR lpszFileName, LPCSTR lpszLnkFileDir, LPCSTR lpszLnkFileName,       LPCSTR lpszWorkDir, WORD wHotkey, LPCTSTR lpszDescription, int iShowCmd = SW_SHOWNORMAL)
{
   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);
}

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对学生选课系统的创建,我们需要考虑几个重要的方面。首先,我们需要建立一个包含学生和课程信息的数据库,以便学生可以浏览和选择他们感兴趣的课程。其次,我们需要设计一个用户友好的界面,让学生能够方便地注册、登录和选择课程。这需要一个可以处理用户输入和信息存储的后端系统。另外,我们需要创建一个管理系统,让教师和管理员能够添加、修改和删除课程信息,以保证系统的及时更新和管理。最后,我们还需要考虑系统的安全性和稳定性,确保学生和教师的信息不会被泄露或丢失,系统也能够稳定运行。 在实际开发过程中,我们可以使用VC(Visual C++)来创建一个桌面应用程序,结合数据库来存储学生和课程信息。VC提供了丰富的图形用户界面和数据库操作的功能,可以帮助我们快速建立一个功能完善的学生选课系统。同时,VC也提供了强大的开发工具和支持,可以帮助我们解决系统安全性和稳定性的问题。 总的来说,创建学生选课系统需要我们考虑数据管理、用户界面设计、后端系统开发和系统安全性等方面。VC作为一个功能强大的开发工具,可以帮助我们高效、稳定地构建一个满足要求的学生选课系统。希望在系统的设计和开发过程中,我们能够充分考虑到用户和管理者的需求,从而打造一个更加完善的学生选课系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值