3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
1

Програмный ввод текста в другую программу

23.02.2012, 10:32. Показов 6884. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всех с 23 февраля!!! Приветствую вас, я опять вернулся
Я работаю в C++ Builder 6. Я бы хотел бы узнать, как программно вводить текст. Например "абвгдйка". HWND окна уже уммею находить. Слышал о функции
C++
1
Send()
, но у меня не получалось её использовать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2012, 10:32
Ответы с готовыми решениями:

Программный ввод текста в другую программу
Всем добрый вечер!!! Имеется программа, которая управляет остальными. Написал так, чтобы она...

Передача текста на другую программу и +
Привет ребята, Нужно реализовать: Передача текста на другую программу и далее нажать в том же...

Отправление текста в другую программу
Здравствуйте. Можно ли в C# отправить текст в другую программу, если другая программа является...

Передача текста в другую программу SendMessage
Подскажите пожалуйста. Написал программу которая программно нажимает кнопку в другой программе....

30
98 / 49 / 4
Регистрация: 24.12.2011
Сообщений: 101
23.02.2012, 10:39 2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE hwnd=FindWindow("Notepad", NULL);
hwnd=FindWindowEx(hwnd, NULL, "Edit", NULL);
SendMessage(hwnd, EM_SETSEL, - 1, 0);
SendMessage(hwnd, EM_REPLACESEL, 1, (LPARAM)"я длинный текст, меня можно добавить");
}
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
HANDLE hwnd=FindWindow("Notepad", NULL);
hwnd=FindWindowEx(hwnd, NULL, "Edit", NULL);
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)"я длинный текст, останусь только я");
}
 
void __fastcall TForm1::Button3Click(TObject *Sender)
{
HANDLE hwnd=FindWindow("Notepad", NULL);
hwnd=FindWindowEx(hwnd, NULL, "Edit", NULL);
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)"");//вроде как чистилка
}
1
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
23.02.2012, 12:12  [ТС] 3
А можно сделать чтобы отправлялось сообщение, которое считывается из Edit?

Добавлено через 1 час 12 минут
Программа в которой я собираюсь вводить текст (программно) не разрешает вводить текст из буфера обмена. Что делать в этом случае? Как ввести текст не из буфера обмена?
0
Модератор
3392 / 2164 / 352
Регистрация: 13.01.2012
Сообщений: 8,385
23.02.2012, 23:35 4
причем тут буфер обмена?
текст из Edit
C++
1
Edit1->Text.c_str()
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
25.02.2012, 09:44  [ТС] 5
Я пытался так делать. В блокноте получается, а в той программе, в которую мне надо записать текст - нет.
Кстати в той проге нельзя вставлять текст из буфера обмена, она засчитывает только набор вручную с клавиатуры. Что делать?
Переформулирую вопрос: как мне программно нажать клавиши ввода текста на клаве?
Например, вот это слово ввести "привет", только клавишами.

Добавлено через 37 минут
И клавишами тож не получается.
Есть вариант туда текст вписать чтоб получилось?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
  HWND wnd, hwnd;
  wnd = FindWindow("Nksp", 0);
  hwnd = FindWindowEx(wnd, 0, "ViewPort Window", 0);
  if(hwnd > 0)
  {
  ShowMessage("Activated");
  PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, MapVirtualKey(VK_RETURN, 0) << 16 | 1);
  PostMessage(hwnd, WM_KEYUP, VK_RETURN, MapVirtualKey(VK_RETURN, 0) << 16 | 1 | 1 << 30 | 1 << 31);
 
  SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)"ÿ äëèííûé òåêñò, îñòàíóñü òîëüêî ÿ");
 
  PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, MapVirtualKey(VK_RETURN, 0) << 16 | 1);
  PostMessage(hwnd, WM_KEYUP, VK_RETURN, MapVirtualKey(VK_RETURN, 0) << 16 | 1 | 1 << 30 | 1 << 31);
такой вариант не катит, программа не воспринимает сообщения. она воспринимает только клавиши ENTER, а то что должно вводиться между ними нет
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
02.03.2012, 10:39  [ТС] 6
Как мне скопировать весь текст из memo1 и записать его в другую программу (HWND уже нашёл)?
Напишите код пожалуйста.
0
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,064
02.03.2012, 11:46 7
Все из Мемо1 в StringList:
C++
1
2
TStringList *temp1 = new TStringList;
temp1 = Memo1->Lines;
или добавить из Mемо1:
C++
1
temp1->Add->Memo1->Lines;//извини здесь я неуверен надо пробовать
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
02.03.2012, 12:35  [ТС] 8
спс, но мне нужно из memo1 скопировать текст в другую программу, и я не знаю как это осуществитьл
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.03.2012, 13:29 9
Дело еще может в том что неправильно определили HANDLE куда вводить текст, у самой программы то может быть много под-окон...
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.03.2012, 13:40 10
Цитата Сообщение от Клод Посмотреть сообщение
такой вариант не катит, программа не воспринимает сообщения. она воспринимает только клавиши ENTER, а то что должно вводиться между ними нет
Можно попробовать в цикле отсылать сообщения WM_KEYDOWN, WM_KEYUP для каждого символа в строке, раз уж программка воспринимает нажатия enter.
1
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.03.2012, 13:47 11
Можно попробывать юзать keybd_event только надо перед этим активизировать необходимое окно
C++
1
2
3
4
5
void Press(char ch)
{
  keybd_event(ch, 0, 0, 0);
  keybd_event(ch, 0, KEYEVENTF_KEYUP,0);
}
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
02.03.2012, 20:54  [ТС] 12
Цитата Сообщение от BRcr Посмотреть сообщение
Можно попробовать в цикле отсылать сообщения WM_KEYDOWN, WM_KEYUP для каждого символа в строке, раз уж программка воспринимает нажатия enter.
А код можно, а то не совсем понятно как это будет выглядеть
хатя...
я понял вот так
C++
1
PostMessage(hwnd, WM_KEYDOWN, 0,  "я длинный текст, останусь только я");
и что-то мне говорит, что это неправильно

Добавлено через 21 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Дело еще может в том что неправильно определили HANDLE куда вводить текст, у самой программы то может быть много под-окон...
HANDLE окна верный, я так считаю потому, что сымитировал нажатие клавиши ENTER, которое и даёт допуск к строке ввода текстового сообщения, и оно дало доступ для ввода текста. В этом осечки быть не может.

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Можно попробывать юзать keybd_event только надо перед этим активизировать необходимое окно
C++
1
2
3
4
5
void Press(char ch)
{
  keybd_event(ch, 0, 0, 0);
  keybd_event(ch, 0, KEYEVENTF_KEYUP,0);
}
C++
1
keybd_event
мне не подходит потому, что отправка текста должно принадлежать именно тому окну, на которое я "нацелился" HANDLE'ом
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.03.2012, 21:21 13
HANDLE окна верный, я так считаю потому, что сымитировал нажатие клавиши ENTER, которое и даёт допуск к строке ввода текстового сообщения, и оно дало доступ для ввода текста. В этом осечки быть не может.
Я бы проверил специальными программами HANDLE например Poz_Handl

мне не подходит потому, что отправка текста должно принадлежать именно тому окну, на которое я "нацелился" HANDLE'ом
Так сделайте его активным по хендлу перед иммитацией нажатия
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
02.03.2012, 21:25  [ТС] 14
Цитата Сообщение от Avazart Посмотреть сообщение
Я бы проверил специальными программами HANDLE например Poz_Handl
Я проверял Spy++
Она лучше Poz_Handl хотя бы в том, что показывает все дочерние и родительские окна.
Цитата Сообщение от Avazart Посмотреть сообщение
Так сделайте его активным по хендлу перед иммитацией нажатия
Допустим, но мне не это нужно, не буду же я 50ти символьный текст "тыкать клавишами".
Мне надо взять текст из Memo и ввести его в другую программу, в моём случае игру.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.03.2012, 21:33 15
Незнаю проканает ли в вашем случае но я делал так в своей проге для Pragma-переводчика, вот фрагмент

C++
1
2
3
4
5
6
7
8
if(hPNaviTop)
       {
             //....
       char *s=ClipbrdText.c_str(); // Передаваемый текст
       if (! SendMessage(hPNaviTop,WM_SETTEXT,strlen(s),int(s)) )ShowMessage("Do not Send Text Error#5");
            //...
       }
 else ShowMessage("Error#5");
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
02.03.2012, 21:40  [ТС] 16
C++
1
2
3
4
5
if(hwnd > 0)
  {
    char *s = Memo1->Lines->Text.c_str();
    SendMessage(hwnd, WM_SETTEXT, strlen(s), int(s));
  }
Помогло тока выводит вот такой текст
!B0A
и только первую строку.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.03.2012, 21:42 17
Может проблема с Unicode/Ansi ?
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
02.03.2012, 21:43  [ТС] 18
Цитата Сообщение от Avazart Посмотреть сообщение
Может проблема с Unicode/Ansi ?
Возможно, а что теперь с этой траблой делать?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.03.2012, 21:57 19
Чесно говоря у меня тоже кажется такие траблы были при написании вот только я не помню причину...

Добавлено через 10 минут
Думаю всетаки проблема с HANDLE-ом другой причины не вижу, у меня прога работает нормально и UNICODE не подключал.


Попробуйте отсылать сообщение 100-пудова известному окну например другому Memo.
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
02.03.2012, 22:00  [ТС] 20
Цитата Сообщение от Avazart Посмотреть сообщение
Думаю всетаки проблема с HANDLE-ом другой причины не вижу, у меня прога работает нормально и UNICODE не подключал.
Дак с HANDLE-ом всё норм уже проверял, тока открою секрет - та самая прога - скайп))
HANDLE его я проверял - всё супер, отзывается на сообщения
0
02.03.2012, 22:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2012, 22:00
Помогаю со студенческими работами здесь

Передача текста в другую программу в текстовое поле
Вот здраствуйте,возник вопрос ,вот допустим у меня есть форма с кнопкой и мемо1 . в мемо1 есть...

При передаче текста в другую программу нужен только Bluetooth
При открытии списка программ в которые может быть отправлен текст из моей программы , есть и...

Как сымитировать ввод текста во внешнию программу?
К примеру у моей программы стоит окно где вводишь текст, после нажимаешь кнопку написать и она...

Строка: автоматизировать ввод текста с текстового документа в программу
Добрый день всем. Столкнулся с проблемой: надо автоматизировать ввод текста с текстового документа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru