Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.07.2025, 11:47
Dreammaster Dreammaster вне форума
Прохожий
 
Регистрация: 11.06.2014
Сообщения: 39
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию Error: Error in type definition

Здравствуйте. Почему при компиляции 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  
Старый 20.07.2025, 18:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Может потому, что не поддерживается инициализация переменныз при из описании?
Не знаю какие фичи есть у FPC, может какую опцию надо включить, что бы такой синтакс поддерживался, но по стандарту паскаля такого быть не должно.
Ответить с цитированием
  #3  
Старый 23.07.2025, 12:03
Dreammaster Dreammaster вне форума
Прохожий
 
Регистрация: 11.06.2014
Сообщения: 39
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Может потому, что не поддерживается инициализация переменныз при из описании?
Не знаю какие фичи есть у FPC, может какую опцию надо включить, что бы такой синтакс поддерживался, но по стандарту паскаля такого быть не должно.
В том-то и дело, что не должно...
Ответить с цитированием
  #4  
Старый 24.07.2025, 02:36
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,100
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну а если не должно - зачем пишешь так?
Ответить с цитированием
  #5  
Старый 24.07.2025, 13:06
Dreammaster Dreammaster вне форума
Прохожий
 
Регистрация: 11.06.2014
Сообщения: 39
Версия Delphi: RAD Studio XE3
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Ну а если не должно - зачем пишешь так?
Инициализация переменных из описании работает нормально. Куча файлов есть, где так же делал и всё работает. Не должно быть ошибки. Но она есть...
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.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:16.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025