Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.86
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
#1

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

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

Какая команда отвечает за вывод из буфера текста в окно другой программы (Блокнот) и имитирует нажатие клавиши "Enter" ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2010, 16:20     Имитация клавишь в другом окне
Посмотрите здесь:

Комбинация клавишь - C++
доброго времени суток, перелапатил интернет, уже 2 часа потерял не могу найти помощи, подскажите как сделать что б выполнялось событие при...

Коды нажатия клавишь. - C++
#include'stdio.h' #include'conio.h' main() { int n; if(!(n=getch())) { n=getch(); } printf('%d

Нажатие клавишь (точнее его фиксирование). - C++
Вопрос 1: Допустим есть какая-то игра, не важно какая, ну бегалка какая-нибудь. Я жму - персонаж идет, монстры тоже, я не жму ничего -...

Работа клавишь в режиме реального вемени - C++
#include <iostream> #include <windows.h> #include <math.h> #include <stdlib.h> #include <conio.h> #include <string> using...

Как одному классу узнать о другом в другом файле, если они не имеют общего наследования - C++
Есть два класса в разных файлах, первому классу нужно знать о втором и использовать указатели типа второго у себя внутри, второму нужно...

Имитация консоли ? - C++
Форумчане, вечер добрый. В общем решил в одну конторку устроится. Получил тестовое. Но днём был занят и потому не имел возможности...

Имитация scrlock - C++
Нужна небольшая помощь. На ноутбуке нет scrlock`а, а тут понадобилось. Напишите, пожалуйста, программу, которая запустится, нажмет scrlock...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insideone
Модератор
Автор FAQ
3636 / 914 / 49
Регистрация: 10.01.2010
Сообщений: 2,464
19.02.2010, 16:27     Имитация клавишь в другом окне #2
Команда? Поправьте если ошибаюсь - это работа для WinAPI (если речь идет о Windows приложении конечно), для этого есть свой раздел...
Как передать нажатие клавиши другому окну? (api в delphi)
http://www.cyberguru.ru/programming/...rd-page20.html
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
19.02.2010, 16:27     Имитация клавишь в другом окне #3
Deimon, что значит "какая команда"? Какая задача стоит?
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
20.02.2010, 16:43  [ТС]     Имитация клавишь в другом окне #4
Цитата Сообщение от Vourhey Посмотреть сообщение
Deimon, что значит "какая команда"? Какая задача стоит?
Ну вот есть текст "IN TERMINAL" его надо вбить в другое окно (или скопировать) затем нажать "Enter", после чего вбить следующий текст "IN KISS" и опять нажать "Enter" ... и т.д.

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

Добавлено через 19 часов 51 минуту
Мда... неужели это так сложно или невозможно?
мне казалось это во всех языках программирования можно ...в Delphi точно можно было
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
20.02.2010, 22:12     Имитация клавишь в другом окне #5
мне казалось это во всех языках программирования можно
не нравится мне эта фраза)

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

потом поочередно слать туда символы через SendMessage(hwnd,WM_CHAR,'СИМВОЛ',0,0);
ENTER точно также, но вместо символа поставить VK_ENTER
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
21.02.2010, 01:32  [ТС]     Имитация клавишь в другом окне #6
Цитата Сообщение от 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 ?
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
26.02.2010, 10:48  [ТС]     Имитация клавишь в другом окне #7
Мне тут подсказали, что раньше это делали через драйверы клавиатуры. через C++ можно управлять драйверами ?

(П.С. НЕ ПИСАТЬ , а управлять)
Yurii_74
paladin
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
26.02.2010, 11:16     Имитация клавишь в другом окне #8
Цитата Сообщение от Deimon Посмотреть сообщение
Мне тут подсказали, что раньше это делали через драйверы клавиатуры.
лучше не стоит. Больше времени потратите. Лучше разберитесь с этими двумя функциями (FindWindowEx, SendMessage).
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,420
26.02.2010, 13:09     Имитация клавишь в другом окне #9
Драйверы в печку.
А вообще тут что-то не то.
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;
}
Yurii_74
paladin
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
26.02.2010, 13:24     Имитация клавишь в другом окне #10
Все нормальные программы под винду работают через winApi. Если вы послали сообщение при помощи SendMessage, то для программы это равносильно нажатию на клавиатуре (точно так же системой генерируется SendMessage с теми же параметрами). Нет вменяемой среды под рукой, да и лень, если честно, вспоминать параметры функций. Но скорее всего во всех вышеописанных вариантах что-то неправильно со строкой, по которой вы ищете окно. Попытайтесь сначала выводить в свою программу эту строку активного окна (пощелкайте по разным окнам, создайте лог, и от этого уже надо будет плясать).

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

Значение, возвращаемое функцией FindWindow проверяется ДВАЖДЫ. То есть я два раза следую Вашему совету.
Первый раз проверяется на неравенство нулю DeskriptorOkna, второй раз выводится его значение. ОБЕ проверки проходят на ять. Впрочем, Вы сами могли бы в этом убедиться (или в обратном), как впрочем и в безошибочности работы PostMessage. Ну, дело Ваше.
Yurii_74
paladin
279 / 179 / 3
Регистрация: 25.02.2009
Сообщений: 592
26.02.2010, 14:10     Имитация клавишь в другом окне #12
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 минут
Либо же не запрет, а проверка сендера на вшивость.

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

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

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

А блокнот все таки легче найти по имени класса HWND hwnd = FindWindow("Notepad",0);
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,420
27.02.2010, 02:09     Имитация клавишь в другом окне #15
Значит, докладываю

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

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

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

Добавлено через 11 минут
Цитата Сообщение от kravam Посмотреть сообщение
5) Ещё: возможны проблемы с кириллицей по той причине, что в конcоли винды одна кодировка, а notepad использует другую. Для устранения этого самостоятельно изучаешь и пишешь маленькую прожку для ковертации символов из одной кодировки в НУЖНУЮ ТЕБЕ ( ту, которая в notepade)
Насколько помню, требуемую кодировку можно и для консоли установить (cкорее всего 1251).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2010, 11:42     Имитация клавишь в другом окне
Еще ссылки по теме:

Имитация магазина вещей - C++
Помогите пожалуйста решить! Я вот отсортировал массив с помощью buble sort, но никак не могу сделать так, чтобы отсортированные цены...

Имитация командной строки - C++
Написать программу на С++, имитирующую командную строку. Программа должна уметь запускать exe-файлы, имена/пути которых вводятся...

Имитация клика мыши C++ - C++
Здравствуйте. Возможно ли имитировать клик мыши на уровне драйвера, чтобы программы такие как frost думали что они настоящие? Например...

Имитация клика мышки - C++
Здравствуйте. Возникла необходимость сымитировать клик мыши. Суть примерно такая: я нажимаю на кнопку на клавиатуре, программа, работающая...

Имитация typeof в C/C++ коде - C++
Можно ли считать, что следующие макросы полностью имитируют typeof через decltypeof и в случае подключения хеадера компилятором С и в...


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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,420
27.02.2010, 11:42     Имитация клавишь в другом окне #17
Цитата Сообщение от Yurii_74 Посмотреть сообщение
P.S.: в блокноте можно одновременно открыть несколько файлов в одном окне? Тогда все сталновится понятным. Одно родительское + несколько дочерних.
В том-то и дело, то открыт ОДИН файл в ОДНОЙ ВКЛАДКЕ
Вот на фотке станет всё ясно.
Вверху это окно notepad.exe, где видно, что открыта одна вкладка. А внизу- окно программы objectviewer. В лефом фрейме- проводник. Видно, что открыта как бы папка E:\file.txt - Notepad2 и в неё вложены 4 объекта с РАЗНЫМИ идентификаторами. ВЫделен на данный момент объект "Белое поле"

А остальные объекты- панель инструментов, ещё какая-то нижняя полоса окна... Там включаешь режим "Живой курсор" водишь им по окну и высвечиваются данные того элемента, над которым курсор, а когда курсор будет над рамкой, высветятся параметры непосредственно E:\file.txt - Notepad2
Миниатюры
Имитация клавишь в другом окне  
Yandex
Объявления
27.02.2010, 11:42     Имитация клавишь в другом окне
Ответ Создать тему
Опции темы

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