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

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

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

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

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

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

Комбинация клавишь - 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++
Есть два класса в разных файлах, первому классу нужно знать о втором и использовать указатели типа второго у себя внутри, второму нужно...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
insideone
Модератор
Автор FAQ
3638 / 916 / 49
Регистрация: 10.01.2010
Сообщений: 2,469
19.02.2010, 16:27 #2
Команда? Поправьте если ошибаюсь - это работа для WinAPI (если речь идет о Windows приложении конечно), для этого есть свой раздел...
Как передать нажатие клавиши другому окну? (api в delphi)
http://www.cyberguru.ru/programming/...rd-page20.html
Vourhey
Почетный модератор
6478 / 2253 / 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
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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

Сёдня весь день в инете, все челы только и занимаются, что посылают окнам сообщения, инфы много и НИКОМУ НЕВДОМЁК, что окон не одно, а несколько. Мне аж не по себе стало. Парняги, скажите всем и знайте сами! Кажется, что окно одно, на самом деле их несколько! Хэндл каждого искать лучше вручную, (что предпочтительно, имея вышеупомянутую прогу).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2010, 02:09
Привет! Вот еще темы с ответами:

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

Имитация нажатия клавиш - C++
как только и не пытался всё выводит одну и туже ошибку, помогите начинающему c++ юзеру #include &lt;iostream&gt; #include &lt;Windows.h&gt; ...

Имитация работы процессора - C++
Составить программу имитирующую работу процессора аккумуляторного типа при переводе прямого кода вещественных чисел в обратный код....

Имитация действий пользователя - C++
Не знаю в какую ветку написать. Есть программа SAP со списком клиентских заказов в магазине в виде таблицы. Если щелкнуть по заказу...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.02.2010, 02:09
Ответ Создать тему
Опции темы

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