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

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 139
Баллы
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 139
Баллы
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 139
Баллы
113
Я тоже так пробовал.

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

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

Yuriy Zymlex

Client
Регистрация
24.10.2016
Сообщения
6 713
Благодарностей
3 473
Баллы
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 344
Благодарностей
300
Баллы
83
Что-то у меня при вставке текста из буфера, не срабатывает "\r\n\"
ПРИМЕР: "Какой-то текст, текст, текст \r\n Новый текст, новый текст, новый текст " - это берётся из буфера, вставляется в поле ввода вместе с \r\n, они не исчезают, новая строка не появляется

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

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 139
Баллы
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 344
Благодарностей
300
Баллы
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 139
Баллы
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 344
Благодарностей
300
Баллы
83
Не принципиально. Одно только мешало в этом коде, что если работаешь на компе и публикуешь, то данные могли перескочить оттуда-сюда или наоборот.
Буду использовать этот код
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
99
Баллы
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 344
Благодарностей
300
Баллы
83
Подскажите плиз, как на C# реализовать множественный выбор из списка?
Не совсем понимаю, что означает "множественный выбор?",- может быть, имеется ввиду, "HtmlElementCollection"?

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

Dimionix

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

Severip

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

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
99
Баллы
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 139
Баллы
113
Множественный выбор, это когда нужно с зажатым CTRL выбрать несколько пунктов в разных местах списка, это если действовать при помощи мыши и клавиатуры, а как сделать в зенке? Список уже раскрыт, т.е. наводить мышь не нужно, просто вытаскиваем значения и кладем их в отдельный список, т.к. их много, и далее, перебирая построчно список отмечаем нужные элементы в имеющейся форме. Вопрос, как это реализовать? Можно без c#.
http://zennolab.com/discussion/threads/mnozhestvennoe-vydelenie-v-spiske.24815/
 

Severip

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

goldfish

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

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
22 494
Благодарностей
10 032
Баллы
113

catol

Client
Регистрация
05.07.2012
Сообщения
283
Благодарностей
100
Баллы
43

SlavenTyz

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

obyavkaby

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

gashasty

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

Sergodjan

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

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

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

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
22 494
Благодарностей
10 032
Баллы
113

Omi4Sem

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

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