当双击c:/window/test.txt 打开了我的程序a.exe , 请问a.exe 如何得到c:/window/test.txt? ( 积分: 80 )

  • 主题发起人 主题发起人 sypoh
  • 开始时间 开始时间
S

sypoh

Unregistered / Unconfirmed
GUEST, unregistred user!
当双击c:/window/test.txt 打开了我的程序a.exe , 请问a.exe 如何得到c:/window/test.txt?
 
当双击c:/window/test.txt 打开了我的程序a.exe , 请问a.exe 如何得到c:/window/test.txt?
 
先判断这个路径是否存在啊<br>DirectoryExists();<br>ShellExecute(Handle,'',应用程序名,'','',SW_SHOWMAXIMIZED)
 
谢谢 reegon<br>不过答非所问:(<br><br>
 
在注册表中改.txt的键值
 
资源管理器/工具/文件夹选项/文件类型/更改<br>其作用如楼上所说<br>如果使用程序更改,打开注册表或调用相应api函数,自己找
 
首先,将你的程序关联到txt文件,作为默认打开的程序(修改注册表实现)<br>其次,你的程序读取参数所指的文件就行了<br><br>示例代码如下:<br>procedure TForm1.FormCreate(Sender: TObject);<br>var i:integer;<br>begin<br> &nbsp;memo1.Lines.Clear;<br> &nbsp;if paramcount=0 then //0表示没有参数<br> &nbsp;begin<br> &nbsp; &nbsp;memo1.Lines.Add('程序信息:'+paramstr(0));<br> &nbsp; &nbsp;memo1.Lines.Add('所带参数:没有参数');<br> &nbsp;end else<br> &nbsp;begin &nbsp; &nbsp;//以下是列出所有参数<br> &nbsp; &nbsp;memo1.Lines.Add('程序信息:'+paramstr(0));<br> &nbsp; &nbsp;for i:=1 to paramcount do<br> &nbsp; &nbsp;memo1.Lines.Add('所带参数:'+paramstr(i));<br> &nbsp;end;<br>end;
 
当双击c:/window/test.txt,windows会根据注册表的TXT对应的程序调用,调用的格式和注册表中的有关<br>如果注册表中TXT对应的是:a.exe '%1'<br>windows 就会调用 a.exe c:/window/test.txt;<br>{资源管理器可能使用的就是Shellexecute这一类的命令}<br>这个文件名,可以使用下面的东东来获得:<br>ParamCount//参数的个数<br>ParamStr(0)//就是程序的文件名<br>ParamStr(1)//第1个参数<br>ParamStr(n)//第n个参数<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=2500696
 
paramstr(0) 使用用程序名,paramstr(1) 就是c:/window/test.txt
 
如果程序已经打来了, 如何去捕捉paramstr(1)?
 
限制程序只运行一份,在限制代码中将本次打开的参数发到已打开的程序里去就行了。
 
paramstr是DELPHI提供的一个函数,可以直接使用
 
让第二份打开的程序去通知已经打开的程序,以前写的例子<br><br>const<br> &nbsp; &nbsp;WM_OPENFILE = WM_USER + 1820; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //打开文件消息<br><br>把这个函数加在程序入口处<br>procedure CheckPrevInstance;<br>var<br> &nbsp;PrevWindow: HWND;<br> &nbsp;Atom: TAtom;<br> &nbsp;strParam:pChar;<br>begin<br> &nbsp;if GlobalFindAtom(PChar('MyGame_IS_RUNNING')) = 0 then<br> &nbsp;begin<br> &nbsp; &nbsp;CheckPreInsAtom := GlobalAddAtom(PChar('MyGame_IS_RUNNING'));<br> &nbsp;end else<br> &nbsp;begin<br> &nbsp; &nbsp;PrevWindow := FindWindow('TfrmMain', pChar('MyGame Caption'));<br> &nbsp; &nbsp;if PrevWindow&amp;gt;0 then begin<br> &nbsp; &nbsp; &nbsp; SetForeGroundWindow(PrevWindow);<br> &nbsp; &nbsp; &nbsp; if ParamCount&amp;gt;0 then<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;strParam:=PChar(ParamStr(1))<br> &nbsp; &nbsp; &nbsp; else<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;strParam:=pChar('');<br> &nbsp; &nbsp; &nbsp; Atom := GlobalAddAtom(strParam);<br> &nbsp; &nbsp; &nbsp; SendMessage(PrevWindow, WM_OPENFILE, 0, Atom);<br> &nbsp; &nbsp; &nbsp; GlobalDeleteAtom(Atom);<br> &nbsp; &nbsp;end else begin<br> &nbsp; &nbsp; &nbsp; Alert('Error:Please Cancellation the System !');<br> &nbsp; &nbsp;end;<br> &nbsp; &nbsp;Halt;<br> &nbsp;end;<br>end;<br><br>public:<br> &nbsp; procedure OpenParam(var Msg:TMessage); message WM_OPENFILE; &nbsp; &nbsp; &nbsp; &nbsp;//打开文件<br><br>//------------------------------------------------------------------------------<br>//打开参数传递的文件<br>//------------------------------------------------------------------------------<br>procedure TfrmMain.OpenParam(var Msg: TMessage);<br>var<br> &nbsp;S: array[0..MAX_PATH] of Char;<br>begin<br> &nbsp; GlobalGetAtomName(Msg.LParam, S, 255);<br> &nbsp; if OpenFile(StrPas(S)) then <br> &nbsp; begin<br> &nbsp; &nbsp; PlayMyFile;<br> &nbsp; end;<br> &nbsp; Self.WindowState:=wsNormal;<br> &nbsp; Self.Show;<br> &nbsp; Self.Enabled:=True;<br>end;
 
WoDing说得够明白了
 
多人接受答案了。
 

Similar threads

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