想编个类似winzip那样与windows结合的很好的程序。(300分)

  • 主题发起人 主题发起人 ecc
  • 开始时间 开始时间
E

ecc

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:[:)]<br>&nbsp; 我现在想编制类似winzip应用程序(支持9x,nt,2000),但不是做压缩程序呦。^O^<br>要满足以下几点要求:<br>&nbsp; 1.本程序关联特定后缀的文件,并且对不同后缀名的文件进行不同的处理。<br>这一点我知道需要修改注册表增加文件关联,并且支持文件运行参数。<br>&nbsp; 2.在我的电脑或资源管理器中右键点击任意文件或文件夹在弹出菜单中增加<br>我的程序的一个功能。例如winzip一样,右键点击有Add to Zip 一项。这时并<br>没有我的程序在运行。<br>&nbsp; 3.支持程序运行时最小化到右下角的状态栏中,象新版的foxmail一样。<br>希望各位大虾给提点建议和提示,多谢!
 
旧资料中的答案完全满足你的要求[:D]
 
2,DFW的第一篇帖子就是讨论这个的:<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=20<br><br>3:在网上随便拖个控件,比如TCoolTrayIcon,自己写也不难,记得程序员大本营有讲这个的文章.:<br>http://www.csdn.net/dev/delphi/
 
还没有令我满意的回答!
 
自己找啊!太懒!
 
用300分换这点工作量而已。呵呵
 
1,2.需要做外壳扩展,就是自己写一个dll做com服务器。你想实现上下文菜单,就要在这个<br>&nbsp; &nbsp; 服务器中实现IContextMenu和IShellExtInit接口,在注册表中注册这个服务器,并与<br>&nbsp; &nbsp; 你需要处理的文件扩展名关联。当你在我的电脑或资源管理器中的相关文件上点鼠标右<br>&nbsp; &nbsp; 键时,系统外壳就会装载你的com服务器,并调用接口中的方法请求服务,你这时就可<br>&nbsp; &nbsp; 以根据系统传进来的文件名确定添加哪些菜单项和子菜单(比如add to...)以及进行<br>&nbsp; &nbsp; 相应的操作了。<br>3. &nbsp;只要用Shell_NotifyIcon处理托盘图标,并且使程序最小化时不在任务栏上显示(可以<br>&nbsp; &nbsp; 用ShowWindow函数),再处理一下托盘图标发回来的消息就行了。<br>具体内容可以参看《Delphi5开发人员指南》和Delphi的帮助。<br>《Delphi5开发人员指南》中的例子太长了,就不抄了,想要就留E-mail吧。<br>其实,dfw的资料下载站就有书下。<br>
 
你自己找一下获得的收获会比别人给你的多得多,要是这点都懒,怎么学得到东西呢?
 
多谢jdshoot!<br>我的电子邮件<br>ecc@cmmail.com
 
邮件已发出,请查收。
 
邮件已收到,多谢!
 
kindly,<br>对不起我不是简单的程序员,我还有其他工作要做!
 
以前有篇文章,你看看。<br><br>---- 在Delphi3.0 及 以 上 版 本 中, 提 供 了 一 个 构 件TRegistry。 在 程 序 中 可 以 利 用 <br>它 来 实 现 对WIN95/98/NT 注 册 表 的 操 作, 可 以 很 方 便 地 在 注 册 表 中 增 加、 修 改 和 删 <br>除 键 值。 这 样 可 以 在 程 序 中 完 成 一 些 特 殊 的 功 能。 <br><br>---- TRegistry 常 用 的 属 性 和 方 法 有( 具 体 作 用 和 用 法 请 参 考Delphi 帮 助): <br><br>RootKey、CreateKey、OpenKey、<br>CloseKey、DeleteKey、ReadXXXX、WriteXXXX<br>(XXXX表示数据类型如String、Integer等)<br><br>---- 我 们 用 到 的 属 性 和 方 法 有: <br><br>RootKey:注册表的根键名( 如HKEY_LOCAL_MACHINE等)<br>OpenKey( KeyName:string; CanCreate:boolean ):<br><br>---- 使 当 前 键 为KeyName,CanCreate 表 示 当 指 定 的 键 不 存 在 时 是 否 创 建,True 表 <br>示 创 建 <br><br>SetKey( KeyName,KeyValue : string ):<br>使键KeyName的值为KeyValue<br><br>---- 应 用 之 一: 让 自 己 的 程 序 随WIN95/98/NT 的 启 动 而 运 行 <br><br>---- 当 然, 你 可 以 在 " 启 动 " 程 序 组 中 加 入 程 序 的 快 捷 方 式, 但 这 样 做 好 象 不 大 <br>明 智, 因 为 大 多 数 程 序 在 安 装 时 不 会 这 样 做, 而 是 在 通 过 在 注 册 表 增 加 键 值, <br>让WIN95/98/NT 在 启 动 时 运 行 自 己 的 程 序。 如 果 打 开 注 册 表, 找 <br>到HKEY_LOCAL_MACHINE /Software /Microsoft /Windows /CurrentVersion <br>/Run, 就 会 发 现 这 个 秘 密 了, 原 来 许 多 自 动 运 行 的 程 序 都 在 这 里。 你 也 可 以 在 这 <br>里 增 加 一 个 键, 让 你 的 程 序 也 随 着 WIN95/98/NT 的 启 动 而 自 己 运 行, 成 为WINDOWS <br>下 的TSR 程 序。 实 现 方 法 如 下: <br><br>---- 首 先, 在Uses 中 加 上Registry 单 元 <br><br>---- 然 后, 写 下 面 代 码。 <br><br>{将程序strExeFileName置为自动启动 }<br>function StartUpMyProgram<br>( strPrompt,strExeFileName : string ) : boolean;<br>var<br>registerTemp : TRegistry;<br>begin<br>registerTemp := TRegistry.Create;<br>//建立一个Registry实例<br>with registerTemp do<br>begin<br>RootKey:=HKEY_LOCAL_MACHINE;<br>//设置根键值为HKEY_LOCAL_MACHINE<br>//找到Software/Microsoft/Windows/CurrentVersion/Run<br>if OpenKey('Software/Microsoft/Windows<br>/CurrentVersion/Run',True) then<br>//写入自己程序的快捷方式信息<br>begin<br>WriteString( strPrompt, strExeFileName );<br>result := true;<br>end<br>else result := false;<br>//善后处理<br>CloseKey;<br>Free;<br>end;<br>end;<br><br>{调用StartUpMyProgram,<br>使Delphi随WINDOWS启动而自动运行 }<br>procedure TForm1.Button1Click(Sender: TObject);<br>begin<br>memo1.lines.add('开始');<br>if StartUpMyProgram('delphi','C:/Program <br>Files/borland/delphi3/bin/delphi32.exe') then<br>memo1.lines.add('成功')<br>else<br>memo1.lines.add('失败')<br>end;<br><br>---- 应 用 之 二: 实 现 文 件 关 联 <br><br>---- 当MS WORD 安 装 在 你 的 系 统 中 时, 它 会 把.DOC 文 件 与 自 己 关 联, 当 你 双 击 一 <br>个DOC 文 件, 就 会 启 动MS WORD, 打 开 你 指 定 的DOC 文 件。 你 也 可 以 把 一 个 文 件 类 型 <br>与 一 个 程 序 关 联 起 来, 其 秘 密 还 是 在 注 册 表 中。 如 果 打 开 注 册 表, 找 <br>到HKEY_CLASSES_ROOT, 就 会 发 现 这 里 已 经 有 很 多 文 件 类 型。 <br><br>---- 你 也 可 以 在 这 里 增 加 一 个 键, 建 立 自 己 的 文 件 关 联。 <br><br>---- 建 立 文 件 关 联, 一 般 应 有 两 个 步 骤: <br><br>---- ( 1) 根 据 文 件 类 型 的 扩 展 名, 指 定 对 应 的 键 名( 如doc 文 件 对 应 的 键 <br>为doc_auto_file) <br><br>---- 该 键 及 其 子 键 的 值, 将 定 义 该 类 型 的 文 件 的 类 型 说 明 和 操 作( 如 打 开、 编 辑) <br>说 明 <br><br>---- ( 2) 在 指 定 的 键 名 下, 建 立 子 键, 指 明 文 件 类 型 说 明 和 操 作 对 应 的 程 序 信 <br>息 <br><br>---- 例 如, 我 们 可 以 为.DBF 文 件 建 立 文 件 关 联, 其 文 件 类 型 说 明 为 "xBase 数 据 <br>表 ", 使 其 打 开(Open) 文 件 的 操 作 对 应 程 序C:/Program <br>Files/Borland/DBD/DBD32.EXE。 首 先, 应 在 注 册 表 的 根 键HKEY_CLASSES_ROOT 下 <br>建 立 一 个 键, 键 名 为.DBF, 默 认 值 为DBF_Auto_File, 表 示DBF 类 型 文 件 的 关 联 操 作 <br>信 息 记 录 在 键HKEY_CLASSES_ROOT/DBF_Auto_File 下; 然 后, 建 立 <br>键HKEY_CLASSES_ROOT/DBF_Auto_File, 并 设 其 默 认 值 为 "xBase 数 据 表 ", 表 示 <br>文 件 类 型 说 明; 再 建 立 键 <br>HKEY_CLASSES_ROOT/DBF_Auto_File/Shell/open/command, 设 置 其 默 认 值 为 <br>C:/Program Files/Borland/DBD/DBD32.EXE  %1( 其 中 "%1 " 为 命 令 行 参 数), <br>表 示 打 开 操 作 对 应 的 程 序 信 息。 <br><br>---- 具 体 实 现 如 下: 同 样, 在Uses 中 加 上Registry 单 元,   然 后, 写 下 面 代 码。 <br><br>{将文件类型strFileExtension与程序<br>strExeFileName相关联,strDiscription为文件类型说明 }<br>function AssignToProgram(strFileExtension,<br>strDiscription,strExeFileName : string ) : boolean;<br>var<br>registerTemp : TRegistry;<br>begin<br>registerTemp := TRegistry.Create;<br>//建立一个Registry实例<br>with registerTemp do<br>begin<br>RootKey:=HKEY_CLASSES_ROOT;<br>//设置根键值为HKEY_CLASSES_ROOT<br><br>//根据文件类型的扩展名,创建或打开对应的键名<br>.FileExt,如DBF对应'.DBF'<br>if OpenKey( '.' + strFileExtension, true ) then<br>begin<br>result := false;<br>exit;<br>end;<br>//设置键.FileExt默认值为FileExt_Auto_File,<br>如'.DBF'对应'DBF_Auto_File'<br>WriteString('',strFileExtension + '_Auto_File');<br>CloseKey;<br><br>//写入自己程序的信息<br>//根据文件类型的扩展名,创建或打开对应的键名<br>FileExt_Auto_File<br>//'.DBF'对应'DBF_Auto_File'<br>if OpenKey(strFileExtension + '_Auto_File', true ) then<br>begin<br>result := false;<br>exit;<br>end;<br>//设置默认值文件类型说明,如DBF可对应'xBase数据表'<br>WriteString('',strDiscription);<br>CloseKey;<br><br>//创建或打开键名FileExt_Auto_File<br>/Shell/open/command,该键为表示操作为'打开'<br>//'.DBF'对应'DBF_Auto_File/shell/open/command'<br>if OpenKey(strFileExtension + '_Auto_File<br>/shell/open/command', true ) then<br>begin<br>result := false;<br>exit;<br>end;<br>//设置该键的默认值为打开操作对应的程序信息<br>//如DBF可对应'C:/Program Files/Borland/DBD/DBD32.EXE'<br>WriteString('',strExeFileName + ' %1');<br>CloseKey;<br><br>Free;<br>end;<br>end;<br><br>{调用AssignToProgram,使DBF文件与DBD32.EXE关联 }<br>procedure TForm1.Button3Click(Sender: TObject);<br>begin<br>memo1.lines.add('开始');<br>if AssignToProgram('DBF','xBase数据表'<br>,'C:/Program Files/borland/dbd/dbd32.exe') then<br>memo1.lines.add('成功')<br>else<br>memo1.lines.add('失败')<br>end;<br><br>---- 应 用 之 三: 检 测Win95/98/NT 系 统 中 是 否 安 装 了Borland Database Engine <br><br>---- 当 你 的 应 用 程 序 是 一 个 基 于BDE 的 数 据 库 应 用 程 序 时, 如 果 运 行 在 一 个 没 有 <br>安 装BDE 的Win95/98/NT 中, 会 出 现 让 用 户 迷 惑 不 解 的 错 误。 你 可 能 需 要 在 程 序 正 <br>常 运 行 之 前, 检 查 系 统 中 是 否 安 装 了BDE。 由 于 BDE 安 装 后 会 在 注 册 表 进 行 注 册, <br>你 可 以 通 过 查 询 注 册 表 来 确 定 系 统 中 是 否 安 装 了BDE, 然 后 决 定 下 一 步 采 取 什 么 <br>行 动。BDE 在 注 册 表 中 的 位 置 <br>为:HKEY_LOCAL_MACHINE/Software/Borland/Database Engine, 该 键 存 在 说 <br>明BDE 已 经 安 装。 <br><br>---- 具 体 的 例 子 如 下。 <br><br>---- 同 样, 在Uses 中 加 上Registry 单 元 <br><br>---- 然 后, 写 下 面 代 码。 <br><br>{检测系统中是否安装了BDE }<br>function IsBDEInstalled : boolean;<br>var<br>registerTemp : TRegistry;<br>begin<br>registerTemp := TRegistry.Create;<br>//建立一个Registry实例<br>with registerTemp do<br>begin<br>RootKey:=HKEY_LOCAL_MACHINE;<br>//设置根键值为HKEY_LOCAL_MACHINE<br>//查询Software/Borland/Database Engine<br>result := OpenKey('Software/Borland<br>/Database Engine',false);<br><br>//善后处理<br>CloseKey;<br>Free;<br>end;<br>end;<br><br>{调用IsBDEInstalled,检测系统中是否安装了BDE }<br>procedure TForm1.Button4Click(Sender: TObject);<br>begin<br>memo1.lines.add('开始');<br>if IsBDEInstalled then<br>memo1.lines.add('已安装了BDE')<br>else<br>memo1.lines.add('未安装BDE')<br>end;<br><br>---- 应 用 之 四: 在 桌 面 建 立 程 序 的 快 捷 方 式 <br><br>---- 当 你 的WIN95/98/NT 桌 面 上 整 齐 地 排 列 着 各 种 程 序 的 快 捷 方 式 时, 也 许 你 会 <br>体 会 到 快 捷 方 式 的 方 便。 你 也 可 将 自 己 设 计 的 程 序 的 快 捷 方 式 放 在 别 人 的 桌 面 <br>上。 <br><br>---- 桌 面 上 的 一 个 快 捷 方 式, 对 应Windows 目 录 下Destop 子 目 录 中 的 一 <br>个ShellLink 文 件(.LNK), 你 只 要 在 这 个 目 录 下 增 加 一 个.LNK 文 件 就 可 以 了。 <br><br>---- 我 们 的 任 务, 主 要 是 利 用TRegistry 从 注 册 表 中 获 取Desktop 的 实 际 路 径, 默 <br>认 为Windows 目 录 下 的Desktop 子 目 录, 如C:/PWIN98/Desktop。 在 注 册 表 <br>中Desktop 的 实 际 路 径 对 应 的 键 为HKEY_CURRENT_USER /Software /MicroSoft <br>/Windows /CurrentVersion /Explorer /Shell Folders /Desktop。 <br><br>---- 同 样, 在Uses 中 加 上Registry 单 元 <br><br>---- 然 后, 写 下 面 代 码。 <br><br>{为程序strExeFileName在桌面建立快捷方式,<br>运行参数为strParameters }<br>function CreateShortcutOnDesktop<br>( strExeFileName, strParameters : string ) : boolean;<br>var<br>registerTemp : TRegistry;<br>strDesktopDirectory : widestring;<br>shelllinkTemp : IShellLink;<br>persistfileTemp : IPersistFile;<br>begin<br>registerTemp := TRegistry.Create;<br>//建立一个Registry实例<br>with registerTemp do<br>begin<br>RootKey:=HKEY_CURRENT_USER;<br>//设置根键值为HKEY_CURRENT_USER<br>//找到Software/MicroSoft/Windows/<br>CurrentVersion/Explorer/Shell Folders<br>if not OpenKey('Software/MicroSoft/Windows/<br>CurrentVersion/Explorer/Shell Folders',True) then<br>//写入自己程序的信息<br>begin<br>result := false;<br>exit;<br>end;<br>//读取项目Desktop的值,即Desktop的实际路径<br>strDesktopDirectory := ReadString('Desktop');<br><br>//善后处理<br>CloseKey;<br>Free;<br>end;<br><br>//设置快捷方式的参数<br>shelllinkTemp := IShellLink( CreateComObject(CLSID_ShellLink));<br>with shelllinkTemp do<br>begin<br>SetPath( PChar( strExeFileName ) );<br>//设置程序文件全名<br>SetArguments( PChar( strParameters) );<br>//设置程序的命令行参数<br>//设置程序的工作目录 <br>SetWorkingDirectory( Pchar<br>( ExtractFilePath( strExeFileName ) ) );<br>end;<br><br>//构造快捷方式的文件名(.LNK)<br>strDesktopDirectory := strDesktopDirectory + '/' +<br>ExtractFileName( strExeFileName );<br>strDesktopDirectory := copy( strDesktopDirectory,<br>1, length( strDesktopDirectory ) -<br>length( ExtractFileExt( strExeFileName ) ) )<br>+ '.LNK';<br>//保存快捷方式的文件<br>persistfileTemp := shelllinkTemp as IPersistFile;<br>if S_OK = persistfileTemp.Save( PWChar<br>( strDesktopDirectory ) , false ) then<br>result := true //保存成功,返回True<br>else result := false;<br>end;<br><br>{调用CreateShortcutOnDesktop,为Delphi在桌面上建立快捷方式 }<br>procedure TForm1.Button2Click(Sender: TObject);<br>begin<br>memo1.lines.add('开始');<br>if CreateShortcutOnDesktop('C:/Program <br>Files/borland/delphi3/bin/delphi32.exe','%1') then<br>memo1.lines.add('成功')<br>else<br>memo1.lines.add('失败')<br>end;<br><br>---- 上 面 几 个 应 用 只 是TRegistry 一 些 简 单 的 应 用, 有 了 这 些 知 识, 你 就 可 以 根 <br>据 自 己 的 需 要 来 定 制 和 改 善Winodws 系 统 了。 <br><br>---- 以 上 程 序 在PWin98+Delphi3.0 下 调 试 和 通 过<br>
 
ecc,看了你的资料,你来DFW应该也时间不短了吧?可是,你问的这个问题就。。。<br>先不说3吧,搜索一下以前的,没有一百也有五十的了,<br>1、2,简单点是在注册表中做文章,难点的就用到COM,一个SHELL的扩展就OK了,<br>如果你有&lt;&lt;DELPHI5开发人员指南&gt;&gt;的话,照例子做做也就清楚了。这就200分了,多不<br>值。。。<br>看来,你是太懒了,不想去SEARCH一下:)
 

Similar threads

D
回复
0
查看
824
DelphiTeacher的专栏
D
D
回复
0
查看
830
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部