Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/27: Рейтинг темы: голосов - 27, средняя оценка - 4.78
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183

Имитация клавишь в другом окне

19.02.2010, 16:20. Показов 5783. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Какая команда отвечает за вывод из буфера текста в окно другой программы (Блокнот) и имитирует нажатие клавиши "Enter" ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2010, 16:20
Ответы с готовыми решениями:

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

Выделить текст в RichTextBox в одном окне, сохранив фокус на другом окне
Добрый день! Пытаюсь реализовать поиск с помощью дополнительного окна (в данной теме сам поиск не интересует). Если посмотреть аналог...

Передача данных из listBox в одном окне, в textBox в другом окне
Доброго времени суток! Есть два окна, на одном находиться сам textBox, а на другом listBox с данными (список ссылок, которые загружаются из...

16
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
19.02.2010, 16:27
Команда? Поправьте если ошибаюсь - это работа для WinAPI (если речь идет о Windows приложении конечно), для этого есть свой раздел...
Как передать нажатие клавиши другому окну? (api в delphi)
http://www.cyberguru.ru/progra... age20.html
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
19.02.2010, 16:27
Deimon, что значит "какая команда"? Какая задача стоит?
0
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
20.02.2010, 16:43  [ТС]
Цитата Сообщение от Vourhey Посмотреть сообщение
Deimon, что значит "какая команда"? Какая задача стоит?
Ну вот есть текст "IN TERMINAL" его надо вбить в другое окно (или скопировать) затем нажать "Enter", после чего вбить следующий текст "IN KISS" и опять нажать "Enter" ... и т.д.

Как это реализовать в C++ Builder ?

Добавлено через 19 часов 51 минуту
Мда... неужели это так сложно или невозможно?
мне казалось это во всех языках программирования можно ...в Delphi точно можно было
0
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
20.02.2010, 22:12
мне казалось это во всех языках программирования можно
не нравится мне эта фраза)

сначала нужно получить идентификатор окна, проще всего - найти его функцией FindWindow("Notepad",0);

потом поочередно слать туда символы через SendMessage(hwnd,WM_CHAR,'СИМВОЛ',0,0);
ENTER точно также, но вместо символа поставить VK_ENTER
1
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
21.02.2010, 01:32  [ТС]
Цитата Сообщение от DeadRipper Посмотреть сообщение
проще всего - найти его функцией FindWindow("Notepad",0);
Что программа должна сделать при этом ? она находит окно с таким именем ? (тоесть мне надо создать блокнот с именем "notepad" ? Но в этом случае окно у меня называется "notepad - Блокнот") Или это название Блокнота програмно?

На эту часть кода у меня С++ не ругается. Окно блокнота должно ставновиться активным после исполнения этой части кода ?



Цитата Сообщение от DeadRipper Посмотреть сообщение
слать туда символы через SendMessage(hwnd,WM_CHAR,'СИМВОЛ',0,0);
Здесь у меня программа заругалась. Пришлось поменять "hwnd" на "HWND_BROADCAST" и в конце убрать один ноль. получилось:
C++
1
SendMessage(HWND_BROADCAST, WM_CHAR, 32, 0);
Вообщем... программа в итоге запустилась с кодом
C++
1
2
3
4
5
6
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
FindWindow("notepad - Блокнот",0);
 
SendMessage(HWND_BROADCAST, WM_CHAR, 32, 0);
}
но не чего не осуществила.
П.С. Блокнот был открыт

Добавлено через 33 минуты
Вот еще пищя для размышления
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
FindWindow("notepad - Блокнот",0);
SendMessage(FindWindow("notepad - Блокнот",0), WM_CHAR, 34, 0);
SendMessage(HWND_BROADCAST, WM_CHAR, 34, 0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyPress(TObject *Sender, wchar_t &Key)
{
if (Key == 34) { Memo1->Text= (Memo1->Text)+1; }
}
//---------------------------------------------------------------------------
Результат: в Memo1 с заданным периодом приписывается "1" .. даже если окно программы не выделено, работа продолжается (работает в фоновом режиме). Тоесть код впринципе рабочий, и действительно происходит имитация нажатия клавиши. Мне кажется, либо SendMessage не может отправить в "соседнее окно" что-то, либо неправильно отправляется.
П.С. Может гдето галочки поставить или выставить true ?
0
 Аватар для Deimon
35 / 35 / 6
Регистрация: 29.08.2009
Сообщений: 183
26.02.2010, 10:48  [ТС]
Мне тут подсказали, что раньше это делали через драйверы клавиатуры. через C++ можно управлять драйверами ?

(П.С. НЕ ПИСАТЬ , а управлять)
0
paladin
 Аватар для Yurii_74
286 / 187 / 7
Регистрация: 25.02.2009
Сообщений: 589
26.02.2010, 11:16
Цитата Сообщение от Deimon Посмотреть сообщение
Мне тут подсказали, что раньше это делали через драйверы клавиатуры.
лучше не стоит. Больше времени потратите. Лучше разберитесь с этими двумя функциями (FindWindowEx, SendMessage).
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
26.02.2010, 13:09
Драйверы в печку.
А вообще тут что-то не то.
Yurii_74,
Посмотри мой код. Можно, конечно заполнить строку с клавиатуры или ещё как-то, а потом её считаь. А можно так, как у меня. Но не получается ни фига.
Внутренние проверки все проходят на ять, функции возвращают корректные значения.
Но в окне notepada ничего не пишется.
Сдаётся мне, мало чтобы PostMessage нормально отработала. ПОСЛАТЬ окну сообщение (что она делает и напечатать там что-либот это наверное разные вещи)

Но как бы тони было
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <windows.h>
#include <stdio.h>
#include <conio.h>
 
// Ðàçìåð áóôåðà äëÿ çàãîëîâêà êîíñîëüíîãî îêíà 
#define MY_BUFSIZE 1024   
int main () {
 
 
 //Òóò àäðåñ çàãîëîâêà îêíà. Ñîáëþäàéòå ñèíòàêèñ! Èçáåãàéòå ðóññêèé áóêâ è ïðîáåëîâ!!
 char AdresZagolovkaOkna [MY_BUFSIZE]= "E:\\file.txt - Notepad2";
 
 //Ýòî âîò áóäåò äåñêðèïòîð îêíà
 HWND DeskriptorOkna;
 
 //ÏÅðâîå, ÷òî ìû äåëàåì, íàõîäèì äåñêðèïòîð òîãî îêíà, êóäà áóäåì ïå÷àòàòü òåêñò
 if (!(DeskriptorOkna= FindWindow(NULL, AdresZagolovkaOkna))){
  printf ("DeskriptorOkna zavershilas oshibkoi\n" );
  getchar ();
 }
 
 else {
  printf ("na vsakii sluchai deskriptor Notepada ne raven 0, a raven %x\n", DeskriptorOkna);
 }
 
 char simvol;
 
 //Òåïåðü ñîáñíîøë¸ì òóäà ñèìâîëû. ß èñïîëüçîâàë PostMesaage, ò. ê. îäíàæäû SendMessage äàëà ñáîé
 do {
  simvol=getch ();
  printf ("simvol= %d\n", simvol);
  if (!PostMessage (DeskriptorOkna,WM_CHAR, simvol, 0))
   printf ("PostMessage zavershilas oshibkoi");
  
 }
 while (simvol!=13);
 printf ("vveli\n");
 
 CloseHandle (DeskriptorOkna);
 getchar ();
 
 
 return 0;
}
1
paladin
 Аватар для Yurii_74
286 / 187 / 7
Регистрация: 25.02.2009
Сообщений: 589
26.02.2010, 13:24
Все нормальные программы под винду работают через winApi. Если вы послали сообщение при помощи SendMessage, то для программы это равносильно нажатию на клавиатуре (точно так же системой генерируется SendMessage с теми же параметрами). Нет вменяемой среды под рукой, да и лень, если честно, вспоминать параметры функций. Но скорее всего во всех вышеописанных вариантах что-то неправильно со строкой, по которой вы ищете окно. Попытайтесь сначала выводить в свою программу эту строку активного окна (пощелкайте по разным окнам, создайте лог, и от этого уже надо будет плясать).

Спокойно раньше мышку по экрану гонял при помощи SendMessage. Времени свободного было поболее
Исчерпывающая информация здесь: msdn_FidWindowEx
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
26.02.2010, 13:39
Цитата Сообщение от Yurii_74 Посмотреть сообщение
Но скорее всего во всех вышеописанных вариантах что-то неправильно со строкой, по которой вы ищете окно. Попытайтесь сначала выводить в свою программу эту строку активного окна (пощелкайте по разным окнам, создайте лог, и от этого уже надо будет плясать).
Строка, по которой я ищу окно, есть DeskriptorOkna= FindWindow(NULL, AdresZagolovkaOkna)

Значение, возвращаемое функцией FindWindow проверяется ДВАЖДЫ. То есть я два раза следую Вашему совету.
Первый раз проверяется на неравенство нулю DeskriptorOkna, второй раз выводится его значение. ОБЕ проверки проходят на ять. Впрочем, Вы сами могли бы в этом убедиться (или в обратном), как впрочем и в безошибочности работы PostMessage. Ну, дело Ваше.
0
paladin
 Аватар для Yurii_74
286 / 187 / 7
Регистрация: 25.02.2009
Сообщений: 589
26.02.2010, 14:10
Remarks
Microsoft Windows Vista and later. When a message is blocked by UIPI the last error, retrieved with GetLastError, is set to 5 (access denied).
UIPI
Проверьте GetLastError на 5. Vista на работе тоже не установлена. Возможно для Notepad'а они прописали запрет на прием этого сообщения.

Добавлено через 10 минут
Либо же не запрет, а проверка сендера на вшивость.

Лучше создать два своих окна и проверить это предположение. Для своей программы хотя бы можно указать те сообщения, которые она соизволит принимать от других прог.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
26.02.2010, 15:05
Нет, это сложно для меня.
А вот скажите мне кто-нибудь, как получить командную строку СТОРОННЕГО процесса и я попытаюсь что-нибудь сделать.

План такой:
1) Предполагается, что открыто ОДНО окно notepad (соответственно, запущен иодин экземплярпроцесса, я щас смотрел, сколько окон открыто, столько и экземпляров процесса запущено. Ткой уж он notepad)
2) Ищем командную строку notepad (сперва дескриптор notepad.exe, но это ерунда, я найду)
3) Разбираемся с командной строкой. Тут тонкое место. В идеале хорогшо было бы, чтобы у notepada был всегда один параметр- имя файла, даже если он открыт простым кликом мышки. Тогда имя файла копируем себе, notepad закрываем к матери, открываем сишными методами (к примеру) файл на запись, записывае туда что надо, закрываем и открываем notepad с параметром <имя файла>
4) оформляем всё это дело с помощью батников, главный из которых запускается по первому enter

Фигня, конечно, но упражнения ради можно сделать. Но как получить командную строку СТОРОННЕГО процесса, я ума не приложу. Извините.
0
65 / 71 / 9
Регистрация: 25.06.2009
Сообщений: 244
26.02.2010, 21:50
Такое впечатление что она хочет создать программу для запугивания ламеров)

А блокнот все таки легче найти по имени класса HWND hwnd = FindWindow("Notepad",0);
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
27.02.2010, 02:09
Значит, докладываю

1) ВСе наши предыдущие изыскания бесполезны. Нами предполагалось создание и работа с окном, но мы не учитывали одного- программа notepad при запуске создаёт ПЯТЬ окон

2) НАзвание имеет только оджно из них. Фактически это рамка. И все сообщения, посылаемые этому окну в моей предыдущей программе, посылались только рамке, не больше не меньше. То белое поле, где вводятся буквы- отдельное окно. Увы, без названия как и остальные 3 (панель инструментов и ещё что-то там)

3) ТЕм не менее, дескриптор это окно имеет, нам необходимо его найти и можно с ним работать. Автор, задание. Ищешь в сети программу objectviewer (русскоязычный интерфейс), учишься работать с ней и находить с помощью неё дескрипторы окон. Если не найдёшь, я тебе скину на рапиду

4) Ну вот как дескриптор найдёшь запускай мою программу. Обрати внимание, она работает, даже если окно неактивно или вообще свёрнуто- то есть всё равно этому белому полю пошлются соответвующие сообщения и буквы выведутся.

5) Ещё: возможны проблемы с кириллицей по той причине, что в конcоли винды одна кодировка, а notepad использует другую. Для устранения этого самостоятельно изучаешь и пишешь маленькую прожку для ковертации символов из одной кодировки в НУЖНУЮ ТЕБЕ ( ту, которая в notepade)

6) Удачи в твоих начинаниях! И штутдируй всякую фигню типа api-функций, отладчиков и прочей дряни.
ВСегда твой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <windows.h>
#include <stdio.h>
 
// Размер буфера для заголовка консольного окна 
#define MY_BUFSIZE 1024   
int main () {
 
 
 //ЭТо вот буфер длявводимых символов, всего их может быть не больше MY_BUFSIZE
 char bufer_dla_vvodim_simv [MY_BUFSIZE];
 
 //Это вот будет дескриптор окна. Ищем вручную С ПОМОЩЬЮ ПРОГИ objectviewer.exe
 HWND DeskriptorOkna;
 
 //Поехали
 printf ("vvodi deskriptor okna  ");
 scanf ("%d", &DeskriptorOkna);
 
 //Теперь пишем в окне всякую фигню и заполняем ей буфер bufer_dla_vvodim_simv
 fflush (stdin);
 printf ("vvodi text\n");
 gets (bufer_dla_vvodim_simv);
 
 //Тперь на всякий случай выведем bufer_dla_vvodim_simv 
 //ЭТо можно закомментировать
 // printf ("vot chto mi vveli %s\n", bufer_dla_vvodim_simv);
 
 
 //Теперь эту херь посылаем текстовому редактору NOTEPAD
 for (int i= 0; bufer_dla_vvodim_simv[i]; i++ ) {
 
  //Внимание! ЕСли пишем WM_KEYDOWN, то третий параметр0 код клавиши. 
  //Следовательно, маленькие буквы не напечатаются
  //PostMessage ((HWND)2033532,WM_KEYDOWN,68, 1);
  PostMessage (DeskriptorOkna,WM_CHAR, bufer_dla_vvodim_simv[i], 1);
 } 
 
 //Осталась одна рабочая задача- научится выводить русские буквы.
 printf ("smotri rezultat ");
 getchar ();
 
 
 return 0;
}


kravam

Сёдня весь день в инете, все челы только и занимаются, что посылают окнам сообщения, инфы много и НИКОМУ НЕВДОМЁК, что окон не одно, а несколько. Мне аж не по себе стало. Парняги, скажите всем и знайте сами! Кажется, что окно одно, на самом деле их несколько! Хэндл каждого искать лучше вручную, (что предпочтительно, имея вышеупомянутую прогу).
2
paladin
 Аватар для Yurii_74
286 / 187 / 7
Регистрация: 25.02.2009
Сообщений: 589
27.02.2010, 07:34
Цитата Сообщение от kravam Посмотреть сообщение
(что предпочтительно, имея вышеупомянутую прогу).
Лучше самому написать такую прогу, для практики. За информацию огромное человеческое спасибо.

Добавлено через 15 минут
P.S.: в блокноте можно одновременно открыть несколько файлов в одном окне? Тогда все сталновится понятным. Одно родительское + несколько дочерних.

Добавлено через 11 минут
Цитата Сообщение от kravam Посмотреть сообщение
5) Ещё: возможны проблемы с кириллицей по той причине, что в конcоли винды одна кодировка, а notepad использует другую. Для устранения этого самостоятельно изучаешь и пишешь маленькую прожку для ковертации символов из одной кодировки в НУЖНУЮ ТЕБЕ ( ту, которая в notepade)
Насколько помню, требуемую кодировку можно и для консоли установить (cкорее всего 1251).
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
27.02.2010, 11:42
Цитата Сообщение от Yurii_74 Посмотреть сообщение
P.S.: в блокноте можно одновременно открыть несколько файлов в одном окне? Тогда все сталновится понятным. Одно родительское + несколько дочерних.
В том-то и дело, то открыт ОДИН файл в ОДНОЙ ВКЛАДКЕ
Вот на фотке станет всё ясно.
Вверху это окно notepad.exe, где видно, что открыта одна вкладка. А внизу- окно программы objectviewer. В лефом фрейме- проводник. Видно, что открыта как бы папка E:\file.txt - Notepad2 и в неё вложены 4 объекта с РАЗНЫМИ идентификаторами. ВЫделен на данный момент объект "Белое поле"

А остальные объекты- панель инструментов, ещё какая-то нижняя полоса окна... Там включаешь режим "Живой курсор" водишь им по окну и высвечиваются данные того элемента, над которым курсор, а когда курсор будет над рамкой, высветятся параметры непосредственно E:\file.txt - Notepad2
Миниатюры
Имитация клавишь в другом окне  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2010, 11:42
Помогаю со студенческими работами здесь

Выести в окне значения, взятые в в другом окне
Ребята у меня вопрос у меня в 1 окне берётся значения как вывести их в др окно в Qt ???ОЧ ВАЖНО!!!

Имитация нажатия клавиш в стороннем окне
Я знаю текст заголовка окна. Как мне передать в него нажатия клавиш и в том числе специальных - таких как esc, enter? Можно пойти иным...

Имитация нажатия клавиш в свернутом окне
Добрый вечер. Мне нужно сделать бота для одной игрульки. Суть там заключается в нажатии некой последовательности кнопок. Пока имею...

Имитация нажатия кнопки мыши в окне
как нажать с помощью SendMessage/PostMessage левую кнопку мыши? так не работает //для активного окна ...

Имитация нажатия кнопок в неактивном окне
Есть приложение, игра. Надо нажимать , допустим F1, в неактивном окне. PostMessage справляется на ура, но приложение отслеживает вызов...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru