Программирование на Python.Доступ к параметрам меню правой кнопкой мыши в Windows - PullRequest
1 голос
/ 22 декабря 2010

Я надеюсь автоматизировать несколько задач на работе.Одним из них является объединение и преобразование файлов Power Point в PDF-файлы.Я немного новичок (я только что закончил Beginning Python от Magus Heitland), поэтому я не совсем уверен, о чем конкретно спрашиваю.

В Windows можно выбрать несколько файлов, щелкнуть правой кнопкой мыши и выбрать объединить в Adobe PDF.Я выяснил «группирование» файлов, которые я хочу преобразовать (я просматриваю каталог и вкладываю файлы в список на основе их имен), но я не уверен, как выполнить следующий шаг (щелчок правой кнопкой мыши /объединить команду).

Поиск в Google привел меня к таким вещам, как win32api, pywinauto и ctypes.Но когда я читаю, что они делают, моя новизна мешает мне понять, какой инструмент мне нужен.

Может ли кто-нибудь предложить несколько хороших ресурсов или советов?

Ответы [ 3 ]

3 голосов
/ 22 декабря 2010

Нет простого ответа на этот вопрос. В Windows пункты контекстного меню создаются расширениями контекстного меню, которые являются типом расширения оболочки и представляют собой COM-компонент, зарегистрированный в проводнике Windows. Чтобы вызвать произвольную запись контекстного меню для группы файлов, необходимо выполнить следующие операции:

  1. Получите IShellFolder интерфейс папки оболочки, содержащей файлы.
  2. Используйте IShellFolder :: GetUIObjectOf , чтобы получить объект обработчика контекстного меню этой папки оболочки. Передайте ему ITEMIDLIST, заполненный списком выбранных файлов и riid = IContextMenu.
  3. Вызовите IContextMenu :: InvokeCommand , чтобы выполнить нужную команду для группы файлов.

Все это может быть реализовано в Python (через ctypes или win32com), но я думаю, что лучше начать с языка, который напрямую поддерживает COM (например, C ++), и перевести на Python, как только вы его заработаете .. или использовать другой подход.


РЕДАКТИРОВАТЬ Если у вас есть полный контроль над средой выполнения, это может быть достаточно для имитации пользовательского ввода (клавиатура и мышь). Это намного проще сделать в Python. Вам потребуется только одна системная функция: SendInput . Быстрый поиск в Google показал пример использования SendInput через ctypes здесь .

1 голос
/ 22 декабря 2010

Вы хотите точно узнать, какой эквивалент командной строки запускается, когда вы нажимаете Combine, скажем, это было c:\program files\adobe\combiner ....Вы хотите построить эту строку (со списком файлов как ...) и выполнить ее.Это будет сделано в модуле подпроцесса .

import subprocess
cmd = [r"c:\program files\adobe\combiner"]
cmd.extend(file_list)
p = subprocess.Popen(cmd)

Проверьте эту ссылку, хотя Popen принимает множество аргументов, и это просто самая простая форма.Не знаю, есть ли аргументы в списке , но они есть в примерах, которые я видел.

0 голосов
/ 22 декабря 2010

Если вы просто ищете простое решение, вы можете настроить ярлык «Send To ...», щелкнув правой кнопкой мыши, который вызовет ваш скрипт python с аргументами командной строки файлов для преобразования.

Чтобы добавить ярлык «Отправить в», это зависит от того, используете ли вы Windows 7 или 32-разрядную версию. Существуют инструкции ЗДЕСЬ для добавления настраиваемого ярлыка «Отправить в ...».Вы можете отправить все файлы в одну папку и вызвать скрипт Python или вызвать его с выбранными файлами в качестве аргументов командной строки.

Send To Toys работает в 64 бит.С Send To Toys вы можете иметь свой скрипт на python и все имена файлов, экранированные оболочкой, помещаться в буфер обмена, когда вы щелкаете правой кнопкой мыши, а затем вставляете созданную команду в оболочку.Я часто использую этот метод, потому что он занимает всего несколько секунд.

Вы также можете добавить ярлык правой кнопкой мыши, изменив настройки реестра, чтобы вызвать команду оболочки (ваш скрипт на python) с выбранными файлами в качестве целей.Вы можете вручную настроить реестр или использовать что-то вроде RightClick Extender .

Немного больше работы, вы можете написать пользовательскую ContextMenu Class форму и ответить на формуна языке .NET.Это будет включать в себя C # или Ironpython.

Если вам действительно нужна реализация типа Pro, вы можете изменить исходный код новой версии с открытым исходным кодом Image Resizer .Исходный текст для C ++ обработчик контекстного меню - здесь .Но эти два последних предложения кажутся гораздо более трудоемкими, чем нужно ...

...