摘要: (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~) 执行 许多人都知道 ShellExecute ,用于执行一个外部命令。但对于 IShellFoloder 对象来说,它的执行命令,都在它的 ContextMenu 里面了。记得前几节说过如何直接调用 ContextMenu 里的项,因此,执行一个 IShellFoloder,也无非是调用它的 ContextMenu 里默认的项而已://存放 PIDL 的数组 IntPtr[] pidls = new IntPtr[1]; pidls[0] = pidl; //得到 IContextMenu 接口 IntPtr iConte 阅读全文
posted @ 2010-06-23 23:48 Max Woods 阅读(450) 评论(0) 推荐(0) 编辑
摘要: (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~) 有关 PIDL PIDL亦有“绝对路径”与“相对路径”的概念。表示“相对路径”的PIDL(本文简称为“相对PIDL”)只有一个ITEMIDLIST结构的元素,用于标识相对于父文件夹的“路径”;表示“绝对路径”的PIDL(简称为“绝对PIDL”)有若干个ITEMIDLIST结构的元素,第一个元素表示外壳名字空间根文件夹(“桌面”)下的某一子文件夹A,第二个元素则表示文件夹A下的某一子文件夹B,其余依此类推。这样绝对PIDL就通过保存一条从“桌面”下的直接子文件夹或文件的绝对PIDL与相对PIDL是相同的,而其他的文件夹或文件的相 阅读全文
posted @ 2010-06-23 23:47 Max Woods 阅读(621) 评论(1) 推荐(0) 编辑
摘要: (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~) 上一节说到如何弹出 IShellFolder 的上下文菜单,也就是 IContextMenu。有时候我们需要在这个菜单上面,加入一些属于自己的菜单项。举个例子,你打开资源管理器,查看左边目录树的右键菜单,会发现顶层多了一个折叠/展开的菜单项。好,我们也动手来加入这个菜单项。 修改例子3,我们找到 QueryContextMenu 处,这时候提供了一个菜单句柄://提供一个弹出式菜单的句柄 IntPtr contextMenu = API.CreatePopupMenu(); iContextMenu.QueryContextM 阅读全文
posted @ 2010-06-23 23:46 Max Woods 阅读(605) 评论(0) 推荐(0) 编辑
摘要: (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~) 这里解释上一节中获取名称的方法 GetDisplayNameOf 定义:void GetDisplayNameOf( IntPtr pidl, SHGNO uFlags, IntPtr lpName);该方法是用来转换PIDL成为可显示的名称字符串。PIDL必须是相对于对象的父目录的。换句话说,它必须包含一个非空的SHITEMID 结构。因为有多种命名对象的方式,资源管理器通过在uFlags参数中定义SHGNO标识的组合来表示名称类型。SHGDN_NORMAL或SHGDN_INFOLDER将被用来指定名称是相对于文件夹的 阅读全文
posted @ 2010-06-23 23:44 Max Woods 阅读(851) 评论(0) 推荐(0) 编辑
摘要: (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~) 让我们详细解释一下 Shell 编程中最基本的一些函数、结构体和枚举。 SHGetDesktopFolder 获取桌面的 IShellFolder 接口[DllImport("shell32.dll")] public static extern Int32 SHGetDesktopFolder(out IntPtr ppshf);要使用这个函数,必须先定义一个 IntPtr 指针。然后通过指针,使用 GetObjectForIUnknown 返回通过指向 COM 对象的 IShellFolder 接口的指针实例。于是需要编 阅读全文
posted @ 2010-06-23 23:43 Max Woods 阅读(772) 评论(0) 推荐(0) 编辑
摘要: (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~)从本节起,我所要讲述的是对 Windows 系统的“Shell 扩展”。“Shell 扩展”从字面上分两个部分:Shell 与 Extension。Shell 指 Windows Explorer,而Extension 则指由你编写的当某一预先约定好的事件(如在以. doc 为后缀的文件图标上单击右键)发生时由 Explorer 调用执行的代码。因此一个“Shell 扩展”就是一个为 Explorer 添加功能的 COM 对象。 “Shell 扩展”有很多种类型,每种类型都在各自不同的事件发生时被调用运行,但也有一些扩展的类型和 阅读全文
posted @ 2010-06-23 23:42 Max Woods 阅读(3922) 评论(1) 推荐(2) 编辑
摘要: (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~)关于注册动态库必须注册才能使用。除了使用 regasm 来注册 DLL 以外,还应该在代码中增加 RegisterServer 和 UnregisterServer 方法,以指导 DLL 注册时,在 Windows 注册表中增加什么键。关于具体键以下做简单说明:1) 注册 DLL 的 Shell Extensions。具体位置是 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved,增加以 GUID 为名称的键 阅读全文
posted @ 2010-06-23 23:41 Max Woods 阅读(785) 评论(0) 推荐(0) 编辑
摘要: (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~)QueryInfo扩展 活动桌面引入一项新特性,当你在某些特定对象上旋停鼠标时,工具提示将显示它们的描述。我们可以使用 QueryInfo 扩展为Shell中的其它对象提供自定义的工具提示。如下图: 事实上,这个功能实现比前两个 Shell 扩展更简单,它仅仅是实现 IQueryInfo 接口:IQueryInfo 接口定义 [ComImport(), ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), GuidAttribute("00 阅读全文
posted @ 2010-06-23 23:40 Max Woods 阅读(548) 评论(0) 推荐(0) 编辑
摘要: (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢~) Windows Shell 编程,即 Windows 外壳编程。我们所看到的资源管理器以及整个桌面,都是一个 Shell。 关于 Windows 外壳的基本概念,我这里不做详细介绍,不了解的朋友,可以看看 姜伟华 的 Windows外壳名字空间的浏览。 好,现在让我们从基础学起,早日做出一个强大的资源管理器软件。(偶也是初学者,多多指教)1 - 基础,浏览一个文件夹我们知道,在win32中是以外壳名字空间的形式来组织文件系统的,在外壳名字空间里的每一个对象(注)都实现了一个IShellFolder的接口,通过这个接口我们可以直 阅读全文
posted @ 2010-06-23 23:38 Max Woods 阅读(672) 评论(0) 推荐(0) 编辑
摘要: function FormatDateTime(const Format: string; DateTime: TDateTime): string; Format参数是一个格式化字符串。DateTime是时间类型。返回值是一种格式化后的字符串,重点来看Format参数中的指令字符c以短时间格式显示时间,即全部是数字的表示 FormatdateTime('c',now); 输出为:2004-8-7 9:55:40 d 对应于时间中的日期,日期是一位则显示一位,两位则显示两位 FormatdateTime('d',now); 输出可能为1~31 dd 和d的意义一样,但它始终是以两位来显示的 F 阅读全文
posted @ 2010-06-23 18:48 Max Woods 阅读(3151) 评论(1) 推荐(0) 编辑
摘要: 1、2k以后的操作系统可使用 ntdll.dll中的隐式函数 Windows NT/2000中获取CPU使用率的方法与Windows 9x系统中所使用的方法不同,Windows NT/2000中获取CPU使用率不用"性能计数器"。而是使用一个NTDLL.DLL中未公开的API函数--NtQuerySystemInformation。它的使用方法参见另外一篇文章:《Windows NT/2000系统中如何获取系统的启动时间》。 为了计算Windows NT/2000系统中CPU的使用率,我们使用下面的公式: CpuUsageInPercent = 100 - (CpuTimen - CpuTim 阅读全文
posted @ 2010-06-23 18:29 Max Woods 阅读(1567) 评论(0) 推荐(0) 编辑
摘要: 一般时控函数   vc程序员都会利用windows的wm—timer消息映射来进行简单的时间控制:1.调用函数settimer()设置定时间隔,如settimer(0,200,null)即为设置200毫秒的时间间隔;2.在应用程序中增加定时响应函数ontimer(),并在该函数中添加响应的处理语句,用来完成时间到时的操作。这种定时方法是非常简单的,但其定时功能如同sleep()函数的延时功能一样,精度较低,只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况,而在精度要求较高的条件下,这种方法应避免采用。精度时控函数   在要求误差不大于1毫秒的情况下,可以采用gettickcount( 阅读全文
posted @ 2010-06-23 16:15 Max Woods 阅读(1472) 评论(1) 推荐(0) 编辑