Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нажать Enter


Pavelnk ©   (2015-07-29 18:11:00) 

Пишу маленькую прожку-помощник для себя. Как выставить мышку в нужное место я разобрался, как заставить её кликнуть, тоже -
mouse_event(MOUSEEVENTF_LEFTDOWN, p.X, p.Y, 0, 0);
Как мне теперь программно нажать Enter?


Игорь Шевченко   (2015-07-30 10:25:00) [1]

Pavelnk ©   (29.07.15 22:55) [9]

Это платная услуга


Pavelnk   (2015-07-29 22:55:00) [2]

> Игорь Шевченко ©   (29.07.15 22:23) [8]
Да, поставил sleep(170); всё заработало. Вот только один вопрос остался, как точку нажать? Вот так не хочет -
keybd_event(ord('.'), 0, 0, 0);
keybd_event(ord('.'), 0, KEYEVENTF_KEYUP, 0);
sleep(170);


Игорь Шевченко   (2015-07-29 22:23:00) [3]

Я неспециальные кнопки нажимал иначе:

procedure PlayKey(const C: Char);
var
 Inputs: array[0..1] of TInput;
begin
 if C <> '_' then
 begin
   FillChar(Inputs, SizeOf(Inputs), 0);
   Inputs[0].Itype := INPUT_KEYBOARD;
   Inputs[0].ki.wVk := Ord(C);
   Inputs[0].ki.dwFlags := KEYEVENTF_EXTENDEDKEY;
   Inputs[1].Itype := INPUT_KEYBOARD;
   Inputs[1].ki.wVk := Ord(C);
   Inputs[1].ki.dwFlags := KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP;
   SendInput(2, TInput((@Inputs)^), SizeOf(TInput));
 end
 else
 begin
   keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY, 0);
   keybd_event(VK_OEM_MINUS, 0, KEYEVENTF_EXTENDEDKEY, 0);
   keybd_event(VK_OEM_MINUS, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
   keybd_event(VK_SHIFT, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
 end;
end;


ВладОшин   (2015-07-29 21:39:00) [4]

еще лучше через MapVirtualKey(, а не просто 0

procedure TfrmSnils.PressThisKey(Key: Char);
var
  VK: Byte;
begin
 case  Key of
  '-': VK := $6D;
  #08: VK := VK_BACK;
  else VK := Ord(UpCase(Key));
 end;

   Application.ProcessMessages;
   keybd_event(VK, MapVirtualKey(VK,0), 0, 0);
   Application.ProcessMessages;
   keybd_event(VK, MapVirtualKey(VK,0), KEYEVENTF_KEYUP, 0);
   Application.ProcessMessages;
end;

procedure TfrmSnils.TypeThisStr(S: string);
var
 i: Integer;
begin
 for i := 1 to Length(s) do
 begin
   PressThisKey(s[i]);
   Application.ProcessMessages;
 end;
end;


Игорь Шевченко   (2015-07-29 21:21:00) [5]

попробуй вставить задержку между нажатием клавиш в 100 мс


Pavelnk   (2015-07-29 19:27:00) [6]

> Игорь Шевченко ©   (29.07.15 19:19) [4]
> потому что у тебя ошибка в коде
Почему ошибка? Всё вместе должно быть примерно так -
SetCursorPos(p.X, p.Y);
mouse_event(MOUSEEVENTF_LEFTDOWN, p.X, p.Y, 0, 0);
keybd_event(ord('D'), 0, 0, 0);  //первая буква
keybd_event(ord('D'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(ord('G'), 0, 0, 0); //вторая буква
keybd_event(ord('G'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY,0);
keybd_event(VK_RETURN,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);


Игорь Шевченко   (2015-07-29 19:19:00) [7]


>  И ещё вопрос, почему я не могу ввести несколько букв подряд?


потому что у тебя ошибка в коде


Pavelnk   (2015-07-29 19:09:00) [8]

> Игорь Шевченко ©   (29.07.15 19:00) [2]
Да, спасибо! И ещё вопрос, почему я не могу ввести несколько букв подряд?

> keybd_event(ord('D'), 0, 0, 0);
> keybd_event(ord('D'), 0, KEYEVENTF_KEYUP, 0);

Если одна, то всё нормально. Фокус что ли теряется?


Игорь Шевченко   (2015-07-29 19:00:00) [9]

keybd_event(VK_RETURN, 0, KEYEVENTF_EXTENDEDKEY, 0);
 keybd_event(VK_RETURN, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);


Pavelnk   (2015-07-29 18:12:00) [10]

В смысле вроде как с клавиатуры.


Наверх

Титульная страница Поиск, карта сайта Написать письмо