Python编程:访问Windows右键菜单选项
我希望能在工作中自动化一些任务。其中一个任务是把多个PowerPoint文件合并并转换成PDF格式。我还是个新手(刚学完Magus Heitland的《Python入门》),所以我不太确定自己具体在问什么。
在Windows系统中,可以选择多个文件,右键点击,然后选择合并为Adobe PDF。我已经弄清楚了如何把我想转换的文件分组(我遍历文件夹,把文件根据名字放到一个列表里),但我不太确定下一步该怎么做(也就是右键点击合并的命令)。
我在网上搜索了一些东西,比如win32api、pywinauto和ctypes。但是当我阅读这些内容时,我的菜鸟身份让我搞不清楚哪个工具是我需要的。
有没有人能推荐一些好的资源或建议?
3 个回答
如果你只是想要一个简单的解决办法,可以自定义一个右键菜单的“发送到...”快捷方式,这样就能用命令行参数调用你的Python脚本来转换文件。
要添加“发送到”快捷方式,具体步骤取决于你使用的是Windows 7还是更早的32位版本。这里有一些说明,教你如何添加自定义的“发送到...”快捷方式。你可以把所有文件发送到一个文件夹,然后调用你的Python脚本,或者直接用选中的文件作为命令行参数来调用。
Send To Toys在64位系统上可以使用。使用Send To Toys时,你可以在右键点击时把你的Python脚本和所有经过处理的文件名放到剪贴板上,然后再把构造好的命令粘贴到命令行中。我经常用这种方法,因为构造命令只需要几秒钟。
你还可以通过修改注册表来添加一个右键快捷方式,这样可以用选中的文件作为目标来调用你的Python脚本。你可以手动修改注册表,或者使用类似RightClick Extender的工具。
如果你愿意多花点时间,可以写一个自定义的上下文菜单类,并用.NET语言来响应这个菜单。这可以用C#或者Ironpython来实现。
如果你真的想要一个专业级的实现,可以修改新开源版本的Image Resizer的源代码。关于上下文菜单处理的C++源代码可以在这里找到。不过,最后这两个建议看起来要花费更多的时间和精力,可能不太必要……
这个问题没有简单的答案。在Windows系统中,右键菜单的选项是通过一种叫做“上下文菜单外壳扩展”的东西创建的,这是一种注册在Windows资源管理器中的COM组件。要在一组文件上调用任意的右键菜单选项,需要进行以下操作:
- 获取包含这些文件的文件夹的IShellFolder接口。
- 使用IShellFolder::GetUIObjectOf来获取该文件夹的上下文菜单处理对象。需要传入一个包含所选文件列表的ITEMIDLIST和
riid
=IContextMenu
。 - 调用IContextMenu::InvokeCommand来对这组文件执行所需的命令。
这些操作都可以用Python实现(通过ctypes
或win32com
),但我觉得最好先用直接支持COM的语言(比如C++)来做,等搞定了再转到Python...或者用其他方法。
编辑 如果你对执行环境有完全的控制权,模拟用户输入(键盘和鼠标)可能就足够了。在Python中这样做要简单得多。你只需要一个系统函数:SendInput。快速搜索一下发现了一个使用SendInput和ctypes
的例子,在这里。
你想知道当你点击 Combine
时,实际上运行了什么命令行,比如说是 c:\program files\adobe\combiner ...
。你想把这个字符串构建出来(其中的 ...
是文件列表),然后执行它。Python 的 subprocess 模块里的 Popen 就可以做到这一点。
import subprocess
cmd = [r"c:\program files\adobe\combiner"]
cmd.extend(file_list)
p = subprocess.Popen(cmd)
不过,建议你看看那个链接,Popen 有很多参数,这里只是最简单的用法。我不确定这些参数是否必须放在一个列表里,但我看到的例子都是这样做的。