Я должен автоматизировать программу, которая находится вне моего контроля. Я делаю это, используя SendKeys.SendWait("keys")
для другой программы. Проблема в том, что есть несколько полей, которые могут быть активными, и нет способа выбрать одно из них с уверенностью. Все поля имеют разную длину, поэтому мое решение - скопировать что-то действительно длинное, скопировать его в буфер обмена и посмотреть на последний символ, который его создал, поэтому я знаю, какое поле выбрано в другой программе. Это переопределяет буфер обмена, к сожалению.
Итак, мне нужно сделать эти вещи.
- Скопируйте содержимое буфера обмена, которое может быть любым, в переменную.
- Отправьте кучу вещей в другую программу и скопируйте ее. Затем используйте это, чтобы делать другие вещи.
- Скопируйте первую переменную обратно в буфер обмена.
В идеале, он мог бы скопировать что угодно из буфера обмена (изображения, текст, форматированный текст) и поместить его обратно, как будто ничего не произошло. Вот то, что я получил до сих пор, но оно стирает все, что находится в буфере обмена, или заменяет его чем-то особенным, что нельзя вставить обратно в блокнот.
AppActivate("OtherProgram")
Dim oldClipboard As IDataObject = Clipboard.GetDataObject
//'Type long stuff, select all, cut to clipboard
SendKeys.SendWait("{ESC}{F3}1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "+{HOME}^x")
Dim selectedFieldText As String = Clipboard.GetText
Dim lastChar As String = selectedFieldText.Substring(selectedFieldText.Length - 1, 1)
Select Case lastChar
Case "4"
//'do nothing. We're in the correct field.
Case "J"
SendKeys.SendWait("+{TAB}")
Case "O"
SendKeys.SendWait("+{TAB}+{TAB}")
//'...and so on
End Select
//'Send data to the correct field in "OtherProgram"
Clipboard.SetDataObject(oldClipboard)