实在不好意思,试了一下我上面说的方法,好像确实不行,一个程序只能取一个文件作参数,当鼠标选中多个文件时每一个文件会启动一个程序,这样会启动多个程序实例。 不过可以用另一种方法,第一个程序实例启动时正常通过参数取第一个的一个文件名,当第二个程序运行之前监测一下,如果发现已由该程序实例运行,则把它的参数(文件名)通过消息传给第一个实例。大概就这个意思吧,你看看下面的代码,可以实现你的功能,可能还有别的问题,没仔细调试:)
//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.