无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 8813|回复: 22
打印 上一主题 下一主题

Win7及其PE系统专用小工具 -- Pinned to Start Menu & Pinned to Taskbar。

[复制链接]
1#
发表于 2009-9-11 21:45:48 | 显示全部楼层
With xp it's easy to pin items to the start menu, by simply adding a reference to
"Windows script host object model"
However, this doesn't seem to work on Vista.
Does anyone know if this is possible with Vista?

XP
Pin
Code:
Private Sub Form_Load()   
Dim objShell As Object   
Dim objFolder As Object   
Dim objApp As Object   
Set objShell = CreateObject("Shell.Application")   
Set objFolder = objShell.Namespace("C:\Windows\System32")   
Set objApp = objFolder.ParseName("notepad.exe")   
If objApp Is Nothing Then        
MsgBox ("Executable not found.  Make sure the path and file name are correct.")   
Else        
objApp.InvokeVerb ("P&in to Start Menu")   
End If
End Sub
Unpin
Code:
Private Sub Form_Unload(Cancel As Integer)   
Dim objShell As Object   
Dim objFolder As Object   
Dim objApp As Object   
Set objShell = CreateObject("Shell.Application")   
Set objFolder = objShell.Namespace("C:\Windows\System32")   
Set objApp = objFolder.ParseName("notepad.exe")   
If objApp Is Nothing Then        
MsgBox ("Executable not found.  Make sure the path and file name are correct.")   
Else        
objApp.InvokeVerb ("Unp&in from Start Menu")   
End If
End Sub

VISTA
This vb script works on Vista:
Code:
Set objShell = CreateObject("Shell.Application")   
Set objFolder = objShell.Namespace("C:\Windows\System32\")   
Set objApp = objFolder.ParseName("notepad.exe")   
For Each verb in objFolderItem.Verbs()   
If verb.Name = "P&in to Start Menu" Then
verb.DoIt   
Next
The nice thing about doing it this way on Vista, is that you can also use the handy verbs
Create &Shortcut, and Add to Quick Launch

Google来的VB代码,用到了COM技术,不是简单的API能够完成
不知楼主会用 VC 还是 DELPHI  了解COM的话翻译过来应该不难

我还是附上地址吧:http://www.vbforums.com/showthread.php?t=534820

[ 本帖最后由 风沙星辰 于 2009-9-11 21:58 编辑 ]
回复

使用道具 举报

2#
发表于 2009-9-12 01:38:21 | 显示全部楼层
仔细看了一下,那段VB代码的VISTA部分有点问题
索性我就全部翻译成VC吧

// For XP
void Pin()
{
  CoInitialize(NULL);
  CComPtr<IShellDispatch> pShell;
  CoCreateInstance(CLSID_Shell, NULL, CLSCTX_SERVER, IID_IDispatch, (LPVOID*)&pShell);
  CComPtr<Folder> pFolder;
  pShell->NameSpace(CComVariant(_T("C:\\Windows\\System32")), &pFolder);
  CComPtr<FolderItem> pItem;
  pFolder->ParseName(CComBSTR(_T("notepad.exe")), &pItem);
  pItem->InvokeVerb(CComVariant(_T("附到「开始」菜单(&I)")));
}
void UnPin()
{
  CoInitialize(NULL);
  CComPtr<IShellDispatch> pShell;
  CoCreateInstance(CLSID_Shell, NULL, CLSCTX_SERVER, IID_IDispatch, (LPVOID*)&pShell);
  CComPtr<Folder> pFolder;
  pShell->NameSpace(CComVariant(_T("C:\\Windows\\System32")), &pFolder);
  CComPtr<FolderItem> pItem;
  pFolder->ParseName(CComBSTR(_T("notepad.exe")), &pItem);
  pItem->InvokeVerb(CComVariant(_T("从「开始」菜单脱离(&I)")));
}

// For Vista,其实XP中也能用,就是比上面的多了个循环判断
void PinVista()
{
  CoInitialize(NULL);
  CComPtr<IShellDispatch> pShell;
  CoCreateInstance(CLSID_Shell, NULL, CLSCTX_SERVER, IID_IDispatch, (LPVOID*)&pShell);
  CComPtr<Folder> pFolder;
  pShell->NameSpace(CComVariant(_T("C:\\Windows\\System32")), &pFolder);
  CComPtr<FolderItem> pItem;
  pFolder->ParseName(CComBSTR(_T("notepad.exe")), &pItem);
  CComPtr<FolderItemVerbs> pItemVerbs;
  pItem->Verbs(&pItemVerbs);
  long lCount;
  pItemVerbs->get_Count(&lCount);
  for (long i=0; i!=lCount; i++)
  {
   CComPtr<FolderItemVerb> pItemVerb;
   pItemVerbs->Item(CComVariant(i), &pItemVerb);
   CComBSTR bstrName;
   pItemVerb->get_Name(&bstrName);
   if (bstrName == _T("附到「开始」菜单(&I)"))
   {
    pItemVerb->DoIt();
   }
  }
}

这样整合进PECMD应该很容易啦^_^
CoInitialize(NULL);是COM的初始函数,程序的初始化部分写一次就可以了,我写的时候为了测试方便,所以每段函数里都有。
我用的XP测试,For Vista 的菜单名是用的XP的
用到几个ATL的工具类,纯API的话还得改改
PS: 没有缩进代码好丑^_^

[ 本帖最后由 风沙星辰 于 2009-9-12 01:42 编辑 ]
回复

使用道具 举报

3#
发表于 2009-9-12 22:33:52 | 显示全部楼层
原帖由 lxl1638 于 2009-9-12 06:35 发表


这个收下了,有空再更新PECMD。
总觉得用COM实现这样的功能不是最终办法,因为参数与系统有关,不同的系统菜单项的名称不同。


查找菜单名称中有没有“附到「开始」菜单”,括号中的内容忽略便是。
回复

使用道具 举报

4#
发表于 2009-9-13 03:16:21 | 显示全部楼层
原帖由 lxl1638 于 2009-9-13 02:29 发表



多谢你将这些VB代码转成VC,PECMD的PINT命令完成了,功能比预计的方便。

简体中文系统是"附到「开始」菜单.....",但繁体的呢?英文系统呢?
本人应用了另一种方法(当然也支持用户自己设置菜单项):
...


哈哈读注册表我也想到了
只是,读XP的 {a2a9545d-a0c2-42b4-9708-a0b2badd77c8} 正常
读WIN7的里面却是英文pin to start menu
这让我很郁闷,也就没有深究。。
原来得读shell32.dll, 受教。。

[ 本帖最后由 风沙星辰 于 2009-9-13 03:23 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-13 06:35

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表