求教:选中文档,自动用自己编的软件打开它,如何实现?(100)

  • 主题发起人 主题发起人 akshoot
  • 开始时间 开始时间
A

akshoot

Unregistered / Unconfirmed
GUEST, unregistred user!
双击打开一个我自定义的.cwf文档,我可以用自己编的mc.exe打开它,可以实现。现在我需要实现的是,选中N多个.cwf文件,按回车,用同一个mc.exe打开它,就象选中N多个Word的doc件一样,求教怎么弄?
 
你自己的格式你读不认识吗?既然认识,那么先把这些文件在内部合并为一个领事文件,在打开啊!
 
word 中打开的是document对象(数组),应该是MDI窗口。在程序中判断有没有已打开(自己)运行程序,如果有就向打开的程序添加对象。
 
一个和多个不是一样的吗?通过下面的方法可以遍历到选中的文件啊。如大器晚成说的,你的程序必须是类似于MDI之类的。procedure TForm1.FormCreate(Sender: TObject);VAR I:Integer;begin For I:=1 to ParamCount Do caption:=caption+' '+ParamStr(I);end;
 
Re大器晚成:我用过一个在进程间传送文本的方法是成功的,但这种方法造成windows致命错误的概率太高,不敢再用。Re其他两位:选中文件“a1”“a2”“a3”,按下回车会产如下的效果, 启动exe一次,param1是“a1” 又启动exe一次,param1是“a2” 再启动exe一次,param1是“a3”并不是启动exe一次,param1-3依次是“a1”“a2”“a3”。麻烦更详细一点解说好吗?
 
注意,用opendialog打开多个文件是很简单的,行的,我指的是选中文件“a1”“a2”“a3”,按下回车这样的方法也要行。还要系统稳定
 
测试通过了,给你代码。工程文件:program Project1;uses Forms, Windows, Unit1 in 'Unit1.pas' {FrmXZN};{$R *.res}Var H:HWND; I:Integer;begin H:=FindWindow('TFrmXZN',nil); if H<>0 Then begin For I:=1 to ParamCount Do PostOpenFile(H, ParamStr(I) ); Exit; end; Application.Initialize; Application.CreateForm(TFrmXZN, FrmXZN); Application.Run;end.----------------------------------单元文件:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TFrmXZN = class(TForm) Memo1: TMemo; procedure FormCreate(Sender: TObject); private { Private declarations } procedure MyMessage(var t:TWMCopyData);Message WM_COPYDATA; public { Public declarations } end;var FrmXZN: TFrmXZN;procedure PostOpenFile(H: HWND; FileName: string);implementation{$R *.dfm}procedure TFrmXZN.FormCreate(Sender: TObject);var I: Integer;begin for I := 1 to ParamCount do caption := caption + ' ' + ParamStr(I);end;procedure PostOpenFile(H: HWND; FileName: string);var DS: TCopyDataStruct;begin ShowMessage('发送:' + FileName); Ds.cbData := Length(FileName) + 1; GetMem(Ds.lpData, Ds.cbData); StrCopy(ds.lpData, PChar(FileName)); SendMessage(H, WM_COPYDATA, Application.Handle, Cardinal(@ds)); FreeMem(Ds.lpData);end;procedure TFrmXZN.MyMessage(var t: TWMCopyData);var tmpStr:String;begin //接受消息并显示。 tmpStr:=StrPas(t.CopyDataStruct^.lpData); Memo1.Lines.Add(tmpStr);end;
 
哦,谢谢。现在上班,等我回家仔细分析分析,主要还要是稳定
 
采用的办法是不使用同一个exe接、发消息,用A.exe启动发送,B.exe为实际的主程序,只负责接收。A在发前判断是否存在B.exe进程,如果不存在该进行,则将其启动后再发送,如存在,则等300毫秒再发送,(以防同时选中文件按回车时,由于时间紧促,漏收消息)。
 
另外我再想请教一下,如何判断一个进程是否全部启动完毕,这样我就可以等其启动完毕再发送,而不是固定等300毫秒了。谢谢
 
后退
顶部