CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум Delphi

Ответ Создать новую тему
 
Старый 04.02.2011, 20:53   #1
idealser
Новичок
 
Регистрация: 28.04.2010
Адрес: Кишинев, Молдова
Сообщений: 35
Репутация: 4 (4)
Вопрос Отправка нажатий клавиш, с помошью PostMessage

Доброе время суток!
Мне необходимо послать нажатия клавиш в игру, непосредственно, основному окну. Хендл окна есть, сообщения отправляю через PostMessage. keybd_event не подходит, так как мне необходимо послать нажатия в неактивное окно.

Через Spy++ я просмотрел получаемые сообщения окном и взял оттуда параметры wParam и lParam. Таким образом, нажатие клавиши "1" у меня осуществляется так:

Код Delphi
1
2
  PostMessage(wnd, WM_KEYDOWN, $00000031,$00020001 );
  PostMessage(wnd, WM_KEYUP,   $00000031,$C0020001 );
Но при выполнении данной части кода, а точнее, при выполнении WM_KEYUP, у меня выходит Range check Error и ругается он на значение $C0020001. Я всячески пробовал подругому послать нажатие, но, тем не менее, все попытки были неудачными. Сообщения в Spy++, идентичны, за исключением WM_KEYUP и того, что у меня вместо одного WM_CHAR их два: по одному после нажатия и отжатия клавиши. Но тогда я использовал для отжатия параметры $00000031,$C0020001. Так должно быть? То есть, после отжатия тоже должен генерироваться WM_CHAR?

Ну и при "натуральном" нажатии клавиш сообщения выстраиваются в таком порядке:
WM_KEYDOWN, WM_CHAR, WM_KEYUP

Мой был таков:
WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_CHAR


Заранее благодарю.
idealser вне форума
Другие темы раздела
Что можна использовать вместо модуля CRT(Паскаль) в консоле Delphi
С такой проблемой столкнулся вчера:"Смотрел работу с цветом в паскаль решил попробовать сделать что то подобное в консоле Delphi но тут вспомнил что в Delphi нет модуля CRT." Чем возможно заменить этот модуль в Delphi - если это возможно?. Что можна использовать вместо модуля CRT(Паскаль) в консоле Delphi
Информационно- поисковая система. Delphi
Добрый день программисты! Задача такова: надо написать на Delphi программу- "информационно- поисковая система внутренней документации учреждения", конечно же не бесплатно :) --- Mawrat: Руслан19, опубликуй, свое сообщение также здесь: Фриланс: заказ программ, скриптов, сайтов.. Информационно- поисковая система.
Старый 04.02.2011, 21:42   #2
CodeMonkey
Форумчанин
 
Регистрация: 21.01.2011
Адрес: Россия, Тверь
Сообщений: 151
Репутация: 45 (45)
По умолчанию Re: Отправка нажатий клавиш, с помошью PostMessage

Код Delphi
1
PostMessage(wnd, WM_KEYUP,   $00000031,Integer($C0020001));
CodeMonkey вне форума
Старый 04.02.2011, 21:55  [ТС]   #3
idealser
Новичок
 
Регистрация: 28.04.2010
Адрес: Кишинев, Молдова
Сообщений: 35
Репутация: 4 (4)
По умолчанию Re: Отправка нажатий клавиш, с помошью PostMessage

Спасибо, ошибка исчезла, в Spy все точно также, как и при обычном нажатии, но... Никакого эффекта, я уже и не знаю как реализовать это нажатие клавиши
idealser вне форума
Старый 04.02.2011, 22:01   #4
CodeMonkey
Форумчанин
 
Регистрация: 21.01.2011
Адрес: Россия, Тверь
Сообщений: 151
Репутация: 45 (45)
По умолчанию Re: Отправка нажатий клавиш, с помошью PostMessage

http://www.transl-gunsmoker.ru/2010/06/postmessage.html

Добавлено через 1 минуту
P.S. Есть подозрение, что игра может читать ввод через DirectInput. Есть сомнения, что даже SendInput поможет с этим.
CodeMonkey вне форума
Старый 04.02.2011, 22:42  [ТС]   #5
idealser
Новичок
 
Регистрация: 28.04.2010
Адрес: Кишинев, Молдова
Сообщений: 35
Репутация: 4 (4)
По умолчанию Re: Отправка нажатий клавиш, с помошью PostMessage

Загвоздка в том, что игра читает такие клавиши, как: Enter, F1, F2, F3, Backspace... Причем принимает она их лишь отсылкой сообщения WM_CHAR. И плюс, есть программы, которые эмулируют нажатия именно в этой игре, так что это возможно. Сейчас почитаю про SendInput, попробую что-нибудь.

Добавлено через 27 минут
А разве SendInput работает с неактивными окнами? Мне нужно послать событие именно туда
idealser вне форума
Старый 04.02.2011, 23:40   #6
anonimus
Форумчанин
 
Аватар для anonimus
 
Регистрация: 28.04.2010
Сообщений: 4,277
Репутация: 2018 (1130)
По умолчанию Re: Отправка нажатий клавиш, с помошью PostMessage

idealser, дай ссылочку на Spy++
anonimus вне форума
Старый 05.02.2011, 00:43  [ТС]   #7
idealser
Новичок
 
Регистрация: 28.04.2010
Адрес: Кишинев, Молдова
Сообщений: 35
Репутация: 4 (4)
По умолчанию Re: Отправка нажатий клавиш, с помошью PostMessage

[Запрещённое содержимое - удалено.]
 Комментарий модератора Mawrat
Idealser, запрещено в общий доступ такое содержимое выкладывать.

Последний раз редактировалось Mawrat; 05.02.2011 в 01:28.
idealser вне форума
Старый 12.02.2011, 19:51  [ТС]   #8
idealser
Новичок
 
Регистрация: 28.04.2010
Адрес: Кишинев, Молдова
Сообщений: 35
Репутация: 4 (4)
По умолчанию Re: Отправка нажатий клавиш, с помошью PostMessage

Подсказали использовать оконные процедуры
Код Delphi
1
2
3
4
5
6
7
8
9
procedure KeyDown (VK : Byte);
var 
wndold : DWORD;
begin
wndold :=  GetWindowLongPtr(Wnd,GWL_WNDPROC); // первый способ получить WNDPROC
wndold :=  GetClassLong(Wnd,GCL_WNDPROC);  // второй способ получить WNDPROC
CallWindowProc (Pointer(wndold), Wnd, WM_KEYDOWN, $00000031,$00020001);
CallWindowProc (Pointer(wndold), Wnd, WM_KEYUP, $00000031,Integer($C0020001));
end;
1. Здесь возвращаемое значение равно нулю. GetLastError показывает 5: Отказано в доступе.
2. Во втором случае я получаю адрес процедуры класса, но SPY++ показал, что он отличен от оконного адреса процедуры. Наверное поэтому и игнорируются сообщения, они даже не доходят до окна.

У кого-нибудь есть предположения, как можно получить адрес оконной процедуры?

Добавлено через 1 час 21 минуту
Иногда, при использовании второго метода вылезает ошибка Privileged Instruction при вызове CallWindowProc.
idealser вне форума
После регистрации реклама в сообщениях будет скрыта
Старый 03.02.2012, 06:56   #9
Uzur123
Новичок
 
Регистрация: 03.02.2012
Адрес: Хабаровск
Сообщений: 11
Репутация: 0 (0)
По умолчанию Re: Отправка нажатий клавиш, с помошью PostMessage

На сколько я понял, требуется отправить сочетание клавиш неактивному окну, при том что отправка нажатий одиночных кливиш срабатывает.

А вы не пробывали отправлять команды сделующим образом ?

отправка нажатия кнопки 1
задержка 200 миллисекунд
отправка нажатия кнопки 2
задержка 200 миллисекунд
отправка отжатия кнопки 2
задержка 200 миллисекунд
отправка отжатия кнопки 1


Так как я вижу что автор в первом примере пробует сделать так:

отправка нажатия кнопок 1 2
отжатие кнопок 1 2
(ни задержек ни порядка свёрнутое приложение может просто не распознать)


извиняюсь что не предоставляю программного кода, так как не знаком с синтаксисом этих команд, да и проверить в данный момент негде.
Uzur123 вне форума
Ответ Создать новую тему

Похожие темы
Тема Автор
.NET Windows Forms Имитация нажатий клавиш клавиатуры
Доброго времени суток господа программисты ! Вопрос вот в чём ! Как можно из программы с имитировать нажатие клавиши клавиатуры ! Если например повесить hook на клавиатуру таким образом : private void pictureBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { ...
free6878
C# .NET Эмулирование нажатий клавиш
Добрый вечер! Есть задача - сэмулировать нажатие определенной клавиши. Короче, есть игра, где по нажатию на клавишу "+" на панели с цыфрами (что справа) происходит определенное действие, тоже самое и с клавишой "-", причем изменить из никак нельзя, нажатие на основной клавиатуре (сверху букв з, х,...
shalad
C# .NET .NET 3.x Перехват нажатий клавиш
Добрый вечер! Подскажите пожалуйста, как в консольном приложении перехватить нажатие клавиш на клавиатуре. Добавлено через 22 минуты Т.е. чтобы не было, собственно, ввода в консоль, а был перехват... если это вообще реально сделать
Freelancer_Alex
Visual C++ Перехват нажатий клавиш
Уже всё перерыл, чтобы найти что-то подобное! Если нахожу пример - он либо не компилируется, либо сделан на другом языке! Попробую разъяснить, что я хочу: Мне нужно сделать программу, которая сидя в трее перехватывала нажатия клавиш и выдавала простое сообщение с кодом (или символом) нажатой...
FiX
C++ Builder Эмулирование нажатий клавиш
Вводная: С++ builder 6. Программа А та что пишу я. Программа Б не моя. Вопросы: 1)Как из неактивного окна программы А отправить нажатие клавиши в неактивное окно программы Б. 2)Как из активного окна программы Б отправить нажатие клавиши в неактивное окно программы А.
Lurker
Опции темы

Текущее время: 01:33. Часовой пояс GMT +4.

Компьютерный форум программистов и сисадминов
Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Рейтинг@Mail.ru Яндекс.Метрика