如何能在鼠标右键菜单里加入程序的快捷菜单呢!(100分)

  • 主题发起人 主题发起人 孤风秋叶
  • 开始时间 开始时间

孤风秋叶

Unregistered / Unconfirmed
GUEST, unregistred user!
我初入这一行,希望大家能对我多多帮助啊,我先谢谢大家了。
如果我们自己写一个程序,如果能把关于它的菜单加入到鼠标右键中的菜单中呢!!
 
form等各个控件有个PopubMenu属性,在里面选择你做好的右键菜单
 
谢谢你。我指得像网络玛蚁那样能在鼠标右键里加一个菜单,使之运行起来更加方便。
 
你是用Delphi做吗?
 
这篇文章可能能帮你
关于多种环境注册右键弹出事件的方法,请按照以下对应关系:/HKEY_CLASSES_ROOT/Folder/Shell 任意文件夹
/HKEY_CLASSES_ROOT/Directory/Shell 任意目录
/HKEY_CLASSES_ROOT/Drive/Shell 任意驱动器
/HKEY_CLASSES_ROOT/*/Shell 任意文件
新建一个主键,并在主键下添加一个特定主键(command),修改command的键值指到你的应用程序。例如:
建立/HKEY_CLASSES_ROOT/Folder/Shell/AimTest,将在Folder上按下右键时出现"AimTest"菜单
建立/HKEY_CLASSES_ROOT/Folder/Shell/AimTest,并设定该主键的缺省值为"我的测试菜单",则将在Folder上按下右键时出现"我的测试菜单"菜单钮。
建立/HKEY_CLASSES_ROOT/Folder/Shell/AimTest/command,并设定command"缺省"键值为"c:/tools/pse.exe" "%1",则将以Folder名为第一参数启动pse.exe。

* 注意command键值的双引号不可缺省另外:/HKEY_CLASSES_ROOT/Folder/Shellex
/HKEY_CLASSES_ROOT/Directory/Shellex/HKEY_CLASSES_ROOT/Drive/Shellex
/HKEY_CLASSES_ROOT/*/Shellex可以按应用程序在Registroy中的注册ID调用。这样可以调用.DLL和钩子函数。
但建议按第一种方法调用应用程序,因为注册一个ID实在麻烦。如果你的应用程序支持DDE,你可以参考
/HKEY_CLASSES_ROOT/Directory/Shell/Find键的设定来进行DDE设置。
 
是DELPHI 做的呀,是不是要在注册表里添加什么内容呢??
 
谢谢迷糊,我试试看。以后请你多多帮我呀。
 
对了,WIN98和WIN2K的注册表是一样的吗?如果不一样的话,在实现上有什么区别吗?
 
各位大哥,谁肯指教一下呢!如果点鼠标同时选中多个文件时,该用什么函数把全部文件调入程序呢? paramstr能不能够实现呢!!
 
哪位前辈回答了这个问题,马上送上八十分,因为要留二十分给迷糊前辈。 谢谢了!!
 
FileName 这个STRING 里面不是有了吗?[:D]
 
是用paramstr啊,当点鼠标同时选中多个文件时将文件名作为命令行参数传入你的程序,载你的程序中用paramstr函数取得传入的文件名,大概这样用吧
if ParamCount>0 then

begin

for i:=0 to ParamCount-1do

filename:=ParamStr;
end;
 
在点击鼠标右键的时候,调出程序的同时也就把这些文件调入程序。在没点击鼠标右键时,程序是没有打开的。怎么样才能判断鼠标选中了几个文件,而文件名又分别是什么呢?
 
对不起, 迷糊, 我这样试过的。Paramcount的作用不是判断选中了几个文件,而是判断选中的那个文件有几个参数(一般有,0,1)。不过还是要谢谢你,能再帮我想一下吗?
这个问题对我来说很重要!!
 
当你点鼠标右键的时候,你选中的所有文件的文件名都会作为执行你的程序的参数,而你的程序中只要接受这些参数就行了
 
能麻烦你讲得再细一些吗? 因为我开始学,实数菜鸟一级的!
 
实在不好意思,试了一下我上面说的方法,好像确实不行,一个程序只能取一个文件作参数,当鼠标选中多个文件时每一个文件会启动一个程序,这样会启动多个程序实例。 不过可以用另一种方法,第一个程序实例启动时正常通过参数取第一个的一个文件名,当第二个程序运行之前监测一下,如果发现已由该程序实例运行,则把它的参数(文件名)通过消息传给第一个实例。大概就这个意思吧,你看看下面的代码,可以实现你的功能,可能还有别的问题,没仔细调试:)
//project1.dpr
program Project1;

uses
Forms,
windows,
messages,
Sysutils,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}
var
Phwnd:hwnd;
copydata:TCopyDataStruct;
filename:string;
begin

Phwnd:=findwindow('TForm1','form1');
if phwnd>0 then

begin

if paramcount<>0 then

filename:=paramstr(1)
else

filename:='';
//new(copydata);
copydata.dwData:=0;
copydata.cbData:=length(filename)+1;
getmem(copydata.lpData,copydata.cbData);
strcopy(copydata.lpData,pchar(filename));
sendmessage(phwnd,wm_copydata,0,dword(addr(copydata)));
FreeMem (copydata.lpData);
application.Terminate;
end
else

begin

Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;

end.


// unit1.pas
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
Pcpdata=^COPYDATASTRUCT
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure addfilename(var msg:tmessage);message wm_copydata;
end;


var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.addfilename(var msg: tmessage);
var
P: pcpdata;
S: String;
begin

p:=pcpdata(msg.LParam);
s:=StrPas(p.lpData);
if Length(S) <> 0 then
begin

listbox1.Items.add(s);
end;


end;


procedure TForm1.FormCreate(Sender: TObject);
begin

if paramcount<>0 then

listbox1.Items.Add(paramstr(1));
end;


end.
 
to 迷糊:
不知道你是否有电子邮件?这两贴的分当然全部都归你了。
我还有最后一个问题想请教你。我选择的是音频类的文件和我的程序相关联。 如果只选中一个文件时,用我的程序打开的,如果选中多个时,第一个用我的程序打开, 而后面的几个却用别得播放软件打开了(如WINAMP)。谢谢迷糊,坦白说对你真有些感激和崇拜!!
 
呵呵,你留个油箱我发个demo给你,其实在下也是菜鸟,只是在你贴子里乱说了一通下来一试发现不对,很是不安,上面的代码是我调试通过的,这次应该不会错了。
其实只要吧选中的文件取到你的程序中,至于怎么处理就好办了。
 
谢谢,gufengqiuye@163.com
不知迷糊在哪个地区高就呢?希望离我近些, 好有机会找你喝酒!!我在青岛!
 

Similar threads

S
回复
0
查看
816
SUNSTONE的Delphi笔记
S
S
回复
0
查看
739
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部