![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте. Почему при компиляции Lazarus выдает ошибку unit1.pas(36,16) Error: Error in type definition
и указывает на строку hHook: HHOOK = 0; ? Два дня понять не могу, что ему не нравится. Код:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Windows;
type
{ TForm1 } TForm1 = class(TForm)
ClickTimer: TTimer;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
MoveTimer: TTimer;
StatusLabel: TLabel;
procedure ClickTimerTimer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure MoveTimerTimer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function LLKeyProc(nCode: integer; wp: WPARAM; lp: LPARAM): LRESULT; stdcall;
var
Form1: TForm1;
hHook: HHOOK = 0;
isEmulationActive: Boolean = False;
moveDirection: Integer = 1;
originalPos: TPoint;
implementation
{$R *.lfm}
{ TForm1 }
procedure SimulateLeftClick;
var
Inputs: array[0..1] of TInput;
begin
FillChar(Inputs, SizeOf(Inputs), 0);
Inputs[0].Itype := INPUT_MOUSE;
Inputs[0].mi.dwFlags := MOUSEEVENTF_LEFTDOWN;
Inputs[1].Itype := INPUT_MOUSE;
Inputs[1].mi.dwFlags := MOUSEEVENTF_LEFTUP;
SendInput(2, Inputs[0], SizeOf(TInput));
end;
function LLKeyProc(nCode: integer; wp: WPARAM; lp: LPARAM): LRESULT; stdcall;
var
vk: DWORD;
begin
Result := 0;
if nCode = HC_ACTION then
begin
vk := PLowLevelKeyboardProc(lp)^.vkCode;
if (wp = WM_KEYDOWN) or (wp = WM_SYSKEYDOWN) then
begin
case vk of
VK_F3:
begin
if not isEmulationActive then
begin
isEmulationActive := True;
Form1.StatusLabel.Caption := 'Статус: РАБОТАЕТ (F4 - стоп)';
Form1.StatusLabel.Font.Color := clGreen;
GetCursorPos(originalPos);
moveDirection := 1;
Form1.ClickTimer.Interval := StrToIntDef(Form1.Edit1.Text, 120);
Form1.MoveTimer.Interval := StrToIntDef(Form1.Edit3.Text, 1000);
Form1.ClickTimer.Enabled := True;
Form1.MoveTimer.Enabled := True;
end;
end;
VK_F4:
begin
if isEmulationActive then
begin
isEmulationActive := False;
Form1.StatusLabel.Caption := 'Статус: ОСТАНОВЛЕНО (F3 - старт)';
Form1.StatusLabel.Font.Color := clRed;
Form1.ClickTimer.Enabled := False;
Form1.MoveTimer.Enabled := False;
end;
end;
else
Result := CallNextHookEx(hHook, nCode, wp, lp);
end;
end
else
Result := CallNextHookEx(hHook, nCode, wp, lp);
end
else
Result := CallNextHookEx(hHook, nCode, wp, lp);
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text := '120';
Edit2.Text := '100';
Edit3.Text := '1000';
StatusLabel.Caption := 'Статус: ОСТАНОВЛЕНО (F3 - старт)';
StatusLabel.Font.Color := clRed;
hHook := SetWindowsHookEx(WH_KEYBOARD_LL, @LLKeyProc, HInstance, 0);
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
if hHook <> 0 then
UnhookWindowsHookEx(hHook);
end;
procedure TForm1.ClickTimerTimer(Sender: TObject);
begin
if isEmulationActive then
begin
SimulateLeftClick;
end;
end;
procedure TForm1.MoveTimerTimer(Sender: TObject);
var
distance: Integer;
currentPos: TPoint;
begin
if not isEmulationActive then
Exit;
distance := StrToIntDef(Edit2.Text, 100);
GetCursorPos(currentPos);
if moveDirection = 1 then
begin
SetCursorPos(originalPos.X + distance, currentPos.Y);
moveDirection := -1;
end
else
begin
SetCursorPos(originalPos.X, currentPos.Y);
moveDirection := 1;
SetCursorPos(originalPos.X, currentPos.Y + 5);
GetCursorPos(originalPos);
end;
end;
end. |
|
#2
|
|||
|
|||
|
Может потому, что не поддерживается инициализация переменныз при из описании?
Не знаю какие фичи есть у FPC, может какую опцию надо включить, что бы такой синтакс поддерживался, но по стандарту паскаля такого быть не должно. |
|
#3
|
|||
|
|||
|
Цитата:
|
|
#4
|
|||
|
|||
|
Ну а если не должно - зачем пишешь так?
|
|
#5
|
|||
|
|||
|
Цитата:
upd. Всё оказалось очень просто. hHook переобозвал в MyHook и всё заработало. Код:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, Windows;
const
WH_KEYBOARD_LL = 13;
type
PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
TKBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: ULONG_PTR;
end;
{ TForm1 }
TForm1 = class(TForm)
ClickTimer: TTimer;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
MoveTimer: TTimer;
StatusLabel: TLabel;
procedure ClickTimerTimer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure MoveTimerTimer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function LLKeyProc(nCode: integer; wp: WPARAM; lp: LPARAM): LRESULT; stdcall;
var
Form1: TForm1;
MyHook: HHOOK = 0; // Не нравилось название переменной!
isEmulationActive: Boolean = False;
moveDirection: Integer = 1;
originalPos: TPoint;
implementation
{$R *.lfm}
{ TForm1 }
function LLKeyProc(nCode: integer; wp: WPARAM; lp: LPARAM): LRESULT; stdcall;
var
keyInfo: PKBDLLHOOKSTRUCT;
vk: DWORD;
begin
Result := 0;
if nCode = HC_ACTION then
begin
keyInfo := PKBDLLHOOKSTRUCT(lp);
if Assigned(keyInfo) then
begin
vk := keyInfo^.vkCode;
if (wp = WM_KEYDOWN) or (wp = WM_SYSKEYDOWN) then
begin
case vk of
VK_F3:
begin
if not isEmulationActive then
begin
isEmulationActive := True;
Form1.StatusLabel.Caption := 'Статус: РАБОТАЕТ (F4 - стоп)';
Form1.StatusLabel.Font.Color := clGreen;
GetCursorPos(originalPos);
moveDirection := 1;
Form1.ClickTimer.Interval := StrToIntDef(Form1.Edit1.Text, 120);
Form1.MoveTimer.Interval := StrToIntDef(Form1.Edit3.Text, 1000);
Form1.ClickTimer.Enabled := True;
Form1.MoveTimer.Enabled := True;
end;
end;
VK_F4:
begin
if isEmulationActive then
begin
isEmulationActive := False;
Form1.StatusLabel.Caption := 'Статус: ОСТАНОВЛЕНО (F3 - старт)';
Form1.StatusLabel.Font.Color := clRed;
Form1.ClickTimer.Enabled := False;
Form1.MoveTimer.Enabled := False;
end;
end;
else
Result := CallNextHookEx(MyHook, nCode, wp, lp);
end;
end
else
Result := CallNextHookEx(MyHook, nCode, wp, lp);
end
else
Result := CallNextHookEx(MyHook, nCode, wp, lp);
end
else
Result := CallNextHookEx(MyHook, nCode, wp, lp);
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
StatusLabel.Caption := 'Статус: ОСТАНОВЛЕНО (F3 - старт)';
StatusLabel.Font.Color := clRed;
MyHook := SetWindowsHookEx(WH_KEYBOARD_LL, @LLKeyProc, HInstance, 0);
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
if MyHook <> 0 then
UnhookWindowsHookEx(MyHook);
end;
procedure TForm1.ClickTimerTimer(Sender: TObject);
begin
if isEmulationActive then
begin
mouse_event(MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_LEFTUP, 0, 0, 0, GetMessageExtraInfo);
end;
end;
procedure TForm1.MoveTimerTimer(Sender: TObject);
var
distance: Integer;
currentPos: TPoint;
begin
if not isEmulationActive then
Exit;
distance := StrToIntDef(Edit2.Text, 100);
GetCursorPos(currentPos);
if moveDirection = 1 then
begin
SetCursorPos(originalPos.X + distance, currentPos.Y);
moveDirection := -1;
end
else
begin
SetCursorPos(originalPos.X, currentPos.Y);
moveDirection := 1;
SetCursorPos(originalPos.X, currentPos.Y + 5);
GetCursorPos(originalPos);
end;
end;
end.
Последний раз редактировалось Dreammaster, 24.07.2025 в 13:32. |