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

Имитировать нажатие клавиши - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 167
05.11.2012, 15:49     Имитировать нажатие клавиши #1
Проблема такая, есть программа, кот запущена, с пользовательским интерфейсом. Нужно сделать для нее прогу, кот будет через допустим 2 минуты посылать ей нажатие клавиши Enter. Т.е фокус находится у прогр1, а вторая либо на заднем плане либо, только в процессах, без интерфейса, эт не важно, главное чтоб она посылала прогр1, будто пользователь нажал какую-то кнопку (пусть Enter).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2012, 15:49     Имитировать нажатие клавиши
Посмотрите здесь:

Нажатие клавиши C++
C++ Нажатие клавиши
запретить нажатие клавиши Win C++
Как имитировать нажатие клавиш? C++
C++ Реакция на нажатие клавиши
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
05.11.2012, 16:55     Имитировать нажатие клавиши #2
Если окна НЕТ, тогда я вижу такие пути: (по сложности)

не знаю. Сообщение можно посылать только окну, но не процессу.

1) неизящный, топорный, но надёжный сособ
ничто не мешает прог1 через 2 минуты записывать в какой-нибудь промежуточный файл какой-нибудь текстовый символ, например 'q' Пусть это и будет наш условный "Enter" Так, а прог1 пусть периодически проверяет этот файл и как только прочтёт там 'q' пусть это и будет типа ей послали "Enter"

2) организовать какую-нибудь синхронизацию процессов типа семафоров там. Требуется дополнительное углубление в тему

3) организовать сервер-клиентское взаимодействие процессов. То же, что по пункту 2

А если сообщение треба посылать окну, тогда вот:
Эмуляция нажатия мыши в свёрнутом окне
Передача сообщений в окно
Как сэмулировать нажатие клавиш Alt+Space, используя функцию SendInput?
Передаём нажатия
Функция для считывания нажатых клавиш.
Подсчет и перехват нажатий клавиш
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 167
05.11.2012, 21:14  [ТС]     Имитировать нажатие клавиши #3
Все понятно, начал было уже ккнижку с API читать.... но вовремя вот решение объявилось
Однако, теперь остался главный вопрос, как поймать дескриптор окна програмно, а не с помощью objectviewer?
Как в случае с нотпадом так и в моем случае (игрушка онлайн, любима моя *****) у окна нет имени, есть только тип класса (у нотпада RICHEDIT50W ), как вот найти дескриптор по типу класса ?

Добавлено через 9 минут
это я вот про этот код
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]= "RICHEDIT50W";
 
 //Это вот будет дескриптор окна
 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, 31, 0))
   printf ("PostMessage zavershilas oshibkoi");
  
 }
 while (simvol!=13);
 printf ("vveli\n");
 
 CloseHandle (DeskriptorOkna);
 getchar ();
 
 
 return 0;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
05.11.2012, 21:52     Имитировать нажатие клавиши #4
Код нерабочий что ли? И ещё: я так понял, у тебя заголовок окна (RICHEDIT50W) совпадает с типом класса окна?
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 167
05.11.2012, 22:12  [ТС]     Имитировать нажатие клавиши #5
Код рабочий, но мне как-бэ хотелось его апгрейдить, чтоб каждый раз при запуске не искать в ручную дескриптор, а чтоб прога его сам находила, руководствуясь ИСКЛЮЧИТЕЛЬНО типом этого класса.

Мне кажется можно как-то через
EnumWindows
сделать

Только вот я не знаю как, справку посмотрел, примеры посмотрел, все равно не до конца понятно...
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
05.11.2012, 22:50     Имитировать нажатие клавиши #6
у тебя заголовок окна (RICHEDIT50W) совпадает с типом класса окна?
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 167
05.11.2012, 22:59  [ТС]     Имитировать нажатие клавиши #7
Цитата Сообщение от kravam Посмотреть сообщение
у тебя заголовок окна (RICHEDIT50W) совпадает с типом класса окна?
нет конечно, заголовок окна у меня был "qwe - WordPad"

Добавлено через 2 минуты
Не тот пример то )) , вот он твой же рабочий ...
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
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
05.11.2012, 23:20     Имитировать нажатие клавиши #8
Цитата Сообщение от GoodLife Посмотреть сообщение
чтоб прога его сам находила, руководствуясь ИСКЛЮЧИТЕЛЬНО типом этого класса.
это вряд ли. Дело в том, что по определению в системе может быть несколько окон одного класса.

Поэтому окно, нужное тебе, должно идентифицироваться не классом, к которому оно принадлежит, а чем-то другим, чем оно мого бы идентифицироваться ОДНОЗНАЧНО,

заголовком (хотя тут я тоже не уверен) или
над ним курсор или
оно активно
и так далее.

Вот отличай своё окно от других окон ОДНОЗНАЧНО и ищи его дескриптор
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 167
06.11.2012, 00:30  [ТС]     Имитировать нажатие клавиши #9
Цитата Сообщение от kravam Посмотреть сообщение
Вот отличай своё окно от других окон ОДНОЗНАЧНО и ищи его дескриптор
Не получается, не хочет клиент у игры это кушать, вот с objectviewer скрин
Имитировать нажатие клавиши
пробовал и на активное окно и на второе писать, дефаулт которой, перебирал даже все значения от 0 до 255, результат нулевой , ниче не делает, ничего не просисходит. Вообще странно, если винде пофиг апи ей посылать или с клавиатуры ном команды, зачем тогда не реагирует никак?

Главное на вордпадах и др программах работает а тут отказывается
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
06.11.2012, 00:50     Имитировать нажатие клавиши #10
Давай всё ж таки понятнее изъясняться.
Чё за скрин? Чё он даёт? Ну вижу окна, характеристики... Чё дальше?

Цитата Сообщение от GoodLife Посмотреть сообщение
пробовал и на активное окно и на второе писать
что писать?

Цитата Сообщение от GoodLife Посмотреть сообщение
перебирал даже все значения от 0 до 255
что за значения?

В общем, с чувством, с толком, с расстановкой давай говори чё хочешь сказать.
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 167
06.11.2012, 18:09  [ТС]     Имитировать нажатие клавиши #11
В общем там на фото сверху, два окна обвел, одно с названием АРЕНА, а другое без названия default (оба ясное дело принадлежат клиенту игры), использовал ваш код, запустил на исполнение его, и введ туда дескриптор окна (196854 на фото), жму клавишу, дпустим 1 и enter, программа говорит что все правильно введено, а в игре ничего не происходит, хотя в блокноте (вордпаде), когда я вводил дескриптор у окна RICHEDIT50W (я не помню уже цифры) все нормально было. и цифра 1 вставлялась.
Далее я подумал, ну мало ли какая там кодировка, ASCII, или еще какой, поэтому после запроса и определения программой дескрипта я запускал цикл от 1 до 255 , те все символы клавиатуры, но это тоже ничего не давало.
Далее, посмотрел и провел такие же манипуляции с окном default, ну мало ли думаю, тот же результат....
В общем теперь сижу думаю, но ничего путного в голову не приходит....
Ну как бы варианты кот я придумал
1) Может быть просто нажатия мало, нужно симитировать, хотя бы на долю секунды что клавиша нажата (в опущенном состоянии)
2) Ошибка в моем коде, не знаю только как это произошло, вроде просто скопировал
3) В игре используется трехмерная графика, значит используются или OpenGL или DirectX я собсно не знаю что там, примитивный движек какой-то стоит, но на чем он х з. Вот, может у них там свои замуты, но с другой стороны, какая разница что там в окне происходит. В общем в этой области мои знания о этом бренном мире совсем ничтожны. Ток суть знаю как это работает а не реализацию.
4) Еще что-то что тоже лежит за областью моих знаний

щас найду код выложу, не знаю нужно ли, такой же твой код, просто послал в цикле все символы и все...

Добавлено через 5 минут
листинг
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
45
46
47
#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
 
 
  //Внимание! ЕСли пишем WM_KEYDOWN, то третий параметр0 код клавиши. 
  //Следовательно, маленькие буквы не напечатаются
  //PostMessage ((HWND)2033532,WM_KEYDOWN,68, 1);
for (int i= 1; i!=255; i++ ) {  
  PostMessage (DeskriptorOkna,WM_CHAR, i, 1); 
  /*!!!вот только здесь изменил код,
  посылал все значения, но результат 0.*/
}
 
 //Осталась одна рабочая задача- научится выводить русские буквы.
 printf ("smotri rezultat ");
 getchar ();
 
 
 return 0;
}


Добавлено через 6 минут
Цитата Сообщение от kravam Посмотреть сообщение
В общем, с чувством, с толком, с расстановкой давай говори чё хочешь сказать.
Надеюсь нормально объяснил, и спасибо за помощь
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
06.11.2012, 19:12     Имитировать нажатие клавиши #12
Я с objectviewer знаком, она мне не нравится, на вот, помощнее будет всяко. Хотя особо не надо на это надеяться. Отпишись по результатам.
Вложения
Тип файла: rar spy.rar (300.2 Кб, 10 просмотров)
GoodLife
9 / 9 / 3
Регистрация: 23.10.2012
Сообщений: 167
06.11.2012, 22:21  [ТС]     Имитировать нажатие клавиши #13
Цитата Сообщение от kravam Посмотреть сообщение
Отпишись по результатам.
когда экзешник запускаю, пишет MFCu100.dll не был найден, может visual студия нужна, чтоб запустилась, я х з, у меня билдер, плюс куча др компилей и сред, но висуал нету....

*mfc100u.dll
хотя странно, в билдере MFC тоже д б, короче не запускается exe шник почемуто
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2013, 23:05     Имитировать нажатие клавиши
Еще ссылки по теме:

C++ Нажатие клавиши в консоли
C++ Нажатие клавиши программно
C++ Нажатие клавиши без ожидания Enter

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
25.01.2013, 23:05     Имитировать нажатие клавиши #14
на лови
Вложения
Тип файла: rar mfc100u.rar (1.59 Мб, 6 просмотров)
Yandex
Объявления
25.01.2013, 23:05     Имитировать нажатие клавиши
Ответ Создать тему
Опции темы

Текущее время: 13:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru