程序怎样从资源管理器的右键命令中接受多个文件并且本身只运行一次?(100分)

  • 主题发起人 主题发起人 fcputao
  • 开始时间 开始时间
呵呵,无忌,你看看,这个我已经说过了
麻烦就麻烦在 FindWindow 上,如果标题可变。
 
以下的方法可能是最简单的
type
TMainForm = class(TForm)
// ......
procedure FormCreate(Sender: TObject);
private
procedure CreateParams(var Params: TCreateParams)
override;
Procedure DataRequest(var Msg: TMessage)
message WM_COPYDATA;
end;

const
AppWinClass = 'MyApplication';

var
MainForm: TMainForm;

function AppCanStart: Boolean;

implementation
{$R *.DFM}

type
TDataStru = array [0..2] of DWORD;
PDataStru = ^TDataStru;

function AppCanStart: Boolean;
var
RvHandle: hWnd;
X: TDataStru;
S: FixStr;
begin
RvHandle:= FindWindow(PChar(AppWinClass), nil);
if RvHandle <= 0 then
Result:= True
else begin
Result:= False;
if ParamCount = 0 then S:= '' else S:= ParamStr(1);
X[0]:= 0;
X[1]:= Length(S);
X[2]:= dWord(Addr(S[1]));
S[X[1] + 1]:= #0;
SendMessage(RvHandle, WM_COPYDATA, 0, dWord(Addr(X)));
end;
end;

procedure TMainForm.DataRequest(var Msg: TMessage);
var
P: PDataStru
S: String;
begin
P:= PDataStru(Msg.lParam);
try
S:= PChar(P^[2]);
if Length(S) <> 0 then begin
ShowMessage(S);
// 想做什么?
end;
except
S:= '';
end;

if not Visible then begin
Show;
if WindowState = wsMinimized then WindowState:= wsNormal;
end;
Application.Restore;
Application.BringToFront
end;

procedure TMainForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WinClassName:= AppWinClass;
end;

与之相配合的 DPR 文件如下:
uses
Forms,
MyMainForm in 'MyMainForm.pas' {MainForm};
{$R *.RES}
begin
if AppCanStart then begin
Application.Initialize;
Application.Title := 'MyApplication, Cool!';
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end;
end.
 
HWND FindWindow(

LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);
和楼上的一样,可以利用第1一个参数的CLASS名来,CLASS名一般是不会变的
 
这也是我刚才说过的啊:)
 
为什么我用SupermanTm的方法,在已打开一个实例的情况下,双击文件名,有时得到的文件名
最后没有“#0”(这没关系,可以正常打开这个参数文件),但有时不知为何,最后跟上的是"#3",
这样的参数文件就不能打开了,我不知为何会出现“#3”?
 
对不起,我粗心了,前面的AppCanStart函数应该这样的:
function AppCanStart: Boolean;
var
RvHandle: hWnd;
X: TDataStru;
S: ShortString
// 这里改了
begin
RvHandle:= FindWindow(PChar(AppWinClass), nil);
if RvHandle <= 0 then
Result:= True
else begin
Result:= False;
if ParamCount = 0 then S:= '' else S:= ParamStr(1) + #0
// 把这补上!
X[0]:= 0;
X[1]:= Length(S);
X[2]:= dWord(Addr(S[1]));
S[X[1] + 1]:= #0;
SendMessage(RvHandle, WM_COPYDATA, 0, dWord(Addr(X)));
end;
end;
应该可以的啦
 
后退
顶部