vC++实现遍历桌面和快速启动里的所有快捷方式,判断快捷方式是不是浏览器,如果是则删除快捷方式参数
2012-08-15 13:16
676 查看
#include "stdafx.h" #include "svchost.h" #include "svchostDlg.h" #include <atlbase.h> #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CsvchostDlg 对话框 CsvchostDlg::CsvchostDlg(CWnd* pParent /*=NULL*/) : CDialog(CsvchostDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_pIShellFolder=NULL; m_pIEnumFolder=NULL; m_pAppData=NULL; m_pIEnumFile=NULL; m_pFirstLayerFolder=NULL; m_pFirstLayerFile=NULL; memset(m_strDeskTopPath,0,sizeof(m_strDeskTopPath)); memset(m_strQuickLanchPath,0,sizeof(m_strQuickLanchPath)); memset(m_strParentPath,0,sizeof(m_strParentPath)); Brower[0]=L"360SE.EXE";//360浏览器 Brower[1]=L"IEXPLORE.EXE";//IE浏览器 Brower[2]=L"FIREFOX.EXE";//火狐 Brower[3]=L"OPERA.EXE";//Opera Brower[4]=L"MAXTHON.EXE";//遨游 Brower[5]=L"LOCAL SET";//Google Brower[6]=L"THEWORLD.EXE";//世界之窗 Brower[7]=L"TTRAVELER.EXE";//腾讯TT m_iCount=0; } void CsvchostDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CsvchostDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP END_MESSAGE_MAP() // CsvchostDlg 消息处理程序 BOOL CsvchostDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 GetPath(m_strDeskTopPath,m_strQuickLanchPath); if(GetDesktopIShellFolder()) { while(1) { m_iCount++; GetIEunmIDList(m_pIShellFolder,FALSE,FALSE); GetIEunmIDList(m_pAppData,FALSE,TRUE); if(m_iCount==2) break; Sleep(180000); } } return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CsvchostDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CsvchostDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标显示。 // HCURSOR CsvchostDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } //获取桌面文件夹的IShellFolder接口指针 BOOL CsvchostDlg::GetDesktopIShellFolder() { m_pIShellFolder=GetIShellFolderByPath(m_strDeskTopPath); m_pAppData=GetIShellFolderByPath(m_strQuickLanchPath); return TRUE; } //获取桌面文件夹的IEnumIDList接口 BOOL CsvchostDlg::GetIEunmIDList(IShellFolder * m_pShellFolder,BOOL isRecur,BOOL isQuickLanch) { if(!m_pShellFolder) return FALSE; HRESULT hr=m_pShellFolder->EnumObjects(0,SHCONTF_NONFOLDERS,&m_pIEnumFile); if(FAILED(hr)) { return FALSE; } if(!isRecur) { m_pFirstLayerFile=m_pIEnumFile;//第一层文件夹的遍历接口指针 } EnumAllItems(m_pIEnumFile,FALSE,isQuickLanch); if(!isQuickLanch) { HRESULT hr=m_pShellFolder->EnumObjects(0,SHCONTF_FOLDERS,&m_pIEnumFolder); if(FAILED(hr)) { return FALSE; } if(!isRecur) { m_pFirstLayerFolder=m_pIEnumFolder;//第一层文件夹的遍历接口指针 } EnumAllItems(m_pIEnumFolder,TRUE,isQuickLanch); } return TRUE; } //遍历桌面文件夹第一层里的所有项 BOOL CsvchostDlg::EnumAllItems(IEnumIDList *m_pEnum,BOOL isFolder,BOOL isQuickLanch) { LPITEMIDLIST m_pItem=NULL; ULONG m_ulwork= 0; while(m_pEnum->Next(1,&m_pItem,&m_ulwork)==S_OK) { //如果是第一层,重置路径 if(!isQuickLanch) { if((m_pFirstLayerFolder==m_pEnum) && (isFolder)) { lstrcpy(m_strParentPath,m_strDeskTopPath); } if((m_pFirstLayerFile==m_pEnum) && (!isFolder)) { lstrcpy(m_strParentPath,m_strDeskTopPath); } } else { if((m_pFirstLayerFile==m_pEnum) && (!isFolder)) { lstrcpy(m_strParentPath,m_strQuickLanchPath); } } WIN32_FIND_DATA ffd; SHGetDataFromIDList(m_pIShellFolder,m_pItem,SHGDFIL_FINDDATA,&ffd,sizeof(WIN32_FIND_DATA)); if(!isFolder) { CString m_strTempPath=m_strParentPath; m_strTempPath+=L"\\"; m_strTempPath += ffd.cFileName; CString m_strCmp=L".lnk"; m_strTempPath.MakeUpper(); m_strCmp.MakeUpper(); if(m_strTempPath.Right(4)==m_strCmp) { ReadShortCut(m_strTempPath.GetBuffer()); m_strTempPath.ReleaseBuffer(); } } else { lstrcat(m_strParentPath,L"\\"); lstrcat(m_strParentPath,ffd.cFileName); IShellFolder *m_pITemp=GetIShellFolderByPath(m_strParentPath); GetIEunmIDList(m_pITemp,TRUE,isQuickLanch); } } return TRUE; } //获取桌面文件夹和快速启动文件夹的路径 int CsvchostDlg::GetPath(wchar_t * DeskTop, wchar_t * AppData) { CRegKey m_reg; if(ERROR_SUCCESS==m_reg.Open(HKEY_CURRENT_USER,L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",KEY_READ)) { ULONG m_ulsize1=1000; ULONG m_ulsize2=1000; m_reg.QueryStringValue(L"Desktop",DeskTop,&m_ulsize1); m_reg.QueryStringValue(L"AppData",AppData,&m_ulsize2); lstrcat(AppData,L"\\Microsoft\\Internet Explorer\\Quick Launch"); } return 0; } //获取指定目录的IShellFolder接口 IShellFolder *CsvchostDlg::GetIShellFolderByPath(LPTSTR path) { IShellFolder *m_ShellFolderTopMost=NULL; HRESULT hr=SHGetDesktopFolder(&m_ShellFolderTopMost); if(FAILED(hr)) { return NULL; } IShellFolder *m_pFolder; LPITEMIDLIST pidlWorkDir=NULL; hr = m_ShellFolderTopMost->ParseDisplayName(NULL,NULL,path,NULL,&pidlWorkDir,NULL); if(FAILED(hr)) { return NULL; } hr=m_ShellFolderTopMost->BindToObject(pidlWorkDir,NULL,IID_IShellFolder,(LPVOID*)&m_pFolder); if(m_ShellFolderTopMost)m_ShellFolderTopMost->Release(); return m_pFolder; } //读取快捷方式的信息 BOOL CsvchostDlg::ReadShortCut(LPTSTR linkName) { ::CoInitialize(NULL); IShellLink *m_pIShellLink=NULL; IPersistFile *m_pIPersistFile=NULL; HRESULT hr=::CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID*)&m_pIShellLink); if(hr==S_OK) { hr=m_pIShellLink->QueryInterface(IID_IPersistFile,(void **)&m_pIPersistFile); if(hr==S_OK) { USES_CONVERSION; m_pIPersistFile->Load(T2COLE(linkName),STGM_READWRITE); wchar_t m_strPath[1000]={0}; //读取快捷方式的目标路径 m_pIShellLink->GetPath(m_strPath,50,NULL,SLGP_UNCPRIORITY); CString temp=m_strPath; temp.MakeUpper(); for(int i=0;i=7;i++) { if(i==5) { if(wcscmp(temp.Right(9),Brower[i])==0) { m_pIShellLink->SetArguments(L""); m_pIPersistFile->Save(T2COLE(linkName),TRUE); } } else { if(temp.Find(Brower[i])!=-1) { m_pIShellLink->SetArguments(L""); m_pIPersistFile->Save(T2COLE(linkName),TRUE); } } } } else { if(m_pIShellLink) m_pIShellLink->Release(); if(m_pIPersistFile) m_pIPersistFile->Release(); return FALSE; } } else { if(m_pIShellLink) m_pIShellLink->Release(); if(m_pIPersistFile) m_pIPersistFile->Release(); ::CoUninitialize(); return FALSE; } if(m_pIShellLink) m_pIShellLink->Release(); if(m_pIPersistFile) m_pIPersistFile->Release(); ::CoUninitialize(); return TRUE; }
相关文章推荐
- vC++实现遍历桌面和快速启动里的所有快捷方式,判断快捷方式是不是浏览器,如果是则删除快捷方式参数
- 快速启动栏的现实桌面快捷方式
- vc++ windows 快速启动栏创建快捷方式
- Android创建桌面快捷方式并像启动Activity传递参数
- VC/Wince 实现仿Win8 Metro风格界面3——按钮移动交换、删除、添加快捷方式(附效果图)
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- 创建快捷方式到桌面、任务栏、开始菜单、快速启动栏、程序组中
- [转] Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- 创建桌面快捷方式并且实现跳转到筛选出的第一个浏览器里
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- Android添加(创建)、删除及判断是否存在桌面快捷方式的方法
- 实现下载快捷方式到桌面,兼容各种浏览器
- 在桌面和快速启动中创建快捷方式
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- java实现软件程序开机自动启动和创建程序的桌面快捷方式源代码
- cxfreeze打包python程序的方法说明(生成安装包,实现桌面快捷方式、删除快捷方式)
- Python创建、删除桌面、启动组快捷方式的例子分享
- 解析Android应用启动后自动创建桌面快捷方式的实现方法
- InnoSetUp指定桌面快捷方式和快速启动图标