Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2017, 16:17   #1
ratttx6
Пользователь
 
Регистрация: 29.05.2017
Сообщений: 11
Печаль Нужен другой способ или ошибка? ( Нужно В игру под директ3Д послать нажатие клавиши или мышки)

Добрый день! У меня такая трабла возникла. Нужно В игру под директ3Д послать нажатие клавиши или мышки.
Вот код и варианты кодов.

по таймеру...
Handle := GetForegroundWindow();
PostMessage(Handle, WM_IME_KEYDOWN,VK_ESCAPE,0 );

или

keybd_event(VK_ESCAPE, 0, 0, 0);
keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);

или

SendMessage(Handle, MOUSEEVENTF_LEFTDOWN, 0, 0);
SendMessage(Handle, MOUSEEVENTF_LEFTUP, 0, 0);

В другие приложения, текстовики и тд и тп - послать команды могу... А в игру не могу - ноль внимания, фунт презрения. В чем может быть проблема? Или может кто то предложит рабочий вариант... Большое ПАСИБА! ) П.с. гуглил, гуглил... гуглил... Уже мозг сломал.
ratttx6 вне форума Ответить с цитированием
Старый 29.05.2017, 16:27   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Некоторым между keybd_event нужна задержка (очееень маленькая, хоть какая-то), некоторые через директинпут получают все... ну а особо продвинутые используют raw input, а на отдельные сообщения кладут болт.
p51x вне форума Ответить с цитированием
Старый 29.05.2017, 16:39   #3
ratttx6
Пользователь
 
Регистрация: 29.05.2017
Сообщений: 11
По умолчанию

Вот такая штука тоже не прошла
var
d:tINPUT;
g:tagmouseinput;
pt:Tpoint;
begin
getcursorpos(pt);
g.dx:=pt.x;
g.dy:=pt.y;
g.mouseData:=0;
g.dwFlags:=MOUSEEVENTF_LEFTDOWN ;
g.time:=0;
d.mi:=g;
d.Itype:=INPUT_MOUSE;
SendInput(1,d,sizeof(d));

П.с. Задержку между нажатием и отжатием клавиш тоже делал, и Application.ProcessMessages; тоже вставлял... А вот про рав инпут не слышал - можно подробнее?
ratttx6 вне форума Ответить с цитированием
Старый 29.05.2017, 16:42   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Наслаждайтесь https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx . Кстати это рекомендованный способ ввода, особенно для игр.

P.S. Для сендинпута стоит почитать о UIPI

Последний раз редактировалось p51x; 29.05.2017 в 16:47.
p51x вне форума Ответить с цитированием
Старый 29.05.2017, 17:05   #5
ratttx6
Пользователь
 
Регистрация: 29.05.2017
Сообщений: 11
По умолчанию

я наверно слишком наглый, но можно попросить простенький пример, как через равинпут нажать правую кнопку мыши?
ratttx6 вне форума Ответить с цитированием
Старый 29.05.2017, 17:24   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Вы это и пытаетесь делать сендинпутом. только надо внимательно прочитать, что там и как шлется.

Вам бы сначала определиться с спосбом ввода и проблемой. Может вы просто не по тем координатам кликаете.
p51x вне форума Ответить с цитированием
Старый 29.05.2017, 17:35   #7
ratttx6
Пользователь
 
Регистрация: 29.05.2017
Сообщений: 11
По умолчанию

Способы ввода все перепробовал)
mouse_event(MOUSEEVENTF_RIGHTDOWN,6 00,600,0,0); //- нажать левой кнопки
Sleep(2000);
mouse_event(MOUSEEVENTF_RIGHTUP,600 ,600,0,0); //- отпустить левую кнопку


Координаты выставляются монитора, значения не имеют, мне нужно зажать на некоторое время правую кнопку мыши (на пару секунд) после отпустить.
Работает везде, кроме игры. В винде - без запуска игры - выскакивает менюшка(все как надо). А в игре ничего нет, никакого толку, даже пытался отослать кнопку Эскейпа, - тоже самое проку нет. В чем проблема, понять сам не могу. Может в игре стоит какая то защита от эмуляции клавиш, такое возможно?
ratttx6 вне форума Ответить с цитированием
Старый 29.05.2017, 17:48   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Я ж вам уже сказал
1. UIPI
2. все эти способы разные и могут обрабатываться или не обрабатываться
3. игра может проверять координаты клика и если за пределами своего окна плевать
и т.д.
p51x вне форума Ответить с цитированием
Старый 30.05.2017, 02:59   #9
ratttx6
Пользователь
 
Регистрация: 29.05.2017
Сообщений: 11
По умолчанию

Проблема так и не решилась ( П.с. координаты при фулл скрине 100% попадают в цель.
ratttx6 вне форума Ответить с цитированием
Старый 03.06.2017, 21:07   #10
ratttx6
Пользователь
 
Регистрация: 29.05.2017
Сообщений: 11
По умолчанию

До меня доперло!!! В чем проблема! steam сам перехватывает эмуляцию нажатий клавиш и Блокирует ее! И как это обойти??
ratttx6 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен или код, или блок схема, или просто обьяснение. shewlett Помощь студентам 1 03.06.2015 16:34
Есть ли компонент или способ отображать кликабельные ссылки в Memo или RichEdit? FleXik Общие вопросы Delphi 14 10.04.2014 04:54
Послать нажатие клавиши в Mozilla FireFox FaTaL Общие вопросы Delphi 14 04.02.2014 16:37
Послать нажатие клавиши + хуки c0mp Win Api 7 13.08.2012 10:26
Послать нажатие кнопки в игру (Warcraft) TwiX Общие вопросы Delphi 6 20.05.2010 17:46