无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 9538|回复: 22
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
1#
发表于 2009-9-11 03:28:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
周末,总是有点空的,完善一下:
1、修正了编辑框缓冲区太小的BUG;
2、修正了浏览按钮打开LNK文件存在的BUG;
3、支持在 Win7 系统中将 EXE 文件和LNK文件Pin到开始菜单和任务栏;
4、同时也支持在XP/2003系统中将EXE和LNK文件Pin到开始菜单;
5、将工具的文件名改短,方便记忆。

命令行用法:PinTo.EXE 文件名,[菜单项]
文件名:EXE或LNK完整文件名,含路径和扩展名
菜单项:字符串表示,不同的系统中不同,这是最麻烦之处;
            简体中文Win7系统的菜单项为"附到「开始」菜单(&U)"
            简体中文2003/XP菜单项可能是"附到「开始」菜单(&I)"
            可以修改字符串资源来适应不同的系统,如果字符串资源
            中预置的菜单项与当前系统的相同,菜单项可以省略。





PinTo.RAR (69.58 KB, 下载次数: 330)

为Win7的 Pinned to StartMenu 花了不少时间,
但本人能力有限,无法用 SDK 来完成这一功能,
只能用 Delphi 做了一个简易工具,支持窗口界面操作和命令行参数,
见图。工具可能存在不足,本人只在2003、Win7PE中测试通过。

[ 本帖最后由 lxl1638 于 2009-9-11 19:01 编辑 ]
2#
发表于 2009-9-11 06:38:19 | 只看该作者
抢到沙发!爽就一个字!
回复

使用道具 举报

3#
发表于 2009-9-11 07:23:19 | 只看该作者
直接集成到PECMD

是不是更好呢.
回复

使用道具 举报

4#
 楼主| 发表于 2009-9-11 18:58:08 | 只看该作者
原帖由 66369 于 2009-9-11 07:23 发表
直接集成到PECMD

是不是更好呢.


PECMD.EXE是用纯API写出来的,本人根本不知道如何用API实现这样的功能,所以专门用Delphi做这个工具,先顶着用再说。
也更新一下:

1、修正了编辑框缓冲区太小的BUG;
2、修正了浏览按钮打开LNK文件存在的BUG;
3、支持在 Win7 系统中将 EXE 文件和LNK文件Pin到开始菜单和任务栏
4、同时也支持在XP/2003系统中将EXE和LNK文件Pin到开始菜单;
5、将工具的文件名改短,方便记忆。
回复

使用道具 举报

5#
发表于 2009-9-11 19:26:14 | 只看该作者
高级玩意弄不懂,但肯定要支持的
已经下载试用
回复

使用道具 举报

6#
发表于 2009-9-11 19:39:55 | 只看该作者
不错不错···又一款实用的工具···
回复

使用道具 举报

7#
发表于 2009-9-11 20:38:00 | 只看该作者
其实界面没什么意义的,这样比我那个32K的还大.
回复

使用道具 举报

8#
发表于 2009-9-11 20:52:29 | 只看该作者
原帖由 270979789 于 2009-9-11 20:38 发表
其实界面没什么意义的,这样比我那个32K的还大.



怎么来说呢,大大做的东西一般都很有特色,通用性很强;个人感觉这东西如果集成到PECMD里会很不错的,建议大大给些设计方案,让无忧有志之士来代劳编写一个API子函数,不过PECMD可供调用的参数毕竟不多了,所以必须先给该工具的代码与API进入接口参数,这样一来估计不会超过50k大小。

但大大总是说时间不够,实际上时间这东西,就像女人的乳沟挤挤还有是的。
回复

使用道具 举报

9#
发表于 2009-9-11 20:57:51 | 只看该作者
原帖由 天使的魔翼 于 2009-9-11 20:52 发表



怎么来说呢,大大做的东西一般都很有特色,通用性很强;个人感觉这东西如果集成到PECMD里会很不错的,建议大大给些设计方案,让无忧有志之士来代劳编写一个API子函数,不过PECMD可供调用的参数毕竟不多了 ...



=========

你的高论有特色.


=========

顺便重下载了.不放入PECMD也可以的.体积不大.放内核或外置都可以的.
回复

使用道具 举报

10#
发表于 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 编辑 ]
回复

使用道具 举报

11#
发表于 2009-9-11 22:12:00 | 只看该作者
原帖由 lxl1638 于 2009-9-11 03:28 发表
周末,总是有点空的,完善一下:
1、修正了编辑框缓冲区太小的BUG;
2、修正了浏览按钮打开LNK文件存在的BUG;
3、支持在 Win7 系统中将 EXE 文件和LNK文件Pin到开始菜单和任务栏;
4、同时也支持在XP/2003 ...

图形的没有必要(因为进入PE后用右键更方便)
仅命令行有用(可用在启动时加入)
当然pecmd有此命令是最方便的
回复

使用道具 举报

12#
发表于 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 编辑 ]
回复

使用道具 举报

13#
 楼主| 发表于 2009-9-12 06:35:51 | 只看该作者
原帖由 风沙星辰 于 2009-9-12 01:38 发表
仔细看了一下,那段VB代码的VISTA部分有点问题
索性我就全部翻译成VC吧

// For XP
void Pin()
{
  CoInitialize(NULL);
  CComPtr pShell;
  CoCreateInstance(CLSID_Shell, NULL, CLSCTX_SERVER, II ...


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

使用道具 举报

14#
发表于 2009-9-12 07:45:41 | 只看该作者
肯定要支持的!!!!!!!!!!!!!!!!
回复

使用道具 举报

15#
发表于 2009-9-12 09:24:05 | 只看该作者
谢谢啦,先下载来看看
回复

使用道具 举报

16#
发表于 2009-9-12 22:33:52 | 只看该作者
原帖由 lxl1638 于 2009-9-12 06:35 发表


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


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

使用道具 举报

17#
 楼主| 发表于 2009-9-13 02:29:06 | 只看该作者
原帖由 风沙星辰 于 2009-9-12 22:33 发表


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



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

简体中文系统是"附到「开始」菜单.....",但繁体的呢?英文系统呢?
本人应用了另一种方法(当然也支持用户自己设置菜单项):
1、NT5.x系统读注册表,这个应该不会有错;
2、NT6.x系统读SHELL32.DLL的资源字符串。
这样处理后就基本上做到与系统无关了。

新版的PECMD做好了,打算测试一些时间,国庆前后再更新,
附件包含了FTP中本人那个演示Win7PE的更新包(含外置INI)。


┣━━━┿━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃      │格式│PINT <文件名称>,[菜单字符|菜单标识|#字符串ID]                                               ┃
┃      ├──┼──────────────────────────────────────────────┨
┃      │功能│将 EXE 或 LNK 文件 Pin 到"开始菜单"或"任务栏",NT5.x系统只支持"开始菜单"。                  ┃
┃      ├──┼──────────────────────────────────────────────┨
┃      │参数│■文件名称: EXE 或 LNK 文件名,要带路径和扩展名,支持环境变量解释;                         ┃
┃      │    │■菜单字符: EXE、LNK文件右键菜单对应的字符串,如"附到「开始」菜单(&U)"、"锁定到任务栏(&K)";┃
┃      │    │■菜单标识: 可以用"StartMenu"或"TaskBand",前者表示Pin到"开始菜单",后者表示Pin到"任务栏"; ┃
┃      │    │■字符串ID: "附到「开始」菜单(&U)"、"锁定到任务栏(&K)"在SHELL32.DLL资源字符串表中的编号。   ┃
┃'PINT'├──┼──────────────────────────────────────────────┨
┃      │示例│PINT %SystemRoot%\Regedit.EXE,StartMenu 或 PINT %SystemRoot%\Regedit.LNK,附到「开始」菜单   ┃
┃      │    │PINT %SystemRoot%\Regedit.EXE,TaskBand  或 PINT %SystemRoot%\Regedit.LNK,锁定到任务栏(&K)   ┃
┃      │    │PINT %SystemRoot%\Regedit.EXE,#5381  或 PINT %SystemRoot%\Regedit.LNK,#5386                 ┃
┃      ├──┼──────────────────────────────────────────────┨
┃      │备注│※该命令需系统功能的支持,在一些精简系统或XP、2003系统中可能因功能的精简而无法实现;        ┃
┃      │    │※"菜单字符"、"菜单标识"和"字符串号"3个参数只取其一,当3个参数均省略时表示Pin到"开始菜单";
┃      │    │  这3个参数因系统而异,建议使用系统的"菜单字符"(如"附到「开始」菜单(&U))"来表示;           ┃
┃      │    │※"菜单字符"原理上可以用系统右键菜单的其它项目,来实现一定的功能,如用"打开(&O)"来打开文件。┃
┣━━━┿━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫


[ 本帖最后由 lxl1638 于 2009-9-13 02:36 编辑 ]

PinnedTo.PNG (38.78 KB, 下载次数: 30)

PinnedTo.PNG

PECMD-V3.6.0930.310.RAR

140.81 KB, 下载次数: 77, 下载积分: 无忧币 -2

回复

使用道具 举报

18#
发表于 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 编辑 ]
回复

使用道具 举报

19#
 楼主| 发表于 2009-9-13 03:26:02 | 只看该作者
原帖由 风沙星辰 于 2009-9-13 03:16 发表


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


可以用 GetModuleHandle 或 LoadLibrary 载入 SHELL32.DLL,然后用 LoadString 读取指定编号的字符串。

只要SHELL32.DLL不更新(或者更新后这两个序号的字符串也不变),都可以使用,这样就与系统无关了。
回复

使用道具 举报

20#
发表于 2009-9-13 20:42:04 | 只看该作者
原帖由 lxl1638 于 2009-9-13 02:29 发表



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

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

多谢, 新版的 pecmd 已经用上了, pinto.exe 实在没用处(命令行执行始终就是出错, GUI是脱裤子放屁^_^)
回复

使用道具 举报

21#
发表于 2009-9-15 14:10:44 | 只看该作者
很好的小东东。很好用啊
回复

使用道具 举报

22#
发表于 2009-9-16 15:15:14 | 只看该作者
看大大们的精彩谈论,羡慕并学习中……
回复

使用道具 举报

23#
发表于 2009-9-22 22:25:34 | 只看该作者
灵异事件: pecmd 只能将 boot.wim 内的文件钉上去, boot.wim 的文件钉不住:)
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-12-2 15:53

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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