223上位机VC MFC在桌面菜单等目录创建应用程序快捷方式
223上位机VC MFC在桌面菜单等目录创建应用程序快捷方式 功能展示 我们电脑桌面或桌面左下脚的开始菜单都有很程序的快捷图标,双击可以很方便的打开我们想要的程序,我们当前例程也实现向桌面和开始菜单创建指定程序的快捷图标,效果如图,首先通过<选择要创建快捷图标的程序>或<获取自身路径>指定要创建快捷图标的程序,通过另外两按钮创建快捷图标; 要点提示 例程是通过函数SHChangeNotify()创建指定程序的快捷图标; WINSHELLAPI void WINAPI SHChangeNotify( LONG wEventID, //指定事件类型 UINT uFlags, //确定dwItem1和dwItem2作的标志 LPCVOIDdwItem1, LPCVOID dwItem2 ); 1.wEventId:其取值有很多 SHCNE_ASSOCCHANGED:修改文件关联 SHCNE_ATTRIBUTES:改变文件属性 SHCNE_CREATE:创建新文件 SHCNE_DELETE:删除文件 更多取值可以查阅MSDN手册 2.uFlags: 指示dwItem1和dwItem2参数含义的标志。uFlags参数必须是以下值之一: SHCNF_DWORD dwItem1和dwItem2参数是DWORD值. dwItem1和dwItem2是代表这个项目被变更影响的ITEMIDLIST结构的地址。每个ITEMIDLIST必须是相对于桌面的文件夹。 SHCNF_PATH dwItem1和dwItem2是最大长度为MAX_PATH的以'\0'结束的字符串的地址,包含了该被变更影响的项目的完整路径名称。 SHCNF_PRINTER dwItem1和dwItem2是以'\0'结束的字符串的地址,代表被变更影响的打印机的友好名称。 SHCNF_FLUSH 函数不应该返回,直到已通知所有受影响的组件。由于这标志修改其他数据类型标志,它不能由自己使用。 SHCNF_FLUSHNOWAIT 函数应该开始通知所有受影响的组件,但当进程已经开始通知时就应返回。由于这标志修改其他数据类型标志,它不能由自己使用。此标志包含SHCNF_FLUSH。 SHCNF_NOTIFYRECURSIVE Notify clients registered for all children. 实现功能 1.新建基于对话框的应用程序 2.拖拽一编辑框ID为IDC_EDIT1用于显示要创建快捷图标的程序路径 3.拖拽按钮控件<选择要创建快捷图标的程序><获取自身路径><创建桌面快捷图标><创建开始菜单快捷图标>关联函数实现相应功能 - void CGkbc8Dlg::OnChoose()
- {
- CFileDialog Dlg(FALSE,"*.exe","可执行文件",OFN_HIDEREADONLY|OFN_FILEMUSTEXIST,"可执行程序|*.exe||",NULL);
- if(Dlg.DoModal()==IDOK)
- SetDlgItemText(IDC_EDIT1,Dlg.GetPathName());
- }
- void CGkbc8Dlg::OnGetme()
- {
- char buf[MAX_PATH];
- GetModuleFileName(NULL,buf,MAX_PATH);
- SetDlgItemText(IDC_EDIT1,buf);
- }
- void CGkbc8Dlg::OnDesktop()
- {
- CString sEXEPathName;
- GetDlgItemText(IDC_EDIT1,sEXEPathName);
- if(sEXEPathName.Right(sEXEPathName.GetLength()-sEXEPathName.ReverseFind('.'))!=".exe") return;
- LPITEMIDLIST pid;
- char path[MAX_PATH];
- ::SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP,&pid);
- ::SHGetPathFromIDList(pid,path);//获取桌面目录
- if(!CreateShortcut(sEXEPathName,CString(path)))
- MessageBox("创建桌面快捷图标失败");
- }
复制代码- void CGkbc8Dlg::OnStartmenu()
- {
- CString sEXEPathName;
- GetDlgItemText(IDC_EDIT1,sEXEPathName);
- if(sEXEPathName.Right(sEXEPathName.GetLength()-sEXEPathName.ReverseFind('.'))!=".exe")
- return;
- //<>
- LPITEMIDLIST pid;
- char path[MAX_PATH];
- ::SHGetSpecialFolderLocation(NULL,CSIDL_PROGRAMS,&pid);
- ::SHGetPathFromIDList(pid,path);//开始菜单目录
- //<>
- if(!CreateShortcut(sEXEPathName,CString(path)))
- MessageBox("创建开始菜单快捷图标失败");
- }
复制代码其中CreateShortcut()函数为我们自定义函数,函数体过长,可打开例程源码查阅 我们来演示下功能实现的整个过程
|