现在的位置: 首页 > 综合 > 正文

把程序添加到开始菜单

2013年08月05日 ⁄ 综合 ⁄ 共 4228字 ⁄ 字号 评论关闭
#define REG_SHELLFODLER _T("Software//Microsoft//Windows//CurrentVersion//Explorer//Shell Folders")

void CTestDlg::OnBnClickedButton7()
{
	// TODO: 在此添加控件通知处理程序代码

	CString szLink , szPath;
	
	CString szProgram;

	if(IsWin9X())
	{
		szProgram="Programs";
		GetProfileString(HKEY_CURRENT_USER,
			REG_SHELLFODLER,
			szProgram
			);
	}
	else
	{
		szProgram="Common Programs";
		GetProfileString(HKEY_LOCAL_MACHINE,
			REG_SHELLFODLER,
			szProgram);
	}
	

	//添加管理系统菜单

	CString szFolder=szProgram+_T("//test");
	CreateDirectory(szFolder,NULL);
	CString szMenu=szFolder+_T("//test.lnk");
	szPath=_T("D://Test.exe");
	CreateLink(szPath.GetBuffer(szPath.GetLength()),szMenu.GetBuffer(szMenu.GetLength()));
	
	szPath.ReleaseBuffer();
	szLink.ReleaseBuffer();

}




BOOL  IsWin9X()
{
	DWORD dwVersion;
	dwVersion=::GetVersion();
	if (dwVersion >= 0x80000000) //Win9x 
		return TRUE;
	else 
		return FALSE; //Win2K/WinXP
}

BOOL CreateLink (LPTSTR szPath,PSTR szLink)
{  
	HRESULT hres ;
	IShellLink * psl ;
	IPersistFile* ppf ;
	DWORD wsz[ MAX_PATH] ;
	int nBeginAt=CSIDL_DESKTOPDIRECTORY;

	CoInitialize(NULL);

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

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

	//获取路径
	CString strTemp = szPath;
	CString strAppPath;
	int nRet = strTemp.ReverseFind('//');
	if(nRet != -1)
	{
		strAppPath = strTemp.Left(nRet);
	}

	psl -> SetWorkingDirectory(strAppPath); 
	//从IShellLink获取其IPersistFile接口
	//用于保存快捷方式的数据文件 (*.lnk)

	hres = psl -> QueryInterface( IID_IPersistFile,(void**)&ppf) ;

	if( FAILED( hres))    return FALSE ;

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

	//调用IPersist:Save
	//保存快捷方式的数据文件 (*.lnk)
	hres = ppf -> Save( (LPWSTR)wsz, STGM_READWRITE) ;

	//释放IPersistFile和IShellLink接口
	ppf -> Release( ) ;
	psl -> Release( ) ;
	return TRUE;
}




BOOL GetProfileString(HKEY KEY,CString szPath,CString &szKeyValue)
{
	HKEY hKEY; //定义有关的 hKEY, 在查询结束时要关闭。 
	
	//打开与路径 data_Set 相关的 hKEY,第一个参数为根键名称,第二个参数表。 
	//表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。 
	//访问注册表,hKEY则保存此函数所打开的键的句柄 
	
	long ret=::RegOpenKeyEx(KEY,szPath, 0, KEY_READ, &hKEY); 
	
	if(ret!=ERROR_SUCCESS) return false ;//如果无法打开hKEY,则终止程序的执行 
	
	LPBYTE owner_Get=new BYTE[256]; //查询有关的数据 (用户姓名 owner_Get)。 
	DWORD type_1=REG_SZ ; DWORD cbData_1=80; 
	
	//hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,szKeyValue: 
	//表示要查 询的键值名,type_1表示查询数据的类型,owner_Get保存所。 
	//查询的数据,cbData_1表示预设置的数据长度。 
	
	ret=::RegQueryValueEx(hKEY, szKeyValue, NULL,&type_1, owner_Get, &cbData_1); 
	if(ret!=ERROR_SUCCESS) {::RegCloseKey(hKEY);szKeyValue="";}     //返回空值
	else szKeyValue=CString(owner_Get); 
	delete[] owner_Get; 
	::RegCloseKey(hKEY); // 程序结束前要关闭已经打开的 hKEY 
	return true;
}

其他相关功能

 //创建桌面快捷键

CString szLink=_T("Common Desktop");
 if( !GetProfileString(HKEY_LOCAL_MACHINE,
  REG_SHELLFODLER,
  szLink)
  )
 {
  MessageBox(_T("获取桌面路径出错!"),strCaption,MB_OK|MB_ICONINFORMATION);
  return FALSE;
 }

 

 szLink+=_T("//test.lnk");
 CString szPath=_T("D://test.exe"); //实际的路径
CreateLink(szPath.GetBuffer(szPath.GetLength()),szLink.GetBuffer(szLink.GetLength()));
 szPath.ReleaseBuffer();
 szLink.ReleaseBuffer();

 

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      //在控制面板中,增加删除程序选项。
      //在相关注册表项目中添加 
      //"Software//Microsoft//Windows//CurrentVersion//Uninstall/0" ;

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        系统的自启动项目
        //Software//Microsoft//Windows//CurrentVersion//Run/

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//删除开始菜单 文件夹
 BOOL bWin9x=IsWin9X();
 CString szProgram;
 CString szFolder;

 

 if(bWin9x)
 {
  szProgram="Programs";
  GetProfileString(HKEY_CURRENT_USER,
   "Software//Microsoft//Windows//CurrentVersion//Explorer//Shell Folders",
   szProgram);
 }
 else
 {
  szProgram="Common Programs";
  GetProfileString(HKEY_LOCAL_MACHINE,
   "Software//Microsoft//Windows//CurrentVersion//Explorer//Shell Folders",
   szProgram);
 }

 

 szFolder=szProgram+"//test";

  //删除文件夹

   TCHAR szPath[MAX_PATH];
   memset(szPath, 0, sizeof(szPath));
   _stprintf(szPath, _T("%s/0"), szFolder);

 

   SHFILEOPSTRUCT  sfo;
   sfo.fAnyOperationsAborted   =   false;  
   sfo.fFlags   =   FOF_SILENT;  
   sfo.hNameMappings   =   NULL;  
   sfo.hwnd   =  NULL;  
   sfo.lpszProgressTitle   =   NULL;  
   sfo.pFrom   =   szPath;  
   sfo.pTo   =   NULL;  
   sfo.wFunc   =   FO_DELETE;  
   if(SHFileOperation(&sfo)!=0)
    MessageBox(_T("文件夹删除失败")); 

 

抱歉!评论已关闭.