Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

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

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, 18:53   #3
evg_m
Профессионал
 
Регистрация: 20.04.2008
Сообщений: 4,654
Репутация: 2097
По умолчанию

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

Просто в фоне должна нажиматься клавиша F10 или F11. Другая программа успешно обрабатывает это нажатие.
Максим_maks вне форума   Ответить с цитированием
Старый 26.03.2018, 20:27   #5
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: WWW ЛЕНИНГРАД СПб точка РУ
Сообщений: 843
Репутация: 435
По умолчанию

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 в 20:40.
Aliens_wolfs вне форума   Ответить с цитированием
Старый 26.03.2018, 20:44   #6
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 47
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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, 21:21   #7
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: WWW ЛЕНИНГРАД СПб точка РУ
Сообщений: 843
Репутация: 435
По умолчанию

Цитата:
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 в 23:05.
Aliens_wolfs вне форума   Ответить с цитированием
Старый 27.03.2018, 10:31   #8
Максим_maks
Пользователь
 
Регистрация: 18.01.2015
Сообщений: 47
Репутация: 10
По умолчанию

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

Цитата:
Сообщение от 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, 23:46   #10
Aliens_wolfs
Участник клуба
 
Регистрация: 16.12.2009
Адрес: WWW ЛЕНИНГРАД СПб точка РУ
Сообщений: 843
Репутация: 435
По умолчанию

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

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

Код:

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 в 23:50.
Aliens_wolfs вне форума   Ответить с цитированием
Ответ

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


17:21.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru