Как щелкнуть правой кнопкой мыши файл в проводнике Windows с помощью AutoIt

Я хочу имитировать щелчок правой кнопкой мыши по файлу. Это можно сделать, открыв окно проводника 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 запускается при открытии окна проводника.


person Joseph Zeng    schedule 12.03.2012    source источник
comment
Какое это имеет отношение к C#, если вы используете AutoIt? И почему вы хотите щелкнуть правой кнопкой мыши файл? Чтобы открыть контекстное меню, вы можете написать сценарий, чтобы использовать клавишу меню.   -  person Qtax    schedule 12.03.2012
comment
Вы хотите щелкнуть правой кнопкой мыши файл/папку?   -  person Ripon Al Wasim    schedule 28.03.2014


Ответы (3)


Похоже, вы неправильно подходите к проблеме, поэтому я отвечу на то, что вы спрашиваете и что вы должны спрашивать.

Во-первых, эта строка кода недействительна, и это не то, что вам нужно. Вы хотите автоматизировать окно проводника, и 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 более чем способен. Все зависит от того, какой элемент вы хотите нажать. Если это один из первых пунктов для открытия файла в различных программах, то это так же просто:

  1. Используя ShellExecute, установите параметр глагола на то, что вы хотите сделать.
  2. Проверка реестра, чтобы найти точную командную строку, используемую программой. Для этого вам нужно будет найти под HKCR\.ext, где ext — это расширение файла, значением по умолчанию будет имя другого ключа в HKCR, у которого есть действия и значок, связанные с типом файла. Это довольно хорошо задокументировано в Интернете, так что погуглите.

Если действие не является одним из действий программы (так встроено в проводник), то это немного сложнее. Обычно лучший способ — заглянуть в диспетчер задач при запуске программы и посмотреть, что она запускает. Другие вещи можно найти в Интернете, например (un)ziping. Такие действия, как копирование, удаление, переименование, создание ярлыка, отправка... Все они могут выполняться непосредственно из AutoIt с помощью различных функций File*.

Имея больше информации, можно было бы оказать вам более конкретную помощь.

person Matt    schedule 12.03.2012
comment
Привет Мэт. Спасибо за ответ. Я понимаю, откуда вы. К сожалению, мой клиент хочет, чтобы мышь перемещалась к файлу и выполняла такие действия, как щелчок правой кнопкой мыши, двойной щелчок и т. д. и т. д. - person Joseph Zeng; 13.03.2012
comment
@JosephZeng, в этом случае первая часть моего ответа должна быть правильной. - person Matt; 13.03.2012
comment
Это работает, как указал @Mat. Вы действительно можете просто добавить имя файла к пути к файлу, как он продемонстрировал. Если вы хотите использовать клавиатуру, вы можете использовать ControlSend("", "", $hList, "<filename>+{F10}"), а затем использовать клавиши со стрелками (возможно, с некоторыми Sleep(333) между ними, чтобы действие было более заметным для вашего клиента. В качестве альтернативы MouseClick может изменяться в зависимости от скорости. - person Samoth; 13.03.2012
comment
О, и если расширенный класс [CLASS:SysListView32; INSTANCE:1] не работает, я использовал [CLASS:DirectUIHWND; INSTANCE:3], который работал для меня... попробуйте и оцените этот комментарий, если он работает. ;-) - person Samoth; 13.03.2012

Во-первых, вы можете взглянуть на Microsoft Active Accessibility SDK. В частности, посмотрите на этот интерфейс...

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

Вы можете использовать это, чтобы просмотреть элементы в элементе управления и найти тот, у которого есть имя файла, которое вы ищете, и его расположение на экране.

Оттуда, возможно, попробуйте что-то подобное для имитации правого щелчка.

Как я могу использовать автоматизировать щелчок правой кнопкой мыши в Windows 7?

После того, как вы сделали правый щелчок, снова используйте специальные возможности, чтобы найти нужный параметр в контекстном меню.

Может быть, есть более простой способ, вы должны быть в состоянии собрать что-то вроде этого, если вы его не найдете. Удачи!

person Steve Sheldon    schedule 12.03.2012

Предположим, у меня есть файл с именем test.txt на диске D. Для открытия контекстного меню необходимо щелкнуть правой кнопкой мыши. Для этого должен работать следующий код:

Local $filepath = "D:\test.txt"
Local $iPid = Run("explorer.exe /n,/e,/select," & $filepath)
ProcessWait($iPid)
Sleep(1000)
Send('+{F10}')
person Ripon Al Wasim    schedule 28.03.2014