我把自己的FLASH播放器注册为系统默认的播放器,怎么才能当在播放一个flash时,双击另一个flash不打开另一个播放器,而是在第一个播放器播放(0分)

  • 主题发起人 birch2002
  • 开始时间
B

birch2002

Unregistered / Unconfirmed
GUEST, unregistred user!
我把自己的FLASH播放器注册为系统默认的播放器,怎么才能当在播放一个flash时,
双击另一个flash不打开另一个播放器,
而是在第一个播放器播放
 
很简单,程序启动时先找上一个实例(方法在DFW里有的是,不再赘述),如果找不到,就直
接播发啦,如果找到,就把 ParamStr(1) 做一个 WM_COPYDATA 消息发送给它
 
能不能说清楚点啊,最好加点代码啊
 
我来答一答吧。Windows消息我不大懂。我自想的方法,可能不是很好
假定你的播放器是Form1
㈠、project中
application.showmainform:=false;

Form_Create事件
var x:integer;
x:=findwindow('Tform1',nil);
if x<>0 then

begin

sendmessage(x,wm_quit) //此句有错误。要改一下。
application.showmainform:=show;
FlashVCL.Play(paramstr(1));
end
else
application.terminate;
㈡、在注册表中写一个 FilwSwf
var ss:string
Form_Create事件
Reg.write('FilwSwf',paramstr(1));

if findwindow('Tform1',nil)<>0 then
application.terminate;

ss:= paramstr(1));

Flashvcl.play(ss);

form1_timer中
s:= reg.readstring(FilwSwf);
if s<>ss then
Flashvcl.play(s);


[:D][:D]
 
是两个办法!![:(!]
 

type
TForm1 = class(TForm)
//...
procedure FormCreate(Sender: TObject);
private
// 接收消息的事件定义
procedure AppOnMessage(var Msg: TMsg;
var Handled: Boolean);
procedure CreateParams(var Params: TCreateParams);
override;
procedure DataRequest(var Msg: TMessage);
message WM_COPYDATA;
procedure PlayFlashFile(const FileName: String);
// 你的播放过程!
public
{ Public declarations }
end;


function AppCanStart(const vParam: String): Boolean;

implementation
{$R *.DFM}

const
AppWinClass = 'MyFlashPlayer';

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

function AppCanStart(const vParam: String): Boolean;
var
RvHandle : hWnd;
DataStru: TDataStru;
S: String;
begin

RvHandle := FindWindow(PChar(AppWinClass), nil);
if RvHandle <= 0 then

Result:= True
else
begin

Result:= False;
S:= vParam;
if Length(S) > 0 then
begin

DataStru[0]:= 0;
DataStru[1]:= Length(S);
DataStru[2]:= dWord(Addr(S[1]));
SendMessage(RvHandle, WM_COPYDATA, 0, dWord(Addr(DataStru)));
end;

end;

end;


procedure TForm1.FormCreate(Sender: TObject);
begin

Application.OnMessage:= AppOnMessage;
end;


procedure TForm1.CreateParams(var Params: TCreateParams);
begin

inherited CreateParams(Params);
Params.WinClassName:= AppWinClass;
end;


Procedure TForm1.DataRequest(var Msg: TMessage);
var
P: PDataStru;
Q: PDataStruA;
S: String;
X: Integer;
begin

P:= PDataStru(Msg.lParam);
Q:= PDataStruA(P^[2]);

SetLength(S
Move(Q^, S[1], P^[1]);
PlayFlashFile(S);
end;


procedure TForm1.PlayFlashFile(const FileName: String);
// 你的播放过程!
begin

//...
end;


end.


DPR 文件中:

program Project1;

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

{$R *.RES}
var
xKey: Boolean;

begin

if ParamCount = 0 then
xKey:= True else
xKey:= AppCanStart(ParamStr(1));
if xKey then
begin

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

end.

 
主要是参数传递的问题:
Timer1.Enabled :=True;
sFileName:=ParamStr(1);
if sFileName<>'' then

begin

...
end;

注册表中也应写入相应的参数1%.
 
文件关联+ParamStr(1)
 
前面两个大侠说的对
 
接受答案了.
 
顶部