Я когда-то писал статью о передаче текста во внешнее приложение. Там использовалась функция PostMessageW, которая посимвольно передавала текст в окно содержащее фокус ввода. Сейчас я покажу второй вариант, который кардинально отличается от первого.
Для начала нам понадобиться помощник для работы с буфером обмена. Я взял код работы с буфером обмена отсюда. С помощью него, мы будем сохранять объект из буфера и после вставки возвращать его обратно.
В общем реализация выглядит так:
- окно, в которое необходимо передать текст, активно;
- вызывается наше приложение, вводится текст;
- закрываем окно, чтобы предыдущее приложение получило фокус ввода;
- во временную переменную сохраняем содержимое буфера обмена;
- в буфер обмена помещаем свой текст;
- эмулируем нажатие кнопок Ctrl+V;
- возвращаем содержимое буфера обмена из временной переменной.
Вот такая получается у нас схема. Пример к статье, содержит все необходимое для работы. А функция вставки выглядит следующим образом:
1 |
[DllImport( "user32.dll" )] |
2 |
public static extern void keybd_event( byte bVk, byte bScan, uint dwFlags, int dwExtraInfo); |
4 |
ReadOnlyCollection<DataClip> clipData; |
5 |
private void pasteText( string text) |
10 |
clipData = ClipboardHelper.GetClipboard(); |
12 |
Clipboard.SetDataObject(text, true ); |
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); |
19 |
ClipboardHelper.SetClipboard(clipData); |
Для эмуляции нажатия кнопок используется функция keybd_event. В процессе тестирования она лучше работала, чем SendMessage.
Преимущества этого метода реализации:
- возможность передать приложению RTF-текст;
- передача текста независимо от того, можно ли получить дескриптор окна. Нам не нужно знать, где находится фокус ввода;
- должно работать во всех версиях Windows.
Заключение
Ниже вы можете скачать тестовый проект. И обязательно прочитайте как запускать.
Важно! Как запускать:
- создайте ярлык на рабочем столе на exe-файл проекта;
- в свойствах ярлыка назначьте горячие клавиши для запуска;
- поставьте курсор в какое-то поле ввода и нажмите заранее заданную комбинацию клавиш ярлыка;
- введите текст и нажмите вставить.