Mỗi khi chúng ta muốn tạo các shortcut cho các chương trình của chúng ta trên Desktop, những gì chúng ta làm như thường lệ là, chúng ta tạo các file .lnk cho các chương trình của mình sử dụng IShellLink. Khi mà chúng ta tạo như vậy, những gì mà chúng ta được là một biểu tượng trên desktop với một mũi tên ở góc dưới trái nó, và nếu bạn click chuột phải vào nó, bạn sẽ nhận được một menu với các mục như cut, copy, paste, delete, v.v... Nhưng nếu bạn quan sát icon shortcut của Internet Explorer trên desktop, nó thường là một icon không có mũi tên ở góc và với một menu cũng khác hẳn. (Nếu bạn quan sát Microsoft's Connection Manager, bạn sẽ thấy sự khác biệt nhiều hơn cả Internet Explorer). Lúc này để biết được làm thế nào để tạo một shortcut như thế trên desktop với một menu theo ý muốn của chúng ta.

Khi bạn thực thi code này, bạn sẽ nhận được một icon trên desktop với 'Netlinker'; là tên shortcut của nó. Nếu bạn click đúp nó, nó sẽ mở Internet Explorer và nếu bạn click chuột phải vào nó, bạn sẽ thấy một menu tùy thích mà không có các mục cut, copy, paste, rename. Bạn cũng có thể delete shortcut này từ Desktop. Nếu bạn lựa chọn properties của icon này, nó sẽ mở ra hộp thoại Internet Properties.

Implementing

Chọn một icon 32x32 pixel và chỉ rõ đường dẫn của nó:
Code:
CString shtct_ico=_T("C:\\32x32.ico");
Cái này là để hiện hộp thoại Internet Explorer properties
Code:
CString shtct_prop=_T("rundll32.exe shell32.dll,Control_RunDLL inetcpl.cpl,,0");
Cái này để tên shortcut được hiển thị trên desktop
Code:
CString shtct_name=_T("Netlinker");
Lấy đường dẫn của Internet Explorer và lưu trữ nó:
Code:
CRegKey m_Kiepath;
CString ie_path;
DWORD dwval;
m_Kiepath.Open(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppPaths\\IEXPLORE.EXE");
m_Kiepath.QueryValue(ie_path.GetBuffer(1000),NULL,&dwval);
m_Kiepath.Close();
String shtct_to=ie_path;
Tạo ra một GUID sử dụng guidgen.exe và copy nó vào clipboard và paste nó ở đây. Đây là GUID mà chúng ta sử dụng để đại diện cho shortcut của chúng ta và các mục của nó. Và đây, GUID mà chúng ta đã tạo ra là: 6270AEE4-AA41-11d4-A25D-008048B63F94.

Tạo ra GUID key dưới HKCR\CLSID và thiết lập tên shortcut và giá trị của nó:
Code:
CRegKey m_kdsktp;
m_kdsktp.Create(HKEY_CLASSES_ROOT,"CLSID\\{6270AEE4-AA41-11d4-A25D-008048B63F94}");
m_kdsktp.SetValue(shtct_name);
m_kdsktp.Close();
Dưới GUID, tạo một key DefaultIcon, cái này tương ứng hiển thị cho icon của shortcut, cho nên thiết lập giá trị của nó là đường dẫn của icon:
Code:
m_kdsktp.Create(HKEY_CLASSES_ROOT,"CLSID\\{6270AEE4-AA41-11d4-A25D-008048B63F94}\\DefaultIcon");
m_kdsktp.SetValue(shtct_ico);
m_kdsktp.Close();
Bây giờ thiết lập các mục cho menu cho menu khi click chuột phải. Đây là menu Open, và việc thực hiện được của nó nhờ thiết lập:
Code:
m_kdsktp.Create(HKEY_CLASSES_ROOT, "CLSID\\{6270AEE4-AA41-11d4-A25D-008048B63F94}\\Shell\\Open\\Command");
m_kdsktp.SetValue(shtct_to);
m_kdsktp.Close();
Thiết lập menu properties và việc thực hiện của nó:
Code:
m_kdsktp.Create(HKEY_CLASSES_ROOT,"CLSID\\{6270AEE4-AA41-11d4-A25D-008048B63F94}\\Shell\\Properties\\Command");
m_kdsktp.SetValue(shtct_prop);
m_kdsktp.Close();
Bây giờ thiết lập thuộc tính của menu với mục đích là các mục của menu mặc định như cut, copy, paste, rename, delete, v.v.. sẽ được gỡ bỏ.
Code:
BYTE *b;
HANDLE heap;
char a[20];
m_kdsktp.Create(HKEY_CLASSES_ROOT,"CLSID\\{6270AEE4-AA41-11d4-A25D-008048B63F94}\\ShellFolder");
strcpy(a,"00.00.00.00");
heap=HeapCreate(0,0,0);
b=(BYTE*)HeapAlloc(heap,0,30);
scanf(a,"%x.%x.%x.%x",&b[0],&b[1],&b[2],&b[3]);19/08/2001
RegSetValueEx(m_kdsktp.m_hKey,"Attributes",0,REG_BINARY,b,4);
HeapFree(heap,0,b);
HeapDestroy(heap);
m_kdsktp.Close();
Bây giờ bạn có thể tạo một tham chiếu cho GUID này dưới HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Exp lorer\Desktop\Namespace. Sau đó nó sẽ hiện ra trên desktop.
Code:
m_kdsktp.Create(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\NameSpace\\{6270AEE4-AA41-11d4-A25D-008048B63F94}");
m_kdsktp.SetValue("Netlink");
m_kdsktp.Close();
Vì chúng ta sử dụng với shell, chúng ta phải báo cho nó. Nếu không mọi thay đổi sẽ có kết quả tức thì.
Code:
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_FLUSHNOWAIT,0, 0);
Bài viết này do Dr dịch lại từ Codeproject vì thấy nó rất có ích cho người phát triển ứng dụng. Nếu thấy chỗ nào dịch sai mong mọi người bỏ quá cho.

Bài gốc xem tại đây