Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.89
Клод
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
#1

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

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

Всех с 23 февраля!!! Приветствую вас, я опять вернулся
Я работаю в C++ Builder 6. Я бы хотел бы узнать, как программно вводить текст. Например "абвгдйка". HWND окна уже уммею находить. Слышал о функции
C++
1
Send()
, но у меня не получалось её использовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2012, 10:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Програмный ввод текста в другую программу (C++ Builder):

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

Ввод текста на рисунок
как можно сделат что бы либо Edit был прозрачным, либо что бы на определенный...

Ввод текста в РичЭдит1 и вызов формы1
Здравствуйте форумчани!! Вопрос в следующем. Подскажите можно с помощью текста...

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

Засунуть программу в другую программу
собственно говоря, есть одна программка, которую надо засунуть в свою программу...

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

30
cybersonner
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
vxg
Модератор
3231 / 2035 / 319
Регистрация: 13.01.2012
Сообщений: 7,887
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
Samrisbe
1352 / 722 / 66
Регистрация: 28.01.2011
Сообщений: 1,979
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
Avazart
Эксперт С++
7686 / 5595 / 543
Регистрация: 10.12.2010
Сообщений: 25,081
Записей в блоге: 17
02.03.2012, 13:29 #9
Дело еще может в том что неправильно определили HANDLE куда вводить текст, у самой программы то может быть много под-окон...
0
BRcr
4015 / 2305 / 291
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
02.03.2012, 13:40 #10
Цитата Сообщение от Клод Посмотреть сообщение
такой вариант не катит, программа не воспринимает сообщения. она воспринимает только клавиши ENTER, а то что должно вводиться между ними нет
Можно попробовать в цикле отсылать сообщения WM_KEYDOWN, WM_KEYUP для каждого символа в строке, раз уж программка воспринимает нажатия enter.
1
Avazart
Эксперт С++
7686 / 5595 / 543
Регистрация: 10.12.2010
Сообщений: 25,081
Записей в блоге: 17
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
Avazart
Эксперт С++
7686 / 5595 / 543
Регистрация: 10.12.2010
Сообщений: 25,081
Записей в блоге: 17
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
Avazart
Эксперт С++
7686 / 5595 / 543
Регистрация: 10.12.2010
Сообщений: 25,081
Записей в блоге: 17
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
Avazart
Эксперт С++
7686 / 5595 / 543
Регистрация: 10.12.2010
Сообщений: 25,081
Записей в блоге: 17
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
Avazart
Эксперт С++
7686 / 5595 / 543
Регистрация: 10.12.2010
Сообщений: 25,081
Записей в блоге: 17
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2012, 22:00
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru