編程實現向開始菜單和桌面上添加快捷方式

發表于:2007-07-04來源:作者:點擊數: 標簽:
上海同濟大學 羅筱波 通過InstallShield for Microsoft Visual C++ 6等應用程序創建一個安裝程序來建立菜單項或快捷方式并不復雜,但是如果希望做一個無須安裝的“綠色軟件”,那么就只有自己編程實現了。 一、快捷方式的實質 Windows 的快捷方式實際上是一
上海同濟大學 羅筱波

  通過InstallShield for Microsoft Visual C++ 6等應用程序創建一個安裝程序來建立菜單項或快捷方式并不復雜,但是如果希望做一個無須安裝的“綠色軟件”,那么就只有自己編程實現了。 一、快捷方式的實質

  Windows的快捷方式實際上是一個帶有擴展名LNK的數據文件,其中包含有用于訪問Windows某一對象(即在資源管理器中所能瀏覽的所有對象,包括文件、文件夾、驅動器及打印機等)的有關信息,如目標對象的路徑和名稱,工作目錄,要傳遞的命令行參數,運行時的初始顯示狀態,圖標及其快捷鍵等。通過在快捷方式上單擊鼠標右鍵并在彈出菜單中選擇“屬性"可以觀察該快捷方式的這些性質。

  快捷方式的數據文件如果存放在“\Windows\Desktop"子目錄下,這個快捷方式就會顯示在桌面上,而如果存放在“\Windows\Start Menu\Programs" 子目錄下,這個快捷方式就會作為“開始"菜單的一個菜單項出現。而桌面上的文件夾和“開始"菜單的菜單組則是上述兩個子目錄下的子目錄的表現。 二、編程思想

  Windows外殼(Shell)的快捷方式是以OLE技術的組件對象模型COM(Component Object Model)為基礎而設計的。利用COM模型,一個應用程序可以調用另一個應用程序的某些功能。

  在了解了上述基本原理后,創建Windows的快捷方式就比較容易了。首先利用OLE通過調用CoCreateInstance()函數建立一個IID_IShellLink實例,并同時得到其接口指針。利用這個接口指針可以對其各項屬性進行設置。為了使這些信息以快捷方式的數據文件(*.lnk)格式保存起來,還需要從IID_IShellLink對象取得其 IID_IPersistFile接口指針,以便于調用其成員函數Save(),保存前面設置的信息。

  至于如何刪除快捷方式以及創建和刪除文件夾,則只需要簡單地調用文件操作函數SHFileOperation()。 三、應用舉例

  筆者用VC6.0編寫了如下示例程序。該示例程序為一個基于對話框的應用程序,其中兩個按鈕分別用于實現向開始菜單和桌面上添加快捷方式,另兩個按鈕分別用于實現刪除開始菜單和桌面上添加快捷方式。

  具體代碼如下: void CShoutcutDlg::OnButtonadd() // 向開始菜單添加快捷方式按鈕命令 { AddToStartMenu(); } void CShoutcutDlg::AddToStartMenu() ] // 向開始菜單添加快捷方式 { char chDir[512]; // 保存找到的\Windows\Start Menu\Programs路徑 long result; HKEY hKey; // 注冊表打開鍵的句柄 DWORD dwType; DWORD dwSize; // 打開注冊表 result=RegOpenKeyEx(HKEY_CURRENT_USER, “Software\\Microsoft\\Windows\\CurrentVersion \\Explorer\\Shell Folders", NULL,KEY_QUERY_VALUE,&hKey); if(result==ERROR_SUCCESS) { dwSize=512; // 查詢Programs的鍵值并把查詢到的結果 保存在字符串“chDir”中(因為Windows 并不一定安裝在c盤中,所以要查詢注冊表) result=RegQueryValueEx(hKey,“Programs",0, &dwType,(LPBYTE)chDir,&dwSize); result=RegCloseKey(hKey); // 關閉注冊表 strcat(chDir,“\\My_shortcut_example"); // 在“開始“菜單里建立 “My_shortcut_example”菜單組 CreateDirectory(chDir,NULL); // 創建目錄 strcat(chDir,“\\Myshortcut.lnk"); //在“開始“菜單里建立“Myshortcut”菜單項 HRESULT hres; IShellLink* pShellLink; // 得到IshellLink接口指針 CoInitialize(NULL); // 初始化COM類庫 hres=CoCreateInstance(CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER,IID_IShellLink, (LPVOID *)&pShellLink); // 建立一個IID_IShellLink實例 if(SUCCEEDED(hres)) { // IpersistFile接口提供了允許 將一個對象從磁盤加載或保存到磁盤的方法 IPersistFile* pPf; // 得到當前運行的可執行程序的全路徑名 TCHAR exeFullPath[MAX_PATH]; GetModuleFileName(NULL,exeFullPath,MAX_PATH); pShellLink->SetPath(exeFullPath); // 設置快捷方式的路徑 pShellLink->SetDescription (“My shortcut example"); // 設置快捷方式的描述 hres=pShellLink->QueryInterface (IID_IPersistFile,(LPVOID *)&pPf); if(SUCCEEDED(hres)) { WORD sz[MAX_PATH]; // 字符串為ANSI 格式,須轉化為Unicode格式 MultiByteToWideChar(CP_ACP,0,chDir, -1,sz,MAX_PATH); hres=pPf->Save(sz,TRUE); // 保存鏈接 pPf->Release(); } pShellLink->Release(); } } else MessageBox(“創建菜單組和菜單項快捷方式失敗", NULL,MB_ICONINFORMATION | MB_OK); } void CShoutcutDlg::OnButtondelete() // 從開始菜單刪除快捷方式按鈕命令 { DeleteFromStartMenu(); } void CShoutcutDlg::DeleteFromStartMenu() // 刪除向開始菜單添加的快捷方式 { //與向開始菜單添加快捷方式時一樣, 首先取得快捷方式所在的目錄路徑, 方法與向開始菜單添加快捷方式相同 char chDir[512]; long result; HKEY hKey; // 注冊表打開鍵的句柄 DWORD dwType; DWORD dwSize; // 打開注冊表 result=RegOpenKeyEx(HKEY_CURRENT_USER, “Software\\Microsoft\\Windows\\CurrentVersion \\Explorer\\Shell Folders", NULL,KEY_QUERY_VALUE,&hKey); if(result==ERROR_SUCCESS) { dwSize=512; // 查詢Programs的鍵值并把查詢到的 結果保存在字符串“chDir”中 (因為Windows并不一定安裝在c盤中, 所以要查詢注冊表) result=RegQueryValueEx(hKey, “Programs",0,&dwType,(LPBYTE)chDir,&dwSize); result=RegCloseKey(hKey); // 關閉注冊表 strcat(chDir,“\\My_shortcut_example"); // 得到快捷方式的目錄刪除快捷方式的目錄, // 首先確保文件存在 CFileFind findfile; char str[MAX_PATH]=“Myshortcut.lnk"; SetCurrentDirectory(chDir); // 重新設置當前目錄為快捷方式所在的目錄 if(!findfile.FindFile(str)) // 在當前目錄下搜索快捷方式文件 { MessageBox(“找不到快捷方式文件 Myshortcut.lnk,可能已經被刪除 ", NULL,MB_ICONINFORMATION | MB_OK); return; } char lpDelDir[512]; // 要刪除的目錄 for(int i=0; i<512; i++) lpDelDir[i]='\0'; // 初始化 strcat(lpDelDir,chDir); SHFILEOPSTRUCT fileOp; // 文件操作結構 ZeroMemory( &fileOp, sizeof( fileOp)) ; // 初始化 fileOp.hwnd=NULL; // 設置hwnd為NULL以便隱藏文件操作對話框 fileOp.wFunc=FO_DELETE; // 刪除操作 fileOp.pFrom=lpDelDir; // 要刪除的目錄 fileOp.fFlags=FOF_NOCONFIRMATION | FOF_SILENT | FOF_ALLOWUNDO; // 刪除文件到 回收站 if(SHFileOperation(&fileOp)==0) // 刪除 MessageBox(“從開始菜單上刪除快捷方式完成", NULL,MB_ICONINFORMATION | MB_OK); else MessageBox(“從開始菜單上刪除快捷方式失敗", NULL,MB_ICONINFORMATION | MB_OK); } else MessageBox(“打開注冊表失敗", NULL,MB_ICONINFORMATION | MB_OK); } void CShoutcutDlg::OnButtondesktop() // 向桌面上添加快捷方式按鈕命令 { AddToDesktop(); } void CShoutcutDlg::AddToDesktop() // 向桌面上添加快捷方式,因程序與向開始菜單上 //添加快捷方式基本一樣,故不再給出注釋。 { char chDir[512]; long result; HKEY hKey; DWORD dwType; DWORD dwSize; result=RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders",NULL,KEY_QUERY_VALUE,&hKey); if(result==ERROR_SUCCESS) { dwSize=512; // 查詢Desktop的鍵值并把查詢到的結果 保存在字符串“chDir”中(因為Windows 并不一定安裝在c盤中,所以要查詢注冊表) result=RegQueryValueEx(hKey,"Desktop", 0,&dwType,(LPBYTE)chDir,&dwSize); result=RegCloseKey(hKey); strcat(chDir,"\\Myshortcut.lnk"); HRESULT hres; IShellLink* pShellLink; CoInitialize(NULL); hres=CoCreateInstance(CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER,IID_ IShellLink,(LPVOID *)&pShellLink); if(SUCCEEDED(hres)) { IPersistFile* pPf; TCHAR exeFullPath[MAX_PATH]; GetModuleFileName(NULL,exeFullPath,MAX_PATH); pShellLink->SetPath(exeFullPath); pShellLink->SetDescription(“My shortcut example"); hres=pShellLink->QueryInterface (IID_IPersistFile,(LPVOID *)&pPf); if(SUCCEEDED(hres)) { WORD sz[MAX_PATH]; MultiByteToWideChar (CP_ACP,0,chDir,-1,sz,MAX_PATH); hres=pPf->Save(sz,TRUE); pPf->Release(); } pShellLink->Release(); } } else MessageBox(“向桌面上添加快捷方式失敗", NULL,MB_ICONINFORMATION | MB_OK); } void CShoutcutDlg::OnButtondeletedesktop() // 從桌面上刪除快捷方式按鈕命令 { DeleteFromDesktop(); } void CShoutcutDlg::DeleteFromDesktop() // 刪除向桌面上添加的快捷方式, //因程序與刪除開始菜單上添加快捷方式 //基本一樣,故不再給出注釋。 { char chDir[512]; long result; HKEY hKey; DWORD dwType; DWORD dwSize; result=RegOpenKeyEx(HKEY_CURRENT_USER, “Software\\Microsoft\\Windows\\CurrentVersion \\Explorer\\Shell Folders",NULL,KEY_QUERY_VALUE,&hKey); if(result==ERROR_SUCCESS) { dwSize=512; result=RegQueryValueEx(hKey,“Desktop", 0,&dwType,(LPBYTE)chDir,&dwSize); result=RegCloseKey(hKey); CFileFind findfile; char str[MAX_PATH]=“Myshortcut.lnk"; SetCurrentDirectory(chDir); if(!findfile.FindFile(str)) { MessageBox(“找不到快捷方式文件 Myshortcut.lnk, 可能已經被刪除",NULL,MB_ICONINFORMATION | MB_OK); return; } strcat(chDir,“\\Myshortcut.lnk"); char lpDelDir[512]; for(int i=0; i<512; i++) lpDelDir[i]=‘\0'; strcat(lpDelDir,chDir); SHFILEOPSTRUCT fileOp; ZeroMemory( &fileOp, sizeof( fileOp)) ; fileOp.hwnd=NULL; fileOp.wFunc=FO_DELETE; fileOp.pFrom=lpDelDir; fileOp.fFlags=FOF_NOCONFIRMATION | FOF_ SILENT | FOF_ALLOWUNDO; // 刪除文件到回收站 if(SHFileOperation(&fileOp)==0) MessageBox(“從桌面上刪除快捷方式完成", NULL,MB_ICONINFORMATION | MB_OK); else MessageBox(“從桌面上刪除快捷方式失敗",NULL, MB_ICONINFORMATION | MB_OK); } else MessageBox(“打開注冊表失敗",NULL, MB_ICONINFORMATION | MB_OK); }    作者郵箱:luob@citiz.net

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97