Эмуляция нажатия клавиш

GATSBY

Client
Регистрация
29.12.2015
Сообщения
23
Благодарностей
3
Баллы
3
Возникла необходимость эмулировать нажатие клавиш Shift+TAB и Ctrl+ENTER в некоторых полях формы. Насколько я понял, сделать это средствами стандартного действия "Эмулятор клавиатуры" невозможно (буду рад, если ошибаюсь).

Поиском по форуму нашёл рекомендацию попробовать использовать метод KeyEvent и пример его использования в документации:

Код:
instance.ActiveTab.KeyEvent("a", "press", "ctrl");
Именно в таком виде у меня этот код работает - выделяется всё содержимое элемента. Попробовал изменить этот пример под нужную мне задачу, но, увы, ни одна из следующих строк не работает:

Код:
instance.ActiveTab.KeyEvent("{TAB}", "press", "shift");
instance.ActiveTab.KeyEvent(@"{TAB}", "press", "shift");
instance.ActiveTab.KeyEvent("+{TAB}", "press", "");
То есть код выполняется без ошибок, но нужного эффекта на активный элемент формы не оказывает.

Пожалуйста, подскажите, что я делаю не так? Возможно, есть более тривиальный способ эмулировать нажатие служебных клавиш с модификаторами, просто я его не нашёл?

Напомню, сейчас передо мной стоит задача нажать Shift+TAB и Ctrl+ENTER.
 

GATSBY

Client
Регистрация
29.12.2015
Сообщения
23
Благодарностей
3
Баллы
3
К сожалению, в документации к методу KeyEvent не сказано, как именно нужно передавать в него значения управляющих клавиш. Сказано лишь, что все параметры имеют тип System.String. С помощью логических умозаключений пришёл к такой конструкции:

Код:
char c = char(9); // ASCII код клавиши TAB
instance.ActiveTab.KeyEvent(c.ToString(), "press", "shift");

Вопреки моим ожиданиям, выполнение этого кода вызывает горизонтальную табуляцию в поле ввода. Использование же ASCII кода 11 (вертикальная табуляция) добавляет туда квадратик...
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113

GATSBY

Client
Регистрация
29.12.2015
Сообщения
23
Благодарностей
3
Баллы
3
Dimionix, огромное спасибо!

Попробовал так:
Код:
instance.ActiveTab.KeyEvent(System.Windows.Input.Key.Tab, "press", "");
Результат:

Ошибка в действии "CS0234" "The type or namespace name 'Key' does not exist in the namespace 'System.Windows.Input' (are you missing an assembly reference?)". [Строка: 1; Cтолбец: 50]

Хотя в MSDN (по ссылке выше) сказано, что это перечисление там есть...

UPD: Добавление строки
Код:
using System.Windows.Input.Key;
в "Директивы using и общий код" также не помогло:




Правда после этого в сообщении об ошибке номер строки изменился на -9. Теперь даже не знаю, где такую строку искать o_O

 
Последнее редактирование:
  • Спасибо
Реакции: Dimionix

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113
Я так понимаю, что из System.Windows.Input.Key просто брать названия символов для метода Tab.KeyEvent. Т.е., по идее, должно работать так:
Код:
instance.ActiveTab.KeyEvent("LeftShift", "press", "Tab");
instance.ActiveTab.KeyEvent("RightCtrl", "press", "Enter");
Вот rostonix об этом писал: http://zennolab.com/discussion/threads/dejstvie-ehmuljacija-klaviatury-dobavit-esc.17480/#post-123551
Но не срабатывает почему-то.
 
  • Спасибо
Реакции: GATSBY

GATSBY

Client
Регистрация
29.12.2015
Сообщения
23
Благодарностей
3
Баллы
3
Я из описания понял, что первый параметр - это название клавиши, а третий - модификатор, который can be "alt", "ctrl", "shift", or empty string (not use the key modifier). То есть в идеале должно работать так:
Код:
instance.ActiveTab.KeyEvent("Tab", "press", "shift");
instance.ActiveTab.KeyEvent("Enter", "press", "ctrl");
Но на практике не работает ни мой вариант, ни ваш. Увы.
 
  • Спасибо
Реакции: Dimionix

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113
Я тоже так пробовал.

Нужен ответ кого-то из Команды форума.

Мне вот тоже стало интересно, почему не работает или как правильно это дело нужно обставить.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 352
Благодарностей
3 279
Баллы
113
Оставлю примеры:
Код:
instance.ActiveTab.KeyEvent("V", "press", "ctrl");
instance.ActiveTab.KeyEvent("Tab", "press", "alt");
instance.ActiveTab.KeyEvent("S", "press", "shift");
instance.ActiveTab.KeyEvent("V", "down", ""); // нажать
instance.ActiveTab.KeyEvent("V", "up", ""); // отпустить
Примеры клавиш
wiki
 

Polina

Client
Регистрация
29.05.2015
Сообщения
37
Благодарностей
1
Баллы
8
Как эмулировать скролл мыши? Или Num+/Num- ?
Вообще замечено, что браузер PM не реагирует на CTRL + Num+/Num-, а вот на CTRL+Скролл реагирует

Задачей является изменить масштаб страницы, возможно ли это реализивать через KeyEvent ?
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 340
Благодарностей
298
Баллы
83
Что-то у меня при вставке текста из буфера, не срабатывает "\r\n\"
ПРИМЕР: "Какой-то текст, текст, текст \r\n Новый текст, новый текст, новый текст " - это берётся из буфера, вставляется в поле ввода вместе с \r\n, они не исчезают, новая строка не появляется

Подскажите, как лечить?
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113
Подскажите, как лечить?
C#:
string str = project.Variables["Text"].Value;
string[] split = str.Split(new string[] { @"\r\n" }, StringSplitOptions.RemoveEmptyEntries);
lock (SyncObject) {
    for (int i = 0; i < split.Count(); i++) {
        System.Windows.Forms.Clipboard.SetText(split[i]);
        instance.ActiveTab.KeyEvent("v","press","ctrl");
        if (i < split.Count() - 1)
            instance.SendText("{ENTER}", 1);
    }
}
 
  • Спасибо
Реакции: kagorec и Valiksim

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 340
Благодарностей
298
Баллы
83
@Dimionix , спасибо, как всегда всё отлично работает
Остался вопрос или два. Есть код тут на форуме, в котором происходят ещё несколько событий
C#:
lock(SyncObjects.InputSyncer) // блокировка
{
    var descr = project.Variables["content"].Value;
    // сохраняем предыдущее состояние буфера
    String previous_text = null;
    previous_text = System.Windows.Forms.Clipboard.GetText();
    // сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
    System.Windows.Forms.Clipboard.SetText(descr);
    instance.ActiveTab.KeyEvent("v","press","ctrl");
    // стираем буфер и возвращаем его к первоначальному состоянию
    System.Windows.Forms.Clipboard.Clear();
    System.Windows.Forms.Clipboard.SetText(previous_text);
}
1. Сохранение состояния буфера
2. Затем, в конце очищение буфера
3. Возвращение предыдущего состояния буфера

- Чем такой код лучше/хуже, и нужно ли это делать?
- Другое, блокировка, после окончания цикла будет снята автоматически? Я правильно понимаю? Этот код пригоден для многопотока?
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113
- Чем такой код лучше/хуже, и нужно ли это делать?
Ну если не принципиально сохранять в буфере те данные, которые в нем находились до работы сниппета, то в принципе ничем.
Но, думаю, так лучше будет:
C#:
string str = project.Variables["Text"].Value;
string[] split = str.Split(new string[] { @"\r\n" }, StringSplitOptions.RemoveEmptyEntries);

lock (SyncObjects.InputSyncer) {
    // Сохраняем предыдущее состояние буфера
    string previous_text = System.Windows.Forms.Clipboard.GetText();
    // Сохраняем нужный текст в буфер и вставляем его (программно делаем CTRL+V)
    for (int i = 0; i < split.Count(); i++) {
        System.Windows.Forms.Clipboard.SetText(split[i]);
        instance.ActiveTab.KeyEvent("v", "press", "ctrl");
        if (i < split.Count() - 1)
            instance.SendText("{ENTER}", 1);
    }
    // Очищаем буфер и возвращаем его к первоначальному состоянию
    System.Windows.Forms.Clipboard.Clear();
    System.Windows.Forms.Clipboard.SetText(previous_text);
}
 
Последнее редактирование:
  • Спасибо
Реакции: kagorec и Valiksim

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 340
Благодарностей
298
Баллы
83
Не принципиально. Одно только мешало в этом коде, что если работаешь на компе и публикуешь, то данные могли перескочить оттуда-сюда или наоборот.
Буду использовать этот код
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Подскажите плиз, как на C# реализовать множественный выбор из списка?
Скрин списка прилагаю, на форуме нашел такой код:
Код:
var key1 = "key-2.txt";
var eselect = instance.ActiveTab.FindElementById("field2");
int i=0;
var options = eselect.GetChildren(false).Elements;
for(; i<options.Length; i++)
    if(options[i].GetAttribute("value") == key1)
        break;
if(i > options.Length)
    throw new Exception(key1+ " не найден в выпадающем списке)");
eselect.SetAttribute("value", i.ToString());
Станций более 60, как сделать правильно?
Спасибо.
 

Вложения

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 340
Благодарностей
298
Баллы
83
Подскажите плиз, как на C# реализовать множественный выбор из списка?
Не совсем понимаю, что означает "множественный выбор?",- может быть, имеется ввиду, "HtmlElementCollection"?

У меня вот схожий вопрос,- как можно заставить выползти выпадающий список, если он работает ("выпадает") при наведении мышки. Без клика? XPath сгодится в данном случае? С последующим выбором элемента
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113
  • Спасибо
Реакции: Valiksim

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Множественный выбор, это когда нужно с зажатым CTRL выбрать несколько пунктов в разных местах списка, это если действовать при помощи мыши и клавиатуры, а как сделать в зенке? Список уже раскрыт, т.е. наводить мышь не нужно, просто вытаскиваем значения и кладем их в отдельный список, т.к. их много, и далее, перебирая построчно список отмечаем нужные элементы в имеющейся форме. Вопрос, как это реализовать? Можно без c#.
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Нашел кусок кода по перебору и объединению списков, возможно пригодиться.
Код:
var listA = project.Lists["cache1"];
var listB = project.Lists["cache2"];
var listResult = project.Lists["search"];
for (int i=0; i<listA.Count; i++) {
    for (int t=0; t<listB.Count; t++) {
        listResult.Add(listA[i] + " " + listB[t]);
    }
}
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 099
Баллы
113
Множественный выбор, это когда нужно с зажатым CTRL выбрать несколько пунктов в разных местах списка, это если действовать при помощи мыши и клавиатуры, а как сделать в зенке? Список уже раскрыт, т.е. наводить мышь не нужно, просто вытаскиваем значения и кладем их в отдельный список, т.к. их много, и далее, перебирая построчно список отмечаем нужные элементы в имеющейся форме. Вопрос, как это реализовать? Можно без c#.
http://zennolab.com/discussion/threads/mnozhestvennoe-vydelenie-v-spiske.24815/
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
Спасибо за ссылку, тему видел, но проблему решить не смог.
 

goldfish

Client
Регистрация
06.06.2011
Сообщения
209
Благодарностей
17
Баллы
18
а как выполнить чтобы нажималась только клавиша Tab
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 361
Благодарностей
8 646
Баллы
113

catol

Client
Регистрация
05.07.2012
Сообщения
277
Благодарностей
98
Баллы
28

SlavenTyz

Client
Регистрация
30.04.2018
Сообщения
1 013
Благодарностей
29
Баллы
48
Подскажите как про эмулировать нажатие стрелки вниз
 

obyavkaby

Client
Регистрация
26.05.2017
Сообщения
187
Благодарностей
17
Баллы
18

gashasty

Client
Регистрация
28.02.2019
Сообщения
22
Благодарностей
3
Баллы
3

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 361
Благодарностей
8 646
Баллы
113
Кто-то задавался вопросом нажатия 3х клавиш? Есть готовые решения?

CTRL + ALT + N - столкнулся с такой проблемой.
Начиная с версии 5.29.2.0 появился способ с модификаторами.

upload_2019-6-10_13-21-16.png
 
  • Спасибо
Реакции: catol

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 361
Благодарностей
8 646
Баллы
113

Omi4Sem

Client
Регистрация
20.11.2019
Сообщения
23
Благодарностей
2
Баллы
3
Не сообразил как сочетание клавиш сделать "ctrl+alt+1" ?
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)