• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

C# Еще один вариант вставки текста во внешнее приложение (вариант 2)

Я когда-то писал статью о передаче текста во внешнее приложение. Там использовалась функция PostMessageW, которая посимвольно передавала текст в окно содержащее фокус ввода. Сейчас я покажу второй вариант, который кардинально отличается от первого.

Для начала нам понадобиться помощник для работы с буфером обмена. Я взял код работы с буфером обмена отсюда. С помощью него, мы будем сохранять объект из буфера и после вставки возвращать его обратно.

В общем реализация выглядит так:
- окно, в которое необходимо передать текст, активно;
- вызывается наше приложение, вводится текст;
- закрываем окно, чтобы предыдущее приложение получило фокус ввода;
- во временную переменную сохраняем содержимое буфера обмена;
- в буфер обмена помещаем свой текст;
- эмулируем нажатие кнопок Ctrl+V;
- возвращаем содержимое буфера обмена из временной переменной.

Вот такая получается у нас схема. Пример к статье, содержит все необходимое для работы. А функция вставки выглядит следующим образом:

1 [DllImport("user32.dll")]
2 public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);
3  
4 ReadOnlyCollection<DataClip> clipData;
5 private void pasteText(string text)
6 {
7     //закрываем текущее приложение
8     Close();
9     //копируем из буфера обмена в переменную
10     clipData = ClipboardHelper.GetClipboard();
11     //вставляем текст в буфер
12     Clipboard.SetDataObject(text, true);
13     //эмулируем нажатие Ctrl+V
14     keybd_event(VK_CONTROL, 0, 0, 0);
15     keybd_event((byte)'V', 0, 0, 0);
16     keybd_event((byte)'V', 0, WM_KEYUP, 0);
17     keybd_event(VK_CONTROL, 0, WM_KEYUP, 0);
18     //возвращаем объект обратно
19     ClipboardHelper.SetClipboard(clipData);
20 }

Для эмуляции нажатия кнопок используется функция keybd_event. В процессе тестирования она лучше работала, чем SendMessage.

Преимущества этого метода реализации:
- возможность передать приложению RTF-текст;
- передача текста независимо от того, можно ли получить дескриптор окна. Нам не нужно знать, где находится фокус ввода;
- должно работать во всех версиях Windows.

Заключение

Ниже вы можете скачать тестовый проект. И обязательно прочитайте как запускать.

Важно! Как запускать:
- создайте ярлык на рабочем столе на exe-файл проекта;
- в свойствах ярлыка назначьте горячие клавиши для запуска;
- поставьте курсор в какое-то поле ввода и нажмите заранее заданную комбинацию клавиш ярлыка;
- введите текст и нажмите вставить.