如何双击文件获得文件名和路径?

fisher_older 2011-02-14 09:39:16
例如C盘下有个文件“try.txt”,如何用delphi编程,进行监控:当打开该文件时,在memo1中显示文件名和路径?只有34分了。
...全文
1812 81 打赏 收藏 转发到动态 举报
写回复
用AI写文章
81 条回复
切换为时间正序
请发表友善的回复…
发表回复
carter91620 2012-08-20
  • 打赏
  • 举报
回复
这帖子实在是太好了,继续UP!
zanezwc 2012-08-09
  • 打赏
  • 举报
回复
楼上的是不是都太复杂了??
ExtractFileName(const FileName: string): string;
只是空想家 2011-04-19
  • 打赏
  • 举报
回复
高深问题啊,不了解啊
赵4老师 2011-03-02
  • 打赏
  • 举报
回复
赵4老师 2011-03-02
  • 打赏
  • 举报
回复
话说有个工具叫OpenedFilesView.exe
http://www.nirsoft.net
一灯 2011-03-01
  • 打赏
  • 举报
回复
我为称为一个程序员而狂 值得吗?! 昨天看经济半小时 发现内蒙古那边不管是放养的 还是种地的 一年怎么着也弄个十几万, 还贴近自然,健健康康 我就纳闷了。。老子一辈子做电脑前辐射的半死还要看人脸色办事,值得吗?
raoxy1982 2011-03-01
  • 打赏
  • 举报
回复
监控双击打开文件时的动作,在双击时函数肯定要知道该文件的路径,否则找不到打开的文件。
fisher_older 2011-02-26
  • 打赏
  • 举报
回复
管用,太牛了。
Forever_Young 2011-02-25
  • 打赏
  • 举报
回复
不用替换空格,用IdStrings的SplitColumns


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DDEMan, IdStrings;

type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FWindowHandle: HWND;
Procedure WndProc2(Var Msg: TMessage);
public
Procedure GetWordFileName(Var Msg: TMessage);
end;

Function RegisterShellHookWindow(HWND: LongWord): Integer; stdcall;
external 'User32.dll';

Function StrCmpIW(w1,w2:LPWSTR): Integer; stdcall; external 'Shlwapi.dll';

var
Form1: TForm1;
Msg_ID: Cardinal;
cDDE: TDDEClientConv;

implementation

{$R *.dfm}

Procedure TForm1.WndProc2(Var Msg: TMessage);
var
wcName: string;
buf: array [0..MAX_PATH] Of WideChar;
Begin
If Msg.Msg = Msg_ID then
begin
GetClassNameW(Msg.LParam,@buf,MAX_PATH);
if StrCmpIW('OpusApp',@buf) = 0 then GetWordFileName(Msg);
end
else
Msg.result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.WParam, Msg.lParam);
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
FWindowHandle := AllocateHWnd(WndProc2);
Msg_ID := RegisterWindowMessage('SHELLHOOK');
RegisterShellHookWindow(FWindowHandle);
cDDE := TDDEClientConv.Create(nil);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DeallocateHWnd(FWindowHandle);
cDDE.Free;
end;

Procedure TForm1.GetWordFileName(Var Msg: TMessage);
var
fList: TStringList;
begin
case Msg.WParam of
HSHELL_WINDOWCREATED:
if cDDE.SetLink('WinWord','System') then
begin
fList := TStringList.Create;
while fList.Count < 3 do
SplitColumns(cDDE.RequestData('Topics'), fList, #9);
Memo1.Lines.Add(fList[1]);
cDDE.CloseLink;
fList.Free;
end;
end;
end;

end.

fisher_older 2011-02-25
  • 打赏
  • 举报
回复
@Forever_Young,我想到了一个替代的办法,先把空格替换成其他很少用到的字符,然后分段,分段结束后再将空格恢复。

感谢Forever_Young,感谢Lactoferrin,感谢其他参与讨论的朋友。这个帖子收获不小。结贴了,分不多,以后有机会再补了。
fisher_older 2011-02-25
  • 打赏
  • 举报
回复
哭啊,果然如此,没想到是StrictDelimiter的原因。只得再想想办法,看怎么判断了。
Forever_Young 2011-02-24
  • 打赏
  • 举报
回复
我知道问题出在哪了,D7下面TStrings没有StrictDelimiter属性
Forever_Young 2011-02-24
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 fisher_older 的回复:]
我怀疑是当双击打开该文档时,虽然捕获到HSHELL_WINDOWCREATED消息,但是文档尚未完全加载,导致这个结果。
[/Quote]

你没看我代码里用while循环做了个判断?就是解决这个问题的。
Forever_Young 2011-02-24
  • 打赏
  • 举报
回复
我三台电脑,WIN7、XP、WIN2003,分别装有OFFICE2010、OFFICE2007、OFFICE2003

反复测试几十次点击,单个文件,两个、三个、四个、五个.......

获取的数据绝对正确,没有出现你说的情况,你有否改动代码?编译环境是不是D2010?

利用TSTRINGLIST和while判断循环是我能想到的最好办法了,别的延时都会造成延时或者word和程序的挂起。

要不我在D7下面编译试试?
fisher_older 2011-02-24
  • 打赏
  • 举报
回复
看来又回到上次我问的那个问题了。哈哈,刚发现原来那个也是Forever_Young帮助回答的,跟这个情况类似。上次那个应该没有完全解决,这回又遇到了。
http://topic.csdn.net/u/20110122/16/1a770a2b-c537-4ced-a824-6c85da5a3243.html
fisher_older 2011-02-24
  • 打赏
  • 举报
回复
只打开一个文件会不会造成死循环?
fisher_older 2011-02-24
  • 打赏
  • 举报
回复
@Forever_Young,非常感谢。我试了一下,似乎在XP下还有点问题。当我运行这个程序后,双击打开F盘下一个名字为try.doc的word文档时(F:\try.doc),cDDE.RequestData('Topics')的内容是:System C:\Documents and Settings\Administrator\Application data\Microsoft\Templates\Normal.dot
我怀疑是当双击打开该文档时,虽然捕获到HSHELL_WINDOWCREATED消息,但是文档尚未完全加载,导致这个结果。
不过有两个以上的word文档打开时则能得到正确的结果。
Forever_Young 2011-02-24
  • 打赏
  • 举报
回复
写好了,你参考一下。


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DDEMan;

type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FWindowHandle: HWND;
Procedure WndProc2(Var Msg: TMessage);
public
Procedure GetWordFileName(Var Msg: TMessage);
end;

Function RegisterShellHookWindow(HWND: LongWord): Integer; stdcall;
external 'User32.dll';

Function StrCmpIW(w1,w2:LPWSTR): Integer; stdcall; external 'Shlwapi.dll';


var
Form1: TForm1;
Msg_ID: Cardinal;
cDDE: TDDEClientConv;

implementation

{$R *.dfm}

Procedure TForm1.WndProc2(Var Msg: TMessage);
var
wcName: string;
buf: array [0..MAX_PATH] Of WideChar;
Begin
If Msg.Msg = Msg_ID then
begin
GetClassNameW(Msg.LParam,@buf,MAX_PATH);
if StrCmpIW('OpusApp',@buf) = 0 then GetWordFileName(Msg);
end
else
Msg.result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.WParam, Msg.lParam);
End;

procedure TForm1.FormCreate(Sender: TObject);
begin
FWindowHandle := AllocateHWnd(WndProc2);
Msg_ID := RegisterWindowMessage('SHELLHOOK');
RegisterShellHookWindow(FWindowHandle);
cDDE := TDDEClientConv.Create(nil);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DeallocateHWnd(FWindowHandle);
cDDE.Free;
end;

Procedure TForm1.GetWordFileName(Var Msg: TMessage);
var
fList: TStringList;
begin
case Msg.WParam of
HSHELL_WINDOWCREATED:
if cDDE.SetLink('WinWord','System') then
begin
fList := TStringList.Create;
fList.StrictDelimiter := True;
fList.Delimiter := #9;
while fList.Count < 3 do
fList.DelimitedText := cDDE.RequestData('Topics');
Memo1.Lines.Add(fList[1]);
cDDE.CloseLink;
fList.Free;
end;
end;
end;

end.
Forever_Young 2011-02-23
  • 打赏
  • 举报
回复
还得考虑好,在消息处理的过程中不能使用Sleep来等待DDE的传递,我先前在WIN7、office2010下测试没问题,不用等待就可以获取,XP和OFFICE2003就需要等待,所以我设想在消息处理的过程中做个循环,把DDE获取的数据加入TSTRINGLIST里面,然后判断COUNT,小于3就是还没有获取到,因为DDE获取的数据包含了当前word的所有打开文档名,但是第一个肯定是最新打开的,这样判断就不会造成程序挂起,如果用sleep会造成程序和OFFICE同时挂起等待,感觉上不是很爽。

另外获取别的文件类型做到这个消息处理里。
Forever_Young 2011-02-23
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 fisher_older 的回复:]
@Forever_Young,能否提示一下?
[/Quote]

今天有点事,明天给你写个出来
加载更多回复(54)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧