Если ваши приложения находятся только на платформе Windows, вы можете попробовать использовать объекты .net
.
Метод SendWait
объектов SendKeys
позволяет отправлять виртуально любой ключ или комбинацию клавиш для приложения, которое имеет фокус, включая клавиши «модификатора», такие как Alt, Shift, Ctrl и т. д. ...
Первое, что нужно сделать, это импортировать .net
библиотеке, то полный синтаксис для отправки ключа ENTER будет выглядеть следующим образом:
NET.addAssembly('System.Windows.Forms');
System.Windows.Forms.SendKeys.SendWait('{ENTER}'); %// send the key "ENTER"
Если вы делаете это только после полного синтаксиса. Если вы планируете широко использовать команду, вы можете помочь себе с помощью анонимной вспомогательной функции.
Маленький пример с записью
%% // import the .NET assembly and define helper function
NET.addAssembly('System.Windows.Forms');
sendkey = @(strkey) System.Windows.Forms.SendKeys.SendWait(strkey) ;
%% // prepare a few things to send to the notepad
str1 = 'Hello World' ;
str2 = 'OMG ... my notepad is alive' ;
file2save = [pwd '\SelfSaveTest.txt'] ;
if exist(file2save,'file')==2 ; delete(file2save) ; end %// this is just in case you run the test multiple times.
%% // go for it
%// write a few things, save the file then close it.
system('notepad &') ; %// Start notepad, without matlab waiting for the return value
sendkey(str1) %// send a full string to the notepad
sendkey('{ENTER}'); %// send the {ENTER} key
sendkey(str2) %// send another full string to the notepad
sendkey('{! 3}'); %// note how you can REPEAT a key send instruction
sendkey('%(FA)'); %// Send key combination to open the "save as..." dialog
pause(1) %// little pause to make sure your hard drive is ready before continuing
sendkey(file2save); %// Send the name (full path) of the file to save to the dialog
sendkey('{ENTER}'); %// validate
pause(3) %// just wait a bit so you can see you file is now saved (check the titlebar of the notepad)
sendkey('%(FX)'); %// Bye bye ... close the Notepad
Как объясняется в Документация Microsoft для класса SendKeys
иногда может иметь некоторые проблемы с синхронизацией, поэтому, если вы хотите выполнять сложные манипуляции (например, Tab несколько раз, чтобы изменить кнопку, которую вы на самом деле хотите нажать), вам может потребоваться ввести pause
в ваших ответах Matlab на SendKeys
.
Попробуйте без первого, но не забывайте, что вы управляете процессом от другого без какой-либо синхронизации между ними, поэтому выберите все, что может потребовать немного проб и ошибок, прежде чем вы это исправите, по крайней мере для сложных последовательностей (простой должен быть простым).
В моем случае выше, например, я запускаю все свои данные с внешнего жесткого диска с функция ECO, которая переводит ее в режим ожидания, поэтому, когда я называю диалоговое окно «Сохранить как ...», для его отображения требуется время, потому что HDD должен проснуться. Если я не представил pause(1)
, иногда путь к файлу был бы незавершенным (первая часть пути была отправлена до того, как диалог имел фокус) .
Также , не забудьте символ &
при выполнении внешней программы. Все заслуги Луиса Мендо за его выделение. (Я стараюсь забыть, насколько это важно, потому что я использую его по умолчанию.Я только опускаю его, если мне нужно специально ожидать возврата от программы, в противном случае я позволяю ему работать самостоятельно )
Специальные символы имеют специальный код. Вот несколько:
Shift +
Control (Ctrl) ^
Alt %
Tab {TAB}
Backspace {BACKSPACE}, {BS}, or {BKSP}
Validation {ENTER} or ~ (a tilde)
Ins Or Insert {INSERT} or {INS}
Delete {DELETE} or {DEL}
Text Navigation {HOME} {END} {PGDN} {PGUP}
Arrow Keys {UP} {RIGHT} {DOWN} {LEFT}
Escape {ESC}
Function Keys {F1} ... {F16}
Print Screen {PRTSC}
Break {BREAK}
Полный список из Microsoft можно найти здесь здесь
Я не вижу ничего плохого в вашем подходе - я включил код Python, который я использую для архивации команд ниже, и тот же процесс, по-видимому, используется в вашем коде. Это может быть временной ошибкой. Я получил такое же сообщение несколько дней назад, когда некоторые изменения не позволили создать новые каналы (даже в графическом интерфейсе).
import requests
import json
# config file with site-specific values
from config import strClientID, strClientSecret, strGraphAuthURL, strTenantID
postData = {"grant_type": "client_credentials","client_id" : strClientID,"client_secret": strClientSecret,"scope": "https://graph.microsoft.com/.default"}
r = requests.post(strGraphAuthURL, data=postData)
strJSONResponse = r.text
if len(strJSONResponse) > 5:
jsonResponse = json.loads(strJSONResponse)
strAccessToken = jsonResponse['access_token']
getHeader = {"Authorization": "Bearer " + strAccessToken }
postRecord = requests.post("https://graph.microsoft.com/beta/teams/{teamID}/archive",headers={"Authorization": "Bearer " + strAccessToken})
print("HTTP Status Code:\t%s\nResult code content:\t%s" % (postRecord.status_code, postRecord.content))