Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.01.2023, 20:18
l2grom l2grom вне форума
Прохожий
 
Регистрация: 01.01.2023
Сообщения: 2
Версия Delphi: Delphi 10
Репутация: 10
Восклицание Посылаем нажатия клавиш другому приложению (не путать клавишу с символом)

Здравствуйте, весь интернет излазил но так и не нашел, примеров много но все они в водят в заблуждения и походу сами не понимают, что они отправляют приложению, код символа
keybd_event(90, 0, KEYEVENTF_KEYUP, 0);

или код нажатой клавиши. ЕСТЬ РАЗНИЦА, ОТПРАВИТЬ КОД НАЖАТОЙ КНОПКИ X И КОД СИМВОЛА РАСКЛАДКИ X.

Если кто-то когда-то смог реализовать то поясните пожалуйста, как это реализовать. Спасибо.
Ответить с цитированием
  #2  
Старый 02.01.2023, 22:33
l2grom l2grom вне форума
Прохожий
 
Регистрация: 01.01.2023
Сообщения: 2
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию

Цитата:
Сообщение от l2grom
Здравствуйте, весь интернет излазил но так и не нашел, примеров много но все они в водят в заблуждения и походу сами не понимают, что они отправляют приложению, код символа
keybd_event(90, 0, KEYEVENTF_KEYUP, 0);

или код нажатой клавиши. ЕСТЬ РАЗНИЦА, ОТПРАВИТЬ КОД НАЖАТОЙ КНОПКИ X И КОД СИМВОЛА РАСКЛАДКИ X.

Если кто-то когда-то смог реализовать то поясните пожалуйста, как это реализовать. Спасибо.

все, что ниже распознается как не кнопка и код отправленный чем угодно
Код:
keybd_event(VK_F1,Lo(MapVirtualKey(VK_F1,1)),KEYEVENTF_EXTENDEDKEY,1); (*нажатие*)
keybd_event(VK_F1,Lo(MapVirtualKey(VK_F1,1)),KEYEVENTF_KEYUP,1); (*отпускание*)

SendMessage(592216,WM_KEYDOWN,VK_F1,0);
SendMessage(592216,WM_KEYUP,VK_F1,0);

PostMessage(592216, WM_KEYDOWN, VK_F1, 0);
PostMessage(592216, WM_KEYUP, VK_F1, 0);

  for I := 1 to Length(Str) do
   begin
     // press
    Inp.Itype := INPUT_KEYBOARD;
     Inp.ki.wVk := Ord(UpCase(Str[i]));
     Inp.ki.dwFlags := 0;
     SendInput(1, Inp, SizeOf(Inp));

     // release
    Inp.Itype := INPUT_KEYBOARD;
     Inp.ki.wVk := Ord(UpCase(Str[i]));
     Inp.ki.dwFlags := KEYEVENTF_KEYUP;
     SendInput(1, Inp, SizeOf(Inp));

     Application.ProcessMessages;
     Sleep(80);
   end;

lmikle: пользуемся тегами.
==============================================

весь это код распознается не как нажатая клавиша, а как код отправленный. я ищю способ нажать кнопку и что-бы она была воспрринята как нажатая кнопка а не КОД ТАБЛИЦЫ КЛАВИАТУРЫ

Последний раз редактировалось lmikle, 05.01.2023 в 01:52.
Ответить с цитированием
  #3  
Старый 05.01.2023, 01:52
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А как ты представляешь себе то, как программа получает информацию о нажатии клавиши на клавиатуре? Драйвер ОС получает информацию о полученном сигнале (прерывание BIOS) и отправляет соотв. сообщение в очередь ОС. Т.е. до программы в любом случае доходит просто сообщение о нажатой кнопке (DirectInput не рассматриваем, хотя, в принципе, там все тоже самое, только в обход самой ОС). Так что код выше вполне логичен для эмуляции нажатия клавишь на клавиатуре.

Или тебе надо нажать TButton? Тут, конечно, все по другому делать надо... Можно, например, найти хэндл нужной кнопки по послать ему сообщение о клике мышы или нажатия Enter или Пробел.
Ответить с цитированием
  #4  
Старый 21.01.2023, 16:42
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Вангую, приложение это игра, поэтому она и не распознает твои SendMessage так как игры используют DirectInput

Цитата:
Сообщение от l2grom
весь интернет излазил но так и не нашел.
Да ну уж прям весь? На одном известном форуме в разделе посвященному Delphi есть мое сообщение от 19.08.2017 в котором я скинул человеку код для эмуляции нажатий в играх. Я просто скопирую его сюда, пусть тут тоже будет.

Клавиши(не все, тут только те что были нужны мне)
P.S. D0-D9 это цифры от 0 до 9 соответственно
Код:
{
DirectInputKey.A:=30;
DirectInputKey.B:=48;
DirectInputKey.C:=46;
DirectInputKey.D:=32;
DirectInputKey.E:=18;
DirectInputKey.F:=33;
DirectInputKey.G:=34;
DirectInputKey.H:=35;
DirectInputKey.I:=23;
DirectInputKey.J:=36;
DirectInputKey.K:=37;
DirectInputKey.L:=38;
DirectInputKey.M:=50;
DirectInputKey.N:=49;
DirectInputKey.O:=24;
DirectInputKey.P:=25;
DirectInputKey.Q:=16;
DirectInputKey.R:=19;
DirectInputKey.S:=31;
DirectInputKey.T:=20;
DirectInputKey.U:=22;
DirectInputKey.V:=47;
DirectInputKey.W:=17;
DirectInputKey.X:=45;
DirectInputKey.Y:=21;
DirectInputKey.Z:=44;
DirectInputKey.D0:=11;
DirectInputKey.D1:=2;
DirectInputKey.D2:=3;
DirectInputKey.D3:=4;
DirectInputKey.D4:=5;
DirectInputKey.D5:=6;
DirectInputKey.D6:=7;
DirectInputKey.D7:=8;
DirectInputKey.D8:=9;
DirectInputKey.D9:=10;
}
const KEYEVENTF_SCANCODE:Cardinal=8;

//key:Word - клавиша
//t:Integer - время в миллисекундах, сколько клавишу держать нажатой. 
procedure SendKey(key:Word; t:Integer);
var
  Inp:TInput;
begin
  Inp.Itype:=1;
  Inp.ki.wScan:=key;
  Inp.ki.dwFlags:=KEYEVENTF_SCANCODE;
  SendInput(2, Inp, SizeOf(Inp));
  Sleep(t);
  Inp.ki.dwFlags:=KEYEVENTF_KEYUP;
  SendInput(2, Inp, SizeOf(Inp));
end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter