对应某种类型的文件出现不同的系统右键菜单的问题(100分)

  • 主题发起人 主题发起人 happygb
  • 开始时间 开始时间
H

happygb

Unregistered / Unconfirmed
GUEST, unregistred user!
我已经知道通过context menu handlers:向特定类型的文件对象增添上下文相关菜单,
但是,如何实现象WINRAR那样,对所有文件(除了加密文件外)都出现"添加的压缩文件..",而对压缩文件确不出现?
 
也很想知道.关注此问题.
 
问题: 想编个类似winzip那样与windows结合的很好的程序。 ( 积分: 300 )
分类: Windows API

来自: ecc, 时间: 2001-10-03 16:08:00, ID: 655117
各位大侠:[:)]
我现在想编制类似winzip应用程序(支持9x,nt,2000),但不是做压缩程序呦。^O^
要满足以下几点要求:
1.本程序关联特定后缀的文件,并且对不同后缀名的文件进行不同的处理。
这一点我知道需要修改注册表增加文件关联,并且支持文件运行参数。
2.在我的电脑或资源管理器中右键点击任意文件或文件夹在弹出菜单中增加
我的程序的一个功能。例如winzip一样,右键点击有Add to Zip 一项。这时并
没有我的程序在运行。
3.支持程序运行时最小化到右下角的状态栏中,象新版的foxmail一样。
希望各位大虾给提点建议和提示,多谢!

来自: dingbaosheng, 时间: 2001-10-03 16:13:00, ID: 655119
旧资料中的答案完全满足你的要求[:D]

来自: wheel, 时间: 2001-10-03 16:19:00, ID: 655124
2,DFW的第一篇帖子就是讨论这个的:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=20

3:在网上随便拖个控件,比如TCoolTrayIcon,自己写也不难,记得程序员大本营有讲这个的文章.:
http://www.csdn.net/dev/delphi/

来自: ecc, 时间: 2001-10-03 18:53:00, ID: 655229
...

来自: ecc, 时间: 2001-10-09 9:40:00, ID: 662426
...

来自: ecc, 时间: 2001-10-10 13:28:00, ID: 664495
还没有令我满意的回答!

来自: SuperJS, 时间: 2001-10-10 13:47:00, ID: 664518
自己找啊!太懒!

来自: ecc, 时间: 2001-10-12 15:55:00, ID: 669126
用300分换这点工作量而已。呵呵

来自: ecc, 时间: 2001-10-15 11:06:00, ID: 673400
>>

来自: jdshoot, 时间: 2001-10-16 3:15:00, ID: 674987
1,2.需要做外壳扩展,就是自己写一个dll做com服务器。你想实现上下文菜单,就要在这个
服务器中实现IContextMenu和IShellExtInit接口,在注册表中注册这个服务器,并与
你需要处理的文件扩展名关联。当你在我的电脑或资源管理器中的相关文件上点鼠标右
键时,系统外壳就会装载你的com服务器,并调用接口中的方法请求服务,你这时就可
以根据系统传进来的文件名确定添加哪些菜单项和子菜单(比如add to...)以及进行
相应的操作了。
3. 只要用Shell_NotifyIcon处理托盘图标,并且使程序最小化时不在任务栏上显示(可以
用ShowWindow函数),再处理一下托盘图标发回来的消息就行了。
具体内容可以参看《Delphi5开发人员指南》和Delphi的帮助。
《Delphi5开发人员指南》中的例子太长了,就不抄了,想要就留E-mail吧。
其实,dfw的资料下载站就有书下。

来自: dadabox, 时间: 2001-10-16 8:47:00, ID: 675062
你自己找一下获得的收获会比别人给你的多得多,要是这点都懒,怎么学得到东西呢?

来自: ecc, 时间: 2001-10-16 12:51:00, ID: 675542
多谢jdshoot!
我的电子邮件
ecc@cmmail.com

来自: jdshoot, 时间: 2001-10-16 17:37:00, ID: 676159
邮件已发出,请查收。

来自: ecc, 时间: 2001-10-19 9:19:00, ID: 680610
邮件已收到,多谢!

来自: kindly, 时间: 2001-10-19 10:41:00, ID: 680759
太懒

来自: ecc, 时间: 2001-10-19 14:46:00, ID: 681302
kindly,
对不起我不是简单的程序员,我还有其他工作要做!

来自: 雪狐狸, 时间: 2001-11-15 21:32:00, ID: 732701
以前有篇文章,你看看。

---- 在Delphi3.0 及 以 上 版 本 中, 提 供 了 一 个 构 件TRegistry。 在 程 序 中 可 以 利 用
它 来 实 现 对WIN95/98/NT 注 册 表 的 操 作, 可 以 很 方 便 地 在 注 册 表 中 增 加、 修 改 和 删
除 键 值。 这 样 可 以 在 程 序 中 完 成 一 些 特 殊 的 功 能。

---- TRegistry 常 用 的 属 性 和 方 法 有( 具 体 作 用 和 用 法 请 参 考Delphi 帮 助):

RootKey、CreateKey、OpenKey、
CloseKey、DeleteKey、ReadXXXX、WriteXXXX
(XXXX表示数据类型如String、Integer等)

---- 我 们 用 到 的 属 性 和 方 法 有:

RootKey:注册表的根键名( 如HKEY_LOCAL_MACHINE等)
OpenKey( KeyName:string; CanCreate:boolean ):

---- 使 当 前 键 为KeyName,CanCreate 表 示 当 指 定 的 键 不 存 在 时 是 否 创 建,True 表
示 创 建

SetKey( KeyName,KeyValue : string ):
使键KeyName的值为KeyValue

---- 应 用 之 一: 让 自 己 的 程 序 随WIN95/98/NT 的 启 动 而 运 行

---- 当 然, 你 可 以 在 " 启 动 " 程 序 组 中 加 入 程 序 的 快 捷 方 式, 但 这 样 做 好 象 不 大
明 智, 因 为 大 多 数 程 序 在 安 装 时 不 会 这 样 做, 而 是 在 通 过 在 注 册 表 增 加 键 值,
让WIN95/98/NT 在 启 动 时 运 行 自 己 的 程 序。 如 果 打 开 注 册 表, 找
到HKEY_LOCAL_MACHINE /Software /Microsoft /Windows /CurrentVersion
/Run, 就 会 发 现 这 个 秘 密 了, 原 来 许 多 自 动 运 行 的 程 序 都 在 这 里。 你 也 可 以 在 这
里 增 加 一 个 键, 让 你 的 程 序 也 随 着 WIN95/98/NT 的 启 动 而 自 己 运 行, 成 为WINDOWS
下 的TSR 程 序。 实 现 方 法 如 下:

---- 首 先, 在Uses 中 加 上Registry 单 元

---- 然 后, 写 下 面 代 码。

{将程序strExeFileName置为自动启动 }
function StartUpMyProgram
( strPrompt,strExeFileName : string ) : boolean;
var
registerTemp : TRegistry;
begin
registerTemp := TRegistry.Create;
//建立一个Registry实例
with registerTemp do
begin
RootKey:=HKEY_LOCAL_MACHINE;
//设置根键值为HKEY_LOCAL_MACHINE
//找到Software/Microsoft/Windows/CurrentVersion/Run
if OpenKey('Software/Microsoft/Windows
/CurrentVersion/Run',True) then
//写入自己程序的快捷方式信息
begin
WriteString( strPrompt, strExeFileName );
result := true;
end
else result := false;
//善后处理
CloseKey;
Free;
end;
end;

{调用StartUpMyProgram,
使Delphi随WINDOWS启动而自动运行 }
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.lines.add('开始');
if StartUpMyProgram('delphi','C:/Program
Files/borland/delphi3/bin/delphi32.exe') then
memo1.lines.add('成功')
else
memo1.lines.add('失败')
end;

---- 应 用 之 二: 实 现 文 件 关 联

---- 当MS WORD 安 装 在 你 的 系 统 中 时, 它 会 把.DOC 文 件 与 自 己 关 联, 当 你 双 击 一
个DOC 文 件, 就 会 启 动MS WORD, 打 开 你 指 定 的DOC 文 件。 你 也 可 以 把 一 个 文 件 类 型
与 一 个 程 序 关 联 起 来, 其 秘 密 还 是 在 注 册 表 中。 如 果 打 开 注 册 表, 找
到HKEY_CLASSES_ROOT, 就 会 发 现 这 里 已 经 有 很 多 文 件 类 型。

---- 你 也 可 以 在 这 里 增 加 一 个 键, 建 立 自 己 的 文 件 关 联。

---- 建 立 文 件 关 联, 一 般 应 有 两 个 步 骤:

---- ( 1) 根 据 文 件 类 型 的 扩 展 名, 指 定 对 应 的 键 名( 如doc 文 件 对 应 的 键
为doc_auto_file)

---- 该 键 及 其 子 键 的 值, 将 定 义 该 类 型 的 文 件 的 类 型 说 明 和 操 作( 如 打 开、 编 辑)
说 明

---- ( 2) 在 指 定 的 键 名 下, 建 立 子 键, 指 明 文 件 类 型 说 明 和 操 作 对 应 的 程 序 信


---- 例 如, 我 们 可 以 为.DBF 文 件 建 立 文 件 关 联, 其 文 件 类 型 说 明 为 "xBase 数 据
表 ", 使 其 打 开(Open) 文 件 的 操 作 对 应 程 序C:/Program
Files/Borland/DBD/DBD32.EXE。 首 先, 应 在 注 册 表 的 根 键HKEY_CLASSES_ROOT 下
建 立 一 个 键, 键 名 为.DBF, 默 认 值 为DBF_Auto_File, 表 示DBF 类 型 文 件 的 关 联 操 作
信 息 记 录 在 键HKEY_CLASSES_ROOT/DBF_Auto_File 下; 然 后, 建 立
键HKEY_CLASSES_ROOT/DBF_Auto_File, 并 设 其 默 认 值 为 "xBase 数 据 表 ", 表 示
文 件 类 型 说 明; 再 建 立 键
HKEY_CLASSES_ROOT/DBF_Auto_File/Shell/open/command, 设 置 其 默 认 值 为
C:/Program Files/Borland/DBD/DBD32.EXE  %1( 其 中 "%1 " 为 命 令 行 参 数),
表 示 打 开 操 作 对 应 的 程 序 信 息。

---- 具 体 实 现 如 下: 同 样, 在Uses 中 加 上Registry 单 元,   然 后, 写 下 面 代 码。

{将文件类型strFileExtension与程序
strExeFileName相关联,strDiscription为文件类型说明 }
function AssignToProgram(strFileExtension,
strDiscription,strExeFileName : string ) : boolean;
var
registerTemp : TRegistry;
begin
registerTemp := TRegistry.Create;
//建立一个Registry实例
with registerTemp do
begin
RootKey:=HKEY_CLASSES_ROOT;
//设置根键值为HKEY_CLASSES_ROOT

//根据文件类型的扩展名,创建或打开对应的键名
.FileExt,如DBF对应'.DBF'
if OpenKey( '.' + strFileExtension, true ) then
begin
result := false;
exit;
end;
//设置键.FileExt默认值为FileExt_Auto_File,
如'.DBF'对应'DBF_Auto_File'
WriteString('',strFileExtension + '_Auto_File');
CloseKey;

//写入自己程序的信息
//根据文件类型的扩展名,创建或打开对应的键名
FileExt_Auto_File
//'.DBF'对应'DBF_Auto_File'
if OpenKey(strFileExtension + '_Auto_File', true ) then
begin
result := false;
exit;
end;
//设置默认值文件类型说明,如DBF可对应'xBase数据表'
WriteString('',strDiscription);
CloseKey;

//创建或打开键名FileExt_Auto_File
/Shell/open/command,该键为表示操作为'打开'
//'.DBF'对应'DBF_Auto_File/shell/open/command'
if OpenKey(strFileExtension + '_Auto_File
/shell/open/command', true ) then
begin
result := false;
exit;
end;
//设置该键的默认值为打开操作对应的程序信息
//如DBF可对应'C:/Program Files/Borland/DBD/DBD32.EXE'
WriteString('',strExeFileName + ' %1');
CloseKey;

Free;
end;
end;

{调用AssignToProgram,使DBF文件与DBD32.EXE关联 }
procedure TForm1.Button3Click(Sender: TObject);
begin
memo1.lines.add('开始');
if AssignToProgram('DBF','xBase数据表'
,'C:/Program Files/borland/dbd/dbd32.exe') then
memo1.lines.add('成功')
else
memo1.lines.add('失败')
end;

---- 应 用 之 三: 检 测Win95/98/NT 系 统 中 是 否 安 装 了Borland Database Engine

---- 当 你 的 应 用 程 序 是 一 个 基 于BDE 的 数 据 库 应 用 程 序 时, 如 果 运 行 在 一 个 没 有
安 装BDE 的Win95/98/NT 中, 会 出 现 让 用 户 迷 惑 不 解 的 错 误。 你 可 能 需 要 在 程 序 正
常 运 行 之 前, 检 查 系 统 中 是 否 安 装 了BDE。 由 于 BDE 安 装 后 会 在 注 册 表 进 行 注 册,
你 可 以 通 过 查 询 注 册 表 来 确 定 系 统 中 是 否 安 装 了BDE, 然 后 决 定 下 一 步 采 取 什 么
行 动。BDE 在 注 册 表 中 的 位 置
为:HKEY_LOCAL_MACHINE/Software/Borland/Database Engine, 该 键 存 在 说
明BDE 已 经 安 装。

---- 具 体 的 例 子 如 下。

---- 同 样, 在Uses 中 加 上Registry 单 元

---- 然 后, 写 下 面 代 码。

{检测系统中是否安装了BDE }
function IsBDEInstalled : boolean;
var
registerTemp : TRegistry;
begin
registerTemp := TRegistry.Create;
//建立一个Registry实例
with registerTemp do
begin
RootKey:=HKEY_LOCAL_MACHINE;
//设置根键值为HKEY_LOCAL_MACHINE
//查询Software/Borland/Database Engine
result := OpenKey('Software/Borland
/Database Engine',false);

//善后处理
CloseKey;
Free;
end;
end;

{调用IsBDEInstalled,检测系统中是否安装了BDE }
procedure TForm1.Button4Click(Sender: TObject);
begin
memo1.lines.add('开始');
if IsBDEInstalled then
memo1.lines.add('已安装了BDE')
else
memo1.lines.add('未安装BDE')
end;

---- 应 用 之 四: 在 桌 面 建 立 程 序 的 快 捷 方 式

---- 当 你 的WIN95/98/NT 桌 面 上 整 齐 地 排 列 着 各 种 程 序 的 快 捷 方 式 时, 也 许 你 会
体 会 到 快 捷 方 式 的 方 便。 你 也 可 将 自 己 设 计 的 程 序 的 快 捷 方 式 放 在 别 人 的 桌 面
上。

---- 桌 面 上 的 一 个 快 捷 方 式, 对 应Windows 目 录 下Destop 子 目 录 中 的 一
个ShellLink 文 件(.LNK), 你 只 要 在 这 个 目 录 下 增 加 一 个.LNK 文 件 就 可 以 了。

---- 我 们 的 任 务, 主 要 是 利 用TRegistry 从 注 册 表 中 获 取Desktop 的 实 际 路 径, 默
认 为Windows 目 录 下 的Desktop 子 目 录, 如C:/PWIN98/Desktop。 在 注 册 表
中Desktop 的 实 际 路 径 对 应 的 键 为HKEY_CURRENT_USER /Software /MicroSoft
/Windows /CurrentVersion /Explorer /Shell Folders /Desktop。

---- 同 样, 在Uses 中 加 上Registry 单 元

---- 然 后, 写 下 面 代 码。

{为程序strExeFileName在桌面建立快捷方式,
运行参数为strParameters }
function CreateShortcutOnDesktop
( strExeFileName, strParameters : string ) : boolean;
var
registerTemp : TRegistry;
strDesktopDirectory : widestring;
shelllinkTemp : IShellLink;
persistfileTemp : IPersistFile;
begin
registerTemp := TRegistry.Create;
//建立一个Registry实例
with registerTemp do
begin
RootKey:=HKEY_CURRENT_USER;
//设置根键值为HKEY_CURRENT_USER
//找到Software/MicroSoft/Windows/
CurrentVersion/Explorer/Shell Folders
if not OpenKey('Software/MicroSoft/Windows/
CurrentVersion/Explorer/Shell Folders',True) then
//写入自己程序的信息
begin
result := false;
exit;
end;
//读取项目Desktop的值,即Desktop的实际路径
strDesktopDirectory := ReadString('Desktop');

//善后处理
CloseKey;
Free;
end;

//设置快捷方式的参数
shelllinkTemp := IShellLink( CreateComObject(CLSID_ShellLink));
with shelllinkTemp do
begin
SetPath( PChar( strExeFileName ) );
//设置程序文件全名
SetArguments( PChar( strParameters) );
//设置程序的命令行参数
//设置程序的工作目录
SetWorkingDirectory( Pchar
( ExtractFilePath( strExeFileName ) ) );
end;

//构造快捷方式的文件名(.LNK)
strDesktopDirectory := strDesktopDirectory + '/' +
ExtractFileName( strExeFileName );
strDesktopDirectory := copy( strDesktopDirectory,
1, length( strDesktopDirectory ) -
length( ExtractFileExt( strExeFileName ) ) )
+ '.LNK';
//保存快捷方式的文件
persistfileTemp := shelllinkTemp as IPersistFile;
if S_OK = persistfileTemp.Save( PWChar
( strDesktopDirectory ) , false ) then
result := true //保存成功,返回True
else result := false;
end;

{调用CreateShortcutOnDesktop,为Delphi在桌面上建立快捷方式 }
procedure TForm1.Button2Click(Sender: TObject);
begin
memo1.lines.add('开始');
if CreateShortcutOnDesktop('C:/Program
Files/borland/delphi3/bin/delphi32.exe','%1') then
memo1.lines.add('成功')
else
memo1.lines.add('失败')
end;

---- 上 面 几 个 应 用 只 是TRegistry 一 些 简 单 的 应 用, 有 了 这 些 知 识, 你 就 可 以 根
据 自 己 的 需 要 来 定 制 和 改 善Winodws 系 统 了。

---- 以 上 程 序 在PWin98+Delphi3.0 下 调 试 和 通 过

来自: iamfly, 时间: 2001-11-15 21:56:00, ID: 732750
ecc,看了你的资料,你来DFW应该也时间不短了吧?可是,你问的这个问题就。。。
先不说3吧,搜索一下以前的,没有一百也有五十的了,
1、2,简单点是在注册表中做文章,难点的就用到COM,一个SHELL的扩展就OK了,
如果你有<<DELPHI5开发人员指南>>的话,照例子做做也就清楚了。这就200分了,多不
值。。。
看来,你是太懒了,不想去SEARCH一下:)

来自: ecc, 时间: 2001-12-30 18:04:00, ID: 824896
接受答案了.

得分大富翁: jdshoot
 
to weiliu:发给我的那些我都看过了,我举个例子来说明我的问题,加入压缩后的文件是.aaa 在注册表中的默认值为aaaFile,如果我想在压缩后的文件右键里面添加上“解压”菜单项只需要在注册表的HKEY_CLASSES_ROOT/aaaFile/shellex/contextmenuhandlers加上我注册的ID就可以了,但是反过来我想在非压缩文件的右键里面添加上“压缩”菜单项而又不在压缩文件的右键里面显示该怎么做呢,不可能是在每个类型文件下都加上注册的ID吧,所以请帮忙指点一下
 
怎么没有人来答啊,高手来看一下啊,分不够可以提出来啊,大家来顶一下,我自己先顶
 
多人接受答案了。
 
后退
顶部