Есть ли способ вводить события клавиатуры из приложения командной строки?

#dart

#dart

Вопрос:

Это может показаться небольшим наброском, но я пытаюсь автоматизировать небольшое неудобство, которое у меня есть.

Каждый день в начале дня я хочу начать чат по Skype с определенной группой людей.

Я создал приложение, поэтому я могу просто ввести chat daily в командной строке, и оно автоматически создаст чат. Проблема в том, что это просто пустой чат, и мне нужно запустить чат с тем же сообщением. Я хочу иметь возможность передавать -m флаг приложению, за которым следует сообщение, которое должно быть отправлено всем. Проблема в том, что можно получить этот текст в чат Skype.

Вот мои мысли о том, как это можно было бы сделать:

  1. Отправляйте события клавиатуры так, чтобы текст вводился в текстовое поле, а затем отправлялся в чат.
  2. Добавьте сообщение в буфер обмена, а затем вставьте сообщение. Если я не могу заставить его отправлять текст, и мне приходится нажимать вручную [enter] , я согласен с этим.
  3. Наконец, если уже нет способа отправлять события клавиатуры, гораздо более сложным подходом было бы каким-то образом эмулировать клавиатуру в системе.

Итак, в основном я хочу знать, есть ли способ управлять буфером обмена системы (копировать / вставить) или есть ли способ отправлять нажатия клавиш в систему.

Если у вас есть какие-либо другие идеи о том, как это или если это может быть достигнуто, я хотел бы услышать.

Заранее большое спасибо

Комментарии:

1. Какая ОС? Windows?

2. Да, я забыл упомянуть, что это будет работать в Windows

Ответ №1:

Взгляните на пакет win32, который имеет некоторые привязки из Win32 Windows Api к Dart, в нем есть множество примеров, но то, что вам нужно, должно быть чем-то вроде этого:

   final kbd = KEYBDINPUT.allocate();

  // Send the A key.
  kbd.wVk = VK_A;
  var result = SendInput(
      1, Pointer.fromAddress(kbd.addressOf.address), sizeOf<KEYBDINPUT>());
  if (result != 1) print('Error: ${GetLastError()}');

  kbd.dwFlags = KEYEVENTF_KEYUP;
  result = SendInput(
      1, Pointer.fromAddress(kbd.addressOf.address), sizeOf<KEYBDINPUT>());
  if (result != 1) print('Error: ${GetLastError()}');
  

(изhttps://github.com/timsneath/win32/blob/master/example/sendinput.dart#L20-L30 )