Использование AppActivate и Sendkeys в команде оболочки VBA - PullRequest
6 голосов
/ 13 января 2011

Я хочу переключаться между приложениями с помощью команды оболочки в VBA.Я использую SendKeys, чтобы делать что-то в процессе A, затем переходить к процессу B, затем к процессу A, затем к процессу B. Он отлично работает для первой итерации.Когда я использую AppActivate для возврата к процессу B, он фактически переключает фокус обратно на процесс B. ОДНАКО он игнорирует последующие команды от SendKeys.

Пример кода:

Sub pastePDF2TXT_v3(pdfName As String, txtName As String)


Dim acrobatID
Dim acrobatInvokeCmd As String
Dim acrobatLocation As String

Dim notepadID

Dim acrobatID2
Dim notepadID2

Debug.Print "here"


acrobatLocation = "C:\Program Files\Adobe\Acrobat 9.0\Acrobat\Acrobat.exe"

acrobatInvokeCmd = acrobatLocation & " " & pdfName

acrobatID = Shell(acrobatInvokeCmd, 1)
AppActivate acrobatID
SendKeys "^a", True  '^A selects everything already in the pdf file.
SendKeys "^c", True  '^C copies the selection to the clipboard.



notepadID = Shell("NOTEPAD.EXE " & txtName, 1)  ' invoke notepad on the text file.
AppActivate notepadID                           ' set the new app as teh active task.

SendKeys "^a", True  '^A selects everything already in the text file.
SendKeys "^v", True  '^V pastes the new stuff over the top of the old text file (deleting the old stuff)
SendKeys "%{END}", True ' makre sure last line of text file 
SendKeys "{ENTER}", True



AppActivate acrobatID  ' NOTE: APPEARS TO WORK UP TO THIS POINT.

SendKeys "{ENTER}", True  ' NOTE: SECOND APP IGNORES SUBSEQUENT COMMANDS FROM HERE DOWN.
SendKeys "^a", True  '^A selects everything already in the pdf file.
SendKeys "^c", True  '^C copies the selection to the clipboard.
SendKeys "%f", True  'alt f, x to exit Notepad.exe
SendKeys "x", True
'acrobatID.Quit


Debug.Print "start second"

AppActivate notepadID                           ' set the new app as teh active task.


SendKeys "%{END}", True 'Go to end of text file.
SendKeys "^v", True  '^V pastes the new stuff at end of file.
SendKeys "{ENTER}", True

SendKeys "^s", True   

SendKeys "%f", True   'alt f, x to exit Notepad.exe
SendKeys "x", True

notepadID.Quit
acrobatID.Quit

End Sub

Ответы [ 5 ]

4 голосов
/ 25 января 2012

Я знаю, что этот вопрос старый, но я столкнулся с той же проблемой, но я не думаю, что был выбран правильный ответ.

Когда вы вызываете AppActivate, скрипт продолжаетсяостановка, ожидающая завершения целевого приложения.После завершения приложения сценарий продолжается.Я не вижу решения этой проблемы.

РЕДАКТИРОВАТЬ:

Я использую пакетный файл для вызова CSCRIPT для команды AppActivate, и я заметил, что вы строго используете файл VBS.Попробуйте вызвать CMD как новое окно и передайте CSCRIPT //NoLogo //B WScript.CreateObject("WSCript.shell").AppActivate("Window Name") в качестве аргумента, и посмотрите, обойдёт ли это проблему.

2 голосов
/ 13 января 2014

После нескольких часов исследований на различных форумах я понял, что не смогу использовать объекты и функции библиотеки Adobe в Adobe Reader. Единственным приемлемым вариантом оставалось использование команд оболочки для использования опции «сохранить как текст», доступной в меню файлов Adobe Reader. Сочетание клавиш: Alt + f + a + x + s . Я реализовал их в приведенном ниже коде, который отлично работал, хотя мне было необходимо вставить задержки в некоторых шагах.

Sub SavePDFasText()
Dim AdobeReaderPath As String
Dim PdfFilePath As String
Dim PDFid, NotepdId As Double

AdobeReaderPath = "C:\Program Files\Adobe\Reader 10.0\Reader\AcroRd32.exe"
PdfFilePath = "D:\PowerGenMacro\opm_11.pdf"
PDFid = Shell(AdobeReaderPath & " " & PdfFilePath, vbNormalFocus)
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 5)
'Alt+f+a+x is required to save the pdf as text in the adobe reader
SendKeys "%(FAX)", True
Application.Wait TimeSerial(Hour(Now()), Minute(Now()), Second(Now()) + 2)
SendKeys "%S", True
SendKeys "^q", True

End Sub
2 голосов
/ 17 августа 2012

Точно так же я пытался использовать AppActivate в документе PDF, который я открыл с помощью команды оболочки, чтобы я мог использовать SendKeys для него. Это всегда будет генерировать ошибку времени выполнения «5». Моим решением, в конце концов, было вообще НЕ использовать AppActivate, фактически открытие документа в любом случае выводит его на передний план. Проблема в том, что оператор SendKeys выполняется сразу после команды оболочки, но для открытия pdf требуется секунда или две. Мое решение - приостановить код на пару секунд, прежде чем исключить оператор sendkeys.

Я использовал кратковременную задержку приседания. Проверьте тему здесь: http://www.dbforums.com/microsoft-access/1219379-time-delay-vba.html

2 голосов
/ 10 февраля 2011

Это может быть больше комментарий, чем ответ, но мне не разрешено "комментировать", так что ...

Удивительно, что вы так далеко продвинулись. Скорее всего, вы никогда не сможете сделать эту работу надежно - точка. Как только вы заставите это работать, что-то изменится в поведении пользовательского интерфейса Acrobat в будущем выпуске, или Windows внесет другое изменение в правила для того, какие вещи могут отправлять события в какие-то другие вещи, и тогда вы снова попадете .

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

Итак, вместо того, чтобы пытаться решить эту невозможную техническую проблему, давайте сделаем шаг назад и спросим, ​​чего вы изначально надеялись достичь, выполнив все это. Таким образом, возможно, мы сможем получить вас, куда вы пытаетесь пойти:)

0 голосов
/ 09 октября 2016

Попробуйте sendkeys "% {tab}" для переключения окон, но затем оставьте только 2 активных окна.

или попробуйте активировать только после sendkeys {Tab}, чтобы текстовое поле ввода не было выбрано до переключения окон cmd.

или попробуйте попробовать активировать имя окна, 1, затем переведите 2000 °, чтобы дать время сфокусироваться на этом окне

...