如何把程序釘到Windows7任務欄

在CSDN論壇看到有網友提問如何把程序釘到Windows7的任務欄,ccrun(妖哥)對這個問題很感興趣,因而google了一下,沒有找到相關的API資料,可是在國外的一個站點看到用FolderItemVerb對象來實現的方法,關於具體的資料,能夠查閱MSDN:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb774172(v=vs.85).aspxwindows

在Delphi中實現的代碼以下。編譯環境:Delphi7和XE2,測試操做系統爲中文和英文Windows7ide

  1. uses ComObj;  
  2.   
  3. procedure CrnPinAppToWin7Taskbar(strPath, strApp: string);  
  4. var  
  5.   vShell, vFolder, vFolderItem, vItemVerbs: Variant;  
  6.   vPath, vApp: Variant;  
  7.   i: Integer;  
  8.   str: String;  
  9.   h: HINST;  
  10.   szPinName: array[0..255of Char;  
  11. begin  
  12.   vShell := CreateOleObject('Shell.Application');  
  13.   vPath := strPath;  
  14.   vFolder := vShell.NameSpace(vPath);  
  15.   vApp := strApp;  
  16.   vFolderItem := vFolder.ParseName(vApp);  
  17.   vItemVerbs := vFolderItem.Verbs;  
  18.   
  19.   h := LoadLibrary('Shell32.dll');  
  20.   LoadString(h, 5386, szPinName, 256);  
  21.   FreeLibrary(h);  
  22.   
  23.   for i := 1 to vItemVerbs.Count do  
  24.   begin  
  25.     str := vItemVerbs.Item(i).Name;  
  26.   
  27.     if SameText(str, szPinName) then  
  28.     begin  
  29.       // 63 63 72 75 6E 2E 63 6F 6D  
  30.       vItemVerbs.Item(i).DoIt;  
  31.     end;  
  32.   end;  
  33. end;  
  34.   
  35. procedure TForm1.Button1Click(Sender: TObject);  
  36. begin  
  37.   CrnPinAppToWin7Taskbar('C:\windows''regedit.exe');  
  38. end;  


在C++Builder中的實現代碼以下。編譯環境:C++Builder6和XE2,測試操做系統:中文和英文Windows7測試

  1. #include <comobj.hpp>  
  2.   
  3. void __fastcall CrnPinAppToWin7Taskbar(String strPath, String strApp)  
  4. {  
  5.     Variant vShell = CreateOleObject("Shell.Application");  
  6.     Variant vFolder = vShell.OleFunction("NameSpace", WideString(strPath));  
  7.     Variant vFolderItem = vFolder.OleFunction("ParseName", WideString(strApp));  
  8.     Variant vItemVerbs = vFolderItem.OleFunction("Verbs");  
  9.   
  10.     // 獲取Pin to Taskbar的Verb字符串, 感謝titilima  
  11.     HINSTANCE hInst = ::LoadLibrary("Shell32.dll");  
  12.   
  13.     TCHAR szPinName[256] = { 0 };  
  14.     ::LoadString(hInst, 5386, szPinName, 256);  
  15.   
  16.     ::FreeLibrary(hInst);  
  17.   
  18.     String str;  
  19.   
  20.     int nCount = vItemVerbs.OlePropertyGet("Count");  
  21.     for (int i = 0; i < nCount; i++)  
  22.     {  
  23.         str = vItemVerbs.OleFunction("Item", i).OlePropertyGet("Name");  
  24.   
  25.         if (SameText(str, szPinName))  
  26.         {  
  27.             // 63 63 72 75 6E 2E 63 6F 6D  
  28.             vItemVerbs.OleFunction("Item", i).OleFunction("DoIt");  
  29.         }  
  30.     }  
  31. }  
  32.   
  33. void __fastcall TForm1::Button1Click(TObject *Sender)  
  34. {  
  35.     CrnPinAppToWin7Taskbar("C:\\windows\\", "notepad.exe");  
  36. }  


另外,感謝titilima大牛,針對.lnk文件釘到Win7任務欄,有更簡便的方法:ui

C++代碼:google

  1. ::ShellExecute(NULL, TEXT("TaskbarPin"), TEXT("E:\\Temp\\Notepad.lnk"), NULL, NULL, SW_SHOW);  

Delphi代碼:spa

  1. ShellExecute(nil'TaskbarPin''E:\Temp\Notepad.lnk'), nilnil, SW_SHOW);  
相關文章
相關標籤/搜索