如何通过 AutoIt 在 Windows 资源管理器中右键单击文件

Posted

技术标签:

【中文标题】如何通过 AutoIt 在 Windows 资源管理器中右键单击文件【英文标题】:How to Right click of File in Windows Explorer by AutoIt 【发布时间】:2012-03-28 21:43:09 【问题描述】:

我希望模拟右键单击文件。这是通过打开一个 Windows 资源管理器窗口然后右键单击它来完成的。

主要问题是在 Windows 资源管理器中查找文件的位置。我目前正在使用 Autoit v3.3.8.1。

我的代码的第一行:

 RunWait (EXPLORER.EXE /n,/e,/select,<filepath>)

下一步就是问题所在。查找文件的坐标。 之后,右键单击该坐标(此时在我看来)不是问题....

一些背景:

操作系统:Windows 7 64 位 软件语言:C#、Autoit(用于脚本)

Autoit 脚本由类似于下面的代码调用:

Process p = new Process();
p.StartInfo.FileName = "AutoItScript.exe";
p.StartInfo.UseShellExecute = false;
p.Start();

代码被编译成一个控制台类文件,在启动时运行。 autoit 脚本在资源管理器窗口打开时运行。

【问题讨论】:

如果您使用 AutoIt,这与 C# 有什么关系?为什么要右键单击该文件?要打开右键菜单,您可以编写脚本以使用菜单键。 您要右键单击文件/文件夹吗? 【参考方案1】:

您似乎对问题采取了错误的方法,所以我会回答您的问题以及您应该问的问题。

首先,那行代码是无效的,也不是你想要的。您想自动化资源管理器窗口,RunWait 等待程序完成。此外,您希望这些项目是字符串,该代码将永远无法工作。

在资源管理器中查找项目

资源管理器窗口只是一个列表视图,因此您可以使用普通的列表视图消息来查找项目的坐标。这可以通过 AutoIt 的 GUIListView 库最简单地完成:

#include<GUIListView.au3>

Local $filepath = "D:\test.txt"

Local $iPid = Run("explorer.exe /n,/e,/select," & $filepath)
ProcessWait($iPid)

Sleep(1000)

Local $hList = ControlGetHandle("[CLASS:CabinetWClass]", "", "[CLASS:SysListView32; INSTANCE:1]")

Local $aClient = WinGetPos($hList)
Local $aPos = _GUICtrlListView_GetItemPosition($hList, _GUICtrlListView_GetSelectedIndices($hList))

MouseClick("Right", $aClient[0] + $aPos[0] + 4, $aClient[1] + $aPos[1] + 4)

正如已经提到的,发送菜单键绝对是比移动鼠标更好的方法。

直接执行子项

这是应该的。理想情况下,您根本不需要打开资源管理器窗口,一切都可以在后台自动化。这应该始终是您的目标,因为 AutoIt 在大多数情况下都非常有能力。这完全取决于您要单击的项目。如果它是在各种程序中打开文件的前几个项目之一,那么它很简单:

    使用ShellExecute,将动词参数设置为您想要做的任何事情。 检查注册表以找到程序使用的确切命令行。为此,您需要查看HKCR\.ext,其中ext 是文件扩展名,默认值将是HKCR 中另一个键的名称,该键具有与文件类型关联的操作和图标。这在网上有很好的记录,所以用谷歌搜索一下。

如果动作不是程序动作之一(因此内置在资源管理器中),那么它会稍微复杂一些。通常最好的方法是在启动程序时查看任务管理器并查看它运行的内容。其他东西可以在网上找到,例如(解)压缩。复制、删除、重命名、创建快捷方式、发送到...等操作都可以通过 AutoIt 的各种 File* 功能直接完成。

有了更多信息,就有可能为您提供更具体的帮助。

【讨论】:

嗨,垫子。感谢您的回复。我明白你来自哪里。不幸的是,我的客户希望看到鼠标移动到文件并执行右键单击、双击等操作。 @JosephZeng,在这种情况下,我的答案的第一部分应该是正确的。 它就像@Mat 指出的那样工作。正如他所演示的那样,您真的可以将文件名附加到文件路径中。如果您想改用键盘,您可以使用ControlSend("", "", $hList, "&lt;filename&gt;+F10"),然后使用箭头键(可能有一些Sleep(333) 介于两者之间,以便您的客户更容易看到该操作。或者MouseClick 可以随速度变化。 哦 - 如果高级课程 [CLASS:SysListView32; INSTANCE:1] 不起作用,我使用了对我有用的 [CLASS:DirectUIHWND; INSTANCE:3]...试试看,如果它有效,请评价此评论。 ;-)【参考方案2】:

首先,您可能需要查看 Microsoft Active Accessibility SDK。特别看这个界面...

http://msdn.microsoft.com/en-us/library/accessibility.iaccessible.aspx

您可以使用它来遍历控件中的项目并找到具有您要查找的文件名及其屏幕位置的项目。

从那里,也许可以尝试类似的方法来模拟右键单击。

How can I use automation to right-click with a mouse in Windows 7?

完成右键单击后,再次使用辅助功能在上下文菜单中找到正确的选项。

也许有一种更简单的方法,如果找不到的话,你应该可以像这样拼凑一些东西。祝你好运!

【讨论】:

【参考方案3】:

假设我在 D 盘上有一个名为 test.txt 的文件。它需要右键单击才能打开上下文菜单。为此,以下代码应该可以工作:

Local $filepath = "D:\test.txt"
Local $iPid = Run("explorer.exe /n,/e,/select," & $filepath)
ProcessWait($iPid)
Sleep(1000)
Send('+F10')

【讨论】:

以上是关于如何通过 AutoIt 在 Windows 资源管理器中右键单击文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AutoIt 或 Windows UI 自动化单击应用程序中的按钮

运维开发windows下的自动化脚本语言autoit

如何打开windows资源管理器

jmeter结合autoit操作windows程序

选择Windows自动化脚本语言。 AutoIt vs Autohotkey [关闭]

web自动化9-selenium.Windows上传文件