![]() |
|
|
Регистрация | << Правила форума >> | 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. |