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

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

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2018, 17:22   #1
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию Эмуляция клавиатуры.

Всем привет. Как можно реализовать нажатие кнопки F10-F11 с интервалом например 1 минуту? - , но с условием, что программа работает в фоне. Спасибо.
Максим_maks вне форума Ответить с цитированием
Старый 26.03.2018, 17:22   #2
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию

Вот накидал пример того, что хочу получить, но никак не получается отправить код кнопки.
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, LCLType;

type

{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure Label2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;

const Key = VK_F10;
var
Form1: TForm1;
Seconds,Minutes,Hours:Integer;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Seconds:=Seconds-1;
if(seconds<0) Then
Begin
Seconds:=5;
end ;

If (seconds = Innocent
Then
Timer1.Enabled:=true;
Label1.Caption:=IntToStr(Seconds);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Seconds:=5;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
);
begin
if (Key = VK_F10)
then ShowMessage('hello!');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.close;
end;

procedure TForm1.Label2Click(Sender: TObject);
begin

end;

end.
Максим_maks вне форума Ответить с цитированием
Старый 26.03.2018, 17:53   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

начнем с того КТО(какая программа) должна получать эти самые нажатия F10-F11
учитывая что ВАША программа
Цитата:
но с условием, что программа работает в фоне
и стало быть ЕСТЬ еще кто-то кто работает активно (или должен делать такой вид).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 26.03.2018, 18:28   #4
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию

Просто в фоне должна нажиматься клавиша F10 или F11. Другая программа успешно обрабатывает это нажатие.
Максим_maks вне форума Ответить с цитированием
Старый 26.03.2018, 19:27   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Timer1Timer для фонового режима не подойдет
Примерно так:
Код:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
       procedure WndProc(var Msg:TMessage); override;
  end;

var
  Form1: TForm1;

const
TIMER_SET_KEY = $10001;

implementation

{$R *.dfm}

//Функция для эмуляции нажатия и возврат в исходное состояние клавиши 
procedure SetKey(Key:DWORD);
begin
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Для фонового режима создаем системный таймер с интервалом 1мин
SetTimer(Handle, TIMER_SET_KEY, 60000, NIL);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
//Убиваем таймер
KillTimer(Handle, TIMER_SET_KEY);
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
case Msg.WParam of
TIMER_SET_KEY:
begin
SetKey(VK_F10);
SetKey(VK_F11);
end;
end;
Dispatch(Msg);
end;
А вот для поочередного нажатия с интервалом минута
Код:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
       procedure WndProc(var Msg:TMessage); override;
  end;

var
  Form1: TForm1;

const
TIMER_SET_F10 = $10001;
TIMER_SET_F11 = $10002;

implementation

{$R *.dfm}

procedure SetKey(Key:DWORD);
begin
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetTimer(Handle, TIMER_SET_F10, 60000, NIL);
SetTimer(Handle, TIMER_SET_F11, 120000, NIL);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
KillTimer(Handle, TIMER_SET_F10);
KillTimer(Handle, TIMER_SET_F11);
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
case Msg.WParam of
TIMER_SET_F10:
SetKey(VK_F10);
TIMER_SET_F11:
SetKey(VK_F11);
end;
Dispatch(Msg);
end;
end.

Последний раз редактировалось Aliens_wolfs; 26.03.2018 в 19:40.
Aliens_wolfs вне форума Ответить с цитированием
Старый 26.03.2018, 19:44   #6
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Timer1Timer для фонового режима непойдет
Примерно так:
Код:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
       procedure WndProc(var Msg:TMessage); override;
  end;

var
  Form1: TForm1;

const
TIMER_SEND_KEY = $10001;

implementation

{$R *.dfm}

//Функция для эмуляции нажатия клавиши
procedure SetKey(Key:DWORD);
begin
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Для фонового режима создаем системный таймер,
SetTimer(Handle, TIMER_SEND_KEY, 60000, NIL);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
KillTimer(Handle, TIMER_SEND_KEY);
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
case Msg.WParam of
TIMER_SEND_KEY:
begin
SetKey(VK_F10);
SetKey(VK_F11);
end;
end;
Dispatch(Msg);
end;
Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Timer1Timer для фонового режима не подойдет
Примерно так:
Код:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
       procedure WndProc(var Msg:TMessage); override;
  end;

var
  Form1: TForm1;

const
TIMER_SET_KEY = $10001;

implementation

{$R *.dfm}

//Функция для эмуляции нажатия и возврат в исходное состояние клавиши 
procedure SetKey(Key:DWORD);
begin
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Для фонового режима создаем системный таймер с интервалом 1мин
SetTimer(Handle, TIMER_SET_KEY, 60000, NIL);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
//Убиваем таймер
KillTimer(Handle, TIMER_SET_KEY);
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
case Msg.WParam of
TIMER_SET_KEY:
begin
SetKey(VK_F10);
SetKey(VK_F11);
end;
end;
Dispatch(Msg);
end;
А вот для поочередного нажатия с интервалом минута
Код:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
       procedure WndProc(var Msg:TMessage); override;
  end;

var
  Form1: TForm1;

const
TIMER_SET_F10 = $10001;
TIMER_SET_F11 = $10002;

implementation

{$R *.dfm}

procedure SetKey(Key:DWORD);
begin
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetTimer(Handle, TIMER_SET_F10, 60000, NIL);
SetTimer(Handle, TIMER_SET_F11, 120000, NIL);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
KillTimer(Handle, TIMER_SET_F10);
KillTimer(Handle, TIMER_SET_F11);
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
case Msg.WParam of
TIMER_SET_F10:
SetKey(VK_F10);
TIMER_SET_F11:
SetKey(VK_F11);
end;
Dispatch(Msg);
end;
end.

Вроде все скопировал как есть, но выдает ошибки:

Компиляция проекта, цель: C:\Users\maksim\AppData\Local\Temp\ project1.exe: Код завершения 1, ошибок: 2
unit1.pas(21,31) Error: Identifier not found "TMessage"
unit1.pas(21,15) Error: There is no method in an ancestor class to be overridden: "WndProc(var <erroneous type>);"
Максим_maks вне форума Ответить с цитированием
Старый 26.03.2018, 20:21   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
Error: Identifier not found "TMessage"
В вашем проекте из поста #2 вот так
Код:
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, LCLType;
Попробуйте добавить Windows, Messages

Минутку я под Delphi делал, сейчас под Lasarus проверю

Вот работает поочередное нажатие
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private

  public
    procedure WndProc(var Msg:TMessage); override;
  end;

var
  Form1: TForm1;
  NextKey: boolean=false;

const
TIMER_SET_KEY = $10001;

implementation

{$R *.lfm}

{ TForm1 }

procedure SetKey(Key:DWORD);
begin
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetTimer(Handle, TIMER_SET_KEY, 60000, NIL);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
KillTimer(Handle, TIMER_SET_KEY);
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
case Msg.WParam of
TIMER_SET_KEY:
begin
if not NextKey then
begin
NextKey:= true;
SetKey(VK_F10);
showmessage('VK_F10');
end
else
begin
NextKey:= false;
SetKey(VK_F11);
showmessage('VK_F11');
end;
end;
end;
Dispatch(Msg);
end; 

end.
Следующий код, делает несколько поочередных нажатий разными клавишами
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Windows, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private

  public
    procedure WndProc(var Msg:TMessage); override;
  end;

var
  Form1: TForm1;
  NextKey: integer=0;

const
TIMER_SET_KEY = $10001;

implementation

{$R *.lfm}

{ TForm1 }

procedure SetKey(Key:DWORD);
begin
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure NexSetKey(index: integer);
begin
Case index of
0:
begin
SetKey(VK_F9);
showmessage('VK_F9');
end;
1:
begin
SetKey(VK_F10);
showmessage('VK_F10');
end;
2:
begin
SetKey(VK_F11);
showmessage('VK_F11');
end;
3:
begin
SetKey(VK_F12);
showmessage('VK_F12');
end;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetTimer(Handle, TIMER_SET_KEY, 5000, NIL);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
KillTimer(Handle, TIMER_SET_KEY);
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
case Msg.WParam of
TIMER_SET_KEY:
begin
if NextKey > 3 then
NextKey:= 0;
NexSetKey(NextKey);
Inc(NextKey);
end;
end;
Dispatch(Msg);
end;

end.

Последний раз редактировалось Aliens_wolfs; 26.03.2018 в 22:05.
Aliens_wolfs вне форума Ответить с цитированием
Старый 27.03.2018, 09:31   #8
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию

Спасибо, все работает как надо - очень помогли.
Максим_maks вне форума Ответить с цитированием
Старый 17.04.2018, 23:55   #9
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Timer1Timer для фонового режима не подойдет
Примерно так:
Код:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
       procedure WndProc(var Msg:TMessage); override;
  end;

var
  Form1: TForm1;

const
TIMER_SET_KEY = $10001;

implementation

{$R *.dfm}

//Функция для эмуляции нажатия и возврат в исходное состояние клавиши 
procedure SetKey(Key:DWORD);
begin
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Для фонового режима создаем системный таймер с интервалом 1мин
SetTimer(Handle, TIMER_SET_KEY, 60000, NIL);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
//Убиваем таймер
KillTimer(Handle, TIMER_SET_KEY);
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
case Msg.WParam of
TIMER_SET_KEY:
begin
SetKey(VK_F10);
SetKey(VK_F11);
end;
end;
Dispatch(Msg);
end;
А вот для поочередного нажатия с интервалом минута
Код:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
       procedure WndProc(var Msg:TMessage); override;
  end;

var
  Form1: TForm1;

const
TIMER_SET_F10 = $10001;
TIMER_SET_F11 = $10002;

implementation

{$R *.dfm}

procedure SetKey(Key:DWORD);
begin
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY,0);
  keybd_event(Key,0,KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetTimer(Handle, TIMER_SET_F10, 60000, NIL);
SetTimer(Handle, TIMER_SET_F11, 120000, NIL);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
KillTimer(Handle, TIMER_SET_F10);
KillTimer(Handle, TIMER_SET_F11);
end;

procedure TForm1.WndProc(var Msg: TMessage);
begin
case Msg.WParam of
TIMER_SET_F10:
SetKey(VK_F10);
TIMER_SET_F11:
SetKey(VK_F11);
end;
Dispatch(Msg);
end;
end.

Здравствуйте.

Подскажите пожалуйста, создал таймер

Код:
Timer7.Enabled:=True;
В код таймера добавил (используя ваш код) запуск системного таймера и одновременно поймать код нажатой кнопки для дальнейшего выполнения действий - почему не работает? Что не так делаю? Или такая конструкция не работает.

Код:
procedure TForm1.Timer7Timer(Sender: TObject); 
var H : HWND;
begin  
     SetTimer(Handle, TIMER_SET_KEY, 15000, NIL);
     if getasynckeystate($79)<>0 then
     begin
     Application.Minimize;        
     .........
end;
Максим_maks вне форума Ответить с цитированием
Старый 18.04.2018, 22:46   #10
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Цитата:
Здравствуйте.

Подскажите пожалуйста, создал таймер

Код:

Timer7.Enabled:=True;
В фоновом режиме TTimer работать не будет
Если нужен еще таймер то делайте например как я уже создавал таймер

Код:
SetTimer(Handle, TIMER_SET_KEY2, 15000, NIL);

procedure TForm1.WndProc(var Msg: TMessage);
begin
case Msg.WParam of
TIMER_SET_KEY: // что то уже выполняется
TIMER_SET_KEY2:
     if getasynckeystate($79)<>0 then
begin
..............................
end;
Dispatch(Msg);
end;
Я же не зря писал в посте #5 про таймер и сделал так как будет работать, вникните в код

Последний раз редактировалось Aliens_wolfs; 18.04.2018 в 22:50.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, которая по введенному с клавиатуры значению аргумента x, находит значение функции f(x). Функция задается в виде графика. Параметр R вводится с клавиатуры scarecrow_1 C# (си шарп) 0 25.12.2016 10:33
Эмуляция клавиатуры Kazik Общие вопросы Delphi 2 16.01.2014 23:42
Эмуляция нажатия мыши, клавиатуры xmur Помощь студентам 2 08.04.2009 17:45
принадлежит ли число, введённое с клавиатуры отрезку (а;в). Границы отрезка вводятся с клавиатуры Maria, Russia Помощь студентам 3 17.02.2009 22:01
Эмуляция клавиатуры, вопрос seti Общие вопросы C/C++ 0 22.10.2008 04:58