简单有关问题:怎么得到鼠标已经选择的内容,小弟我想做“右键”的功能

简单问题:如何得到鼠标已经选择的内容,我想做“右键”的功能
谢谢

------解决方案--------------------
前几天我查了一下,发现做成动态的非常复杂(就是那种能够根据选择自动变化的,像

beyond compare那种)。一点参考资料,我还没有研究



windows支持七种类型的外壳扩展(称为handler),它们相应的作用简述如下:

  (1)context menu handlers:向特定类型的文件对象增添上下文相关菜单;

  (2)drag-and-drop handlers用来支持当用户对某种类型的文件对象进行拖放操作时的ole数据传输;

  (3)icon handlers用来向某个文件对象提供一个特有的图标,也可以给某一类文件对象指定图标;

  (4)property sheet handlers给文件对象增添属性页(就是右键点击文件对象或文件夹对象后,在弹出菜单中选属性

项后出现的对话框),属性页可以为同一类文件对象所共有,也可以给一个文件对象指定特有的属性页;

  (5)copy-hook handlers在文件夹对象或者打印机对象被拷贝、移动、删除和重命名时,就会被系统调用,通过为windows

增加copy-hook handlers,可以允许或者禁止其中的某些操作;

  (6)drop target handlers在一个对象被拖放到另一个对象上时,就会被系统被调用;

  (7)data object handlers在文件被拖放、拷贝或者粘贴时,就会被系统被调用。

  windows的所有外壳扩展都是基于com(component object model) 组件模型的,外壳是通过接口(interface)来访问对象的。

外壳扩展被设计成32位的进程中服务器程序,并且都是以动态链接库的形式为操作系统提供服务的。因此,如果要对windows

的用户界面进行扩充的话,则具备写com对象的一些知识是十分必要的。 由于篇幅所限,在这里就不介绍com,读者可以参考

微软的msdn库或者相关的帮助文档,一个接口可以看做是一个特殊的类,它包含一组函数合过程可以用来操作一个对象。

写好外壳扩展程序后,必须将它们注册才能生效。所有的外壳扩展都必须在windows注册表的hkey_classes_root键

之下进行注册。在该键下面可以找到许多名字像{0000002f-0000-0000-c000-000000000046}的键,这类键就是全局唯一类标识

符(guid)。每一个外壳扩展都必须有一个全局唯一类标识符,windows正是通过此唯一类标识符来找到外壳扩展处理程序的。

在类标识符之下的inprocserver32子键下记录着外壳扩展动态链接库在系统中的位置。与某种文件类型关联的外壳扩展注册在

相应类型的shellex主键下。如果所处的windows操作系统为windows nt,则外壳扩展还必须在注册表中的

hkey_local_machine主键下登记。

编译完外壳扩展的dll程序后就可以用windows本身提供的regsvr32.exe来注册该dll服务器程序了。如果使用delphi,也可

以在run菜单中选择register activex server来注册。

下面首先介绍一个比较常用的外壳扩展应用:上下文相关菜单,在windows中,用鼠标右键单击文件或者文件夹时弹出的那

个菜单便称为上下文相关菜单。要动态地在上下文相关菜单中增添菜单项,可以通过写context menu handler来实现。比如大家

所熟悉的winzip和ultraedit等软件都是通过编写context menu handler来动态地向菜单中增添菜单项的。如果系统中安装了

winzip,那么当用右键单击一个名为windows的文件(夹)时,其上下文相关菜单就会有一个名为add to windows.zip的菜单项。

本文要实现的context menu handler与winzip提供的上下文菜单相似。它将在任意类型的文件对象的上下文相关菜单中添加一个

文件操作菜单项,当点击该项后,接口程序就会弹出一个文件操作窗口,执行文件拷贝、移动等操作。

 编写context menu handler必须实现ishellextinit、icontextmenu和tcomobjectfactory三个接口。ishellextinit实现

接口的初始化,icontextmenu接口对象实现上下文相关菜单,icomobjectfactory接口实现对象的创建。

下面来介绍具体的程序实现。首先在delphi中点击菜单的 file|new 项,在new item窗口中选择dll建立一个dll工程文件。

然后点击菜单的 file|new 项,在new item窗口中选择unit建立一个unit文件,点击点击菜单的 file|new 项,在new item窗口

中选择form建立一个新的窗口。将将工程文件保存为contextmenu.dpr ,将unit1保存为contextmenuhandle.pas,将form保存为

opwindow.pas。

contextmenu.dpr的程序清单如下:

library contextmenu;

uses

comserv,

contextmenuhandle in 'contextmenuhandle.pas ',

opwindow in 'opwindow.pas ' {form2};

exports

dllgetclassobject,

dllcanunloadnow,

dllregisterserver,

dllunregisterserver;

{$r *.tlb}

{$r *.res}

begin

end.

contextmenuhandle的程序清单如下:

unit contextmenuhandle;

interface

uses windows,activex,comobj,shlobj,classes;

type

tcontextmenu = class(tcomobject,ishellextinit,icontextmenu)

private

ffilename: array[0..max_path] of char;

protected

function ishellextinit.initialize = seiinitialize; // avoid compiler warning

function seiinitialize(pidlfolder: pitemidlist; lpdobj: idataobject;

hkeyprogid: hkey): hresult; stdcall;

function querycontextmenu(menu: hmenu; indexmenu, idcmdfirst, idcmdlast,

uflags: uint): hresult; stdcall;

function invokecommand(var lpici: tcminvokecommandinfo): hresult; stdcall;