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

  • Автор темы Автор темы GATSBY
  • Дата начала Дата начала

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.
 
К сожалению, в документации к методу KeyEvent не сказано, как именно нужно передавать в него значения управляющих клавиш. Сказано лишь, что все параметры имеют тип System.String. С помощью логических умозаключений пришёл к такой конструкции:

Код:
Развернуть Свернуть Копировать
char c = char(9); // ASCII код клавиши TAB
instance.ActiveTab.KeyEvent(c.ToString(), "press", "shift");


Вопреки моим ожиданиям, выполнение этого кода вызывает горизонтальную табуляцию в поле ввода. Использование же ASCII кода 11 (вертикальная табуляция) добавляет туда квадратик...
 
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 и общий код" также не помогло:

2484864

2484867


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

2484870
 
Последнее редактирование:
  • Спасибо
Реакции: Dimionix
Я так понимаю, что из System.Windows.Input.Key просто брать названия символов для метода Tab.KeyEvent. Т.е., по идее, должно работать так:
Код:
Развернуть Свернуть Копировать
instance.ActiveTab.KeyEvent("LeftShift", "press", "Tab");
instance.ActiveTab.KeyEvent("RightCtrl", "press", "Enter");
Вот rostonix об этом писал: http://zennolab.com/discussion/thre...ija-klaviatury-dobavit-esc.17480/#post-123551
Но не срабатывает почему-то.
 
  • Спасибо
Реакции: GATSBY
Я из описания понял, что первый параметр - это название клавиши, а третий - модификатор, который 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
Я тоже так пробовал.

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

Мне вот тоже стало интересно, почему не работает или как правильно это дело нужно обставить.
 
Оставлю примеры:
Код:
Развернуть Свернуть Копировать
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
 
Как эмулировать скролл мыши? Или Num+/Num- ?
Вообще замечено, что браузер PM не реагирует на CTRL + Num+/Num-, а вот на CTRL+Скролл реагирует

Задачей является изменить масштаб страницы, возможно ли это реализивать через KeyEvent ?
 
Что-то у меня при вставке текста из буфера, не срабатывает "\r\n\"
ПРИМЕР: "Какой-то текст, текст, текст \r\n Новый текст, новый текст, новый текст " - это берётся из буфера, вставляется в поле ввода вместе с \r\n, они не исчезают, новая строка не появляется

Подскажите, как лечить?
 
Подскажите, как лечить?
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
@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. Возвращение предыдущего состояния буфера

- Чем такой код лучше/хуже, и нужно ли это делать?
- Другое, блокировка, после окончания цикла будет снята автоматически? Я правильно понимаю? Этот код пригоден для многопотока?
 
- Чем такой код лучше/хуже, и нужно ли это делать?
Ну если не принципиально сохранять в буфере те данные, которые в нем находились до работы сниппета, то в принципе ничем.
Но, думаю, так лучше будет:
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
Не принципиально. Одно только мешало в этом коде, что если работаешь на компе и публикуешь, то данные могли перескочить оттуда-сюда или наоборот.
Буду использовать этот код
 
Подскажите плиз, как на 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, как сделать правильно?
Спасибо.
 

Вложения

  • 2017-03-26_182847.jpg
    2017-03-26_182847.jpg
    9,8 KB · Просмотры: 25
Подскажите плиз, как на C# реализовать множественный выбор из списка?
Не совсем понимаю, что означает "множественный выбор?",- может быть, имеется ввиду, "HtmlElementCollection"?

У меня вот схожий вопрос,- как можно заставить выползти выпадающий список, если он работает ("выпадает") при наведении мышки. Без клика? XPath сгодится в данном случае? С последующим выбором элемента
 
как можно заставить выползти выпадающий список, если он работает ("выпадает") при наведении мышки.
Попробуй вызвать событие onmouseover на элементе, затем click
 
  • Спасибо
Реакции: Valiksim
Множественный выбор, это когда нужно с зажатым CTRL выбрать несколько пунктов в разных местах списка, это если действовать при помощи мыши и клавиатуры, а как сделать в зенке? Список уже раскрыт, т.е. наводить мышь не нужно, просто вытаскиваем значения и кладем их в отдельный список, т.к. их много, и далее, перебирая построчно список отмечаем нужные элементы в имеющейся форме. Вопрос, как это реализовать? Можно без c#.
 
Нашел кусок кода по перебору и объединению списков, возможно пригодиться.
Код:
Развернуть Свернуть Копировать
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]);
    }
}
 
Множественный выбор, это когда нужно с зажатым CTRL выбрать несколько пунктов в разных местах списка, это если действовать при помощи мыши и клавиатуры, а как сделать в зенке? Список уже раскрыт, т.е. наводить мышь не нужно, просто вытаскиваем значения и кладем их в отдельный список, т.к. их много, и далее, перебирая построчно список отмечаем нужные элементы в имеющейся форме. Вопрос, как это реализовать? Можно без c#.
http://zennolab.com/discussion/threads/mnozhestvennoe-vydelenie-v-spiske.24815/
 
Спасибо за ссылку, тему видел, но проблему решить не смог.
 
а как выполнить чтобы нажималась только клавиша Tab
 
Подскажите как про эмулировать нажатие стрелки вниз
 
Кто-то задавался вопросом нажатия 3х клавиш? Есть готовые решения?

CTRL + ALT + N - столкнулся с такой проблемой.

Начиная с версии 5.29.2.0 появился способ с модификаторами.

upload_2019-6-10_13-21-16.png
 
  • Спасибо
Реакции: catol
Не сообразил как сочетание клавиш сделать "ctrl+alt+1" ?
 

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