|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Посылаем нажатия клавиш другому приложению (не путать клавишу с символом)
Здравствуйте, весь интернет излазил но так и не нашел, примеров много но все они в водят в заблуждения и походу сами не понимают, что они отправляют приложению, код символа
keybd_event(90, 0, KEYEVENTF_KEYUP, 0); или код нажатой клавиши. ЕСТЬ РАЗНИЦА, ОТПРАВИТЬ КОД НАЖАТОЙ КНОПКИ X И КОД СИМВОЛА РАСКЛАДКИ X. Если кто-то когда-то смог реализовать то поясните пожалуйста, как это реализовать. Спасибо. |
#2
|
|||
|
|||
Цитата:
все, что ниже распознается как не кнопка и код отправленный чем угодно Код:
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
|
|||
|
|||
А как ты представляешь себе то, как программа получает информацию о нажатии клавиши на клавиатуре? Драйвер ОС получает информацию о полученном сигнале (прерывание BIOS) и отправляет соотв. сообщение в очередь ОС. Т.е. до программы в любом случае доходит просто сообщение о нажатой кнопке (DirectInput не рассматриваем, хотя, в принципе, там все тоже самое, только в обход самой ОС). Так что код выше вполне логичен для эмуляции нажатия клавишь на клавиатуре.
Или тебе надо нажать TButton? Тут, конечно, все по другому делать надо... Можно, например, найти хэндл нужной кнопки по послать ему сообщение о клике мышы или нажатия Enter или Пробел. |
#4
|
|||
|
|||
Вангую, приложение это игра, поэтому она и не распознает твои SendMessage так как игры используют DirectInput
Цитата:
Клавиши(не все, тут только те что были нужны мне) 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; |