afan 发表于 2010-8-5 23:29:01

如何获取在文件夹窗口中选择的多个文件的文件名

本帖最后由 afan 于 2010-8-6 15:20 编辑

在文件夹窗口(或资源管理器)中选择多个文件或文件夹,如何获取这些文件名?

如果用Command Line Parameters貌似只能获取一个文件名$CmdLineRaw,无法取得全部。
想得到类似 “WinRAR” 或 “重命名软件” 或 “删除(回收站)”选择多个文件后在右键菜单操作,返回文件名给它操作的目的。

不考虑复制到剪贴板再读取或者拖曳的形式。

其中可能有两个问题需要解决:
1,如何取得选择多个文件的文件名
2,如何在右键菜单中仅调用一次(不然会同时响应N个相同的获取上面文件名的命令;莫非需做个dll调用?)

这个问题的解决实用性是很大的~ 谢谢各位的关注~!

afan 发表于 2010-8-6 13:48:15

如果知道这个文件类型是怎么样关联的。应该就好办了吧?
xsjtxy 发表于 2010-8-6 13:41 http://www.autoitx.com/images/common/back.gif


    呵呵,这个我也试过,貌似跟当前文件夹的查看方式有关,很多情况下是获取不到的。用"ViewChange", "视图",似乎也无效;其次,通过文件类型项目再去获取后缀名似乎比较繁琐…

xsjtxy 发表于 2010-8-6 12:20:08

{:face (396):}
是说不会那么简单的吧。

3mile 发表于 2010-8-6 10:26:59

不懂帮顶。
另外请教如何Command命令获取一个文件名?

水木子 发表于 2010-8-6 10:34:28

昨晚这问题刚一出来、我就瞅见了,想了一晚上未果!

xsjtxy 发表于 2010-8-6 12:08:58


Send("#e")
WinWait("我的电脑","我的电脑")
ControlFocus("我的电脑", "我的电脑", "SysListView321")
Send("^a")
$a = ControlListView("我的电脑", "我的电脑", "SysListView321", "GetSelected",1)
$b = StringSplit($a, "|")
for $i = 1 to $b
$c = ControlListView("我的电脑", "我的电脑", "SysListView321", "GetText", $b[$i])
msgbox(0,"选中的项目",$c)
next

afan 发表于 2010-8-6 12:12:08


xsjtxy 发表于 2010-8-6 12:08 http://www.autoitx.com/images/common/back.gif


    呵呵,利用ControlListView的方法我早就试过了,无法获取完整的文件名(带后缀名),除非系统本身就是显示后缀的…

afan 发表于 2010-8-6 12:21:49

不懂帮顶。
另外请教如何Command命令获取一个文件名?
3mile 发表于 2010-8-6 10:26 http://www.autoitx.com/images/common/back.gif

不好意思让你误解了,其实是Command Line Parameters,就是通过$CmdLine来获取。
在注册表中写入相关键值,利用 %1 的参数来返回文件完整路径。

afan 发表于 2010-8-6 12:23:17

昨晚这问题刚一出来、我就瞅见了,想了一晚上未果!
水木子 发表于 2010-8-6 10:34 http://www.autoitx.com/images/common/back.gif


    我知道你瞅见了,呵呵~
再次谢谢各位老友的关注~~

水木子 发表于 2010-8-6 12:53:48

4楼的方法我也想过,不过!貌似Windows7里完全行不通。

thesnow 发表于 2010-8-6 12:58:17

回复 9# 水木子


    封装类,看不到内容了是吧?

水木子 发表于 2010-8-6 13:00:13

回复 10# thesnow
是啊!返回全是 0

xsjtxy 发表于 2010-8-6 13:41:07

如果知道这个文件类型是怎么样关联的。应该就好办了吧?
$a = ControlListView("下载目录", "", "SysListView321", "GetSelected",1)
$b = StringSplit($a, "|")
for $i = 1 to $b
$c = ControlListView("下载目录", "", "SysListView321", "GetText", $b[$i])
$d = ControlListView("下载目录", "", "SysListView321", "GetText", $b[$i],2)
msgbox(0,"选中的文件:",$c&@CR&"文件类型:"&$d)
next

lynfr8 发表于 2010-8-6 22:44:31

其中可能有两个问题需要解决:
1,如何取得选择多个文件的文件名
2,如何在右键菜单中仅调用一次(不然会同时响应N个相同的获取上面文件名的命令;莫非需做个dll调用?)
问题1解决方法:可以通过将当前路径所有文件和文件夹读入数组,再获取已经选择的文件名对比;但是桌面的文件路径如何获取?这个需要另外判断了。
问题2暂时解决方法:检测是否相同进程,是则杀死进程,但是缺点就是多选文件获取路径时候鼠标状态会依然反映为忙碌,并且任务栏弹出和选取文件数相同的图标,尚需完美解决。

#include <File.au3>
#include <Array.au3>
;#NoTrayIcon
$process = processlist(@ScriptName)
for $i = 1 to $process
if $process[$i] <> @AutoItPID then
processclose($process[$i])
endif
next
$AllSelectedName = ''
$Selecte = StringSplit(ControlListView(WinGetTitle(""), "", "SysListView321", "GetSelected", 1), "|")
$Filenames = _FileListToArray(WinGetTitle(""), '*', 0)
For $i = 1 To $Selecte
$SelectedName = ControlListView(WinGetTitle(""), "", "SysListView321", "GetText", $Selecte[$i])
If $Filenames <> 0 Then
For $n = 1 To $Filenames
   $path = StringReplace(WinGetTitle("")& $Filenames[$n],'\\','\')
   If $Filenames[$n] = $SelectedName Or StringRegExpReplace($Filenames[$n], '(\..+)', '') = $SelectedName And DirGetSize($path ) = -1 Then
    $AllSelectedName &= '文件:' & $path& @CRLF
   ElseIf $Filenames[$n] = $SelectedName Or StringRegExpReplace($Filenames[$n], '(\..+)', '') = $SelectedName And DirGetSize($path ) <> -1 Then
    $AllSelectedName &= '文件夹:' & $path& @CRLF
   EndIf
Next
EndIf
Next
ClipPut(StringRegExpReplace($AllSelectedName, '文件夹:|文件:', ''))
;TrayTip("路径已复制到剪切板 By lynfr8", $AllSelectedName, 5)
ToolTip($AllSelectedName, 0, 0, "路径已复制到剪切板 By lynfr8")
Sleep(1000)

上面代码编译为exe后放在c盘根目录,并将附件注册表导入。

3mile 发表于 2010-8-6 22:52:14

想了很多方法,最后也只有剪贴版好像较好。
召唤P大拦截系统消息搞定吧。
页: [1] 2 3 4
查看完整版本: 如何获取在文件夹窗口中选择的多个文件的文件名