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

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

Имитация нажатия клавиш [D7, XP]


Сергей ©   (2013-04-08 11:43:00) 

Здравствуйте.
Помогите, пожалуйста, написать, маленькую программку, которая бы имитировала нажатие клавиш на клавиатуре.
Т.е. нажимаю кнопку «Старт» и программа каждую секунду имитирует нажатие клавиш «1, 2, 3», и так пока не нажата кнопка «Стоп», или пока я сам на нажал на клавиатуре заранее определенную клавишу остановки (напр. F12).
Я вот пробую использовать такой код

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
 for i := 1 to 100 do begin
   keybd_event(Ord('1'), 0, 0, 0); //Нажатие  1.
   keybd_event(Ord('1'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 1.
   Application.ProcessMessages;
   Sleep(1000);

   keybd_event(Ord('2'), 0, 0, 0); //Нажатие 2.
   keybd_event(Ord('2'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 2.
   Application.ProcessMessages;
   Sleep(1000);

   keybd_event(Ord('3'), 0, 0, 0); //Нажатие 3.
   keybd_event(Ord('3'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 3.
   Application.ProcessMessages;
   Sleep(1000);
 end;
end;

Имитация идет хорошо, но программа пока не отработает цикл от 1 до 100 просто подвисает и ни на что не реагирует.

Можно ли создать такой примерно цикл

Пока не нажата F12 повторять
Начало цикла
   keybd_event(Ord('1'), 0, 0, 0); //Нажатие  1.
   keybd_event(Ord('1'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 1.
   Application.ProcessMessages;
   Sleep(1000);
Конец цикла.

Или

Пока не нажата кнопка «Стоп» повторять
Начало цикла
   keybd_event(Ord('1'), 0, 0, 0); //Нажатие  1.
   keybd_event(Ord('1'), 0, KEYEVENTF_KEYUP, 0); //Отпускание 1.
   Application.ProcessMessages;
   Sleep(1000);
Конец цикла.

Спасибо.


Вова   (2013-04-11 09:18:00) [1]

можно еще короче )

while (getasynckeystate($1B) = 0) do
..........


Вова   (2013-04-11 08:35:00) [2]


> И как "это" отвечает на вопрос автора топика?


Элементарно, это способ выйти по кнопке с клавы из цикла, а можно и из программы.


Германн   (2013-04-11 02:39:00) [3]


> Вова   (10.04.13 23:22) [6]

И как "это" отвечает на вопрос автора топика?


Вова   (2013-04-10 23:22:00) [4]

while True do
begin

if getasynckeystate($1B) <> 0 then
 begin
   ShowMessage('Работа программы завершена пользователем');
   break;
 end;
............................
end;

ток тут эскейп


Сергей   (2013-04-09 10:15:00) [5]

Спасибо. Получилось что хотел. Помогли ваши советы.


clickmaker   (2013-04-08 12:47:00) [6]

Form1.KeyPreview = true

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if (Key = VK_F12) then
   FF12Clicked := true;
end;

while not FF12Clicked do begin
...
end;


Сергей   (2013-04-08 12:35:00) [7]

Не могли бы выложить маленький пример кода?


Дмитрий С   (2013-04-08 11:52:00) [8]


> TForm1.Button1Click

Повесь нажатия и отпускания на таймер


brother   (2013-04-08 11:47:00) [9]

> Можно ли создать такой примерно цикл

можно.


Наверх

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