Wieso funktioniert der Code in Lazarus nicht?
Hallo, ich lerne gerade ein wenig mit Lazarus zu programmieren.
Ich möchte dabei Hotkeys programmieren, die man außerhalb von der TForm nutzen kann. Leider funktioniert das bei meinem Programm nicht, aber ich weiß nicht, was das Problem ist.
Code:
unit unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, LCLType, Windows;
type
{ TForm1 }
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
HotkeyRegistered: Boolean;
implementation
{$R *.lfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
HotkeyRegistered := False;
RegisterHotKey(Handle, 1, MOD_CONTROL or MOD_SHIFT, VK_NUMPAD1);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HotkeyRegistered then
UnRegisterHotKey(Handle, 1);
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (ssShift in Shift) and (Key = VK_NUMPAD1) then
begin
ShowMessage('Hotkey wurde gedrückt!');
end;
end;
end.
Weiß jemand, woran das liegt?
1 Antwort
Die FormKeyDown-Prozedur ist ein Handler für die Tastaturereignisse auf der Form. Du brauchst allerdings eine Funktion zum Abfangen deines systemweiten Hotkeys.
{ declaration }
private
procedure WMHotKey(var Msg: TMessage); message WM_HOTKEY;
{ implementation }
procedure TForm1.WMHotKey(var Msg: TMessage);
begin
{ ... }
end;
Wenn du mehrere Hotkeys registrierst, könntest du sie anhand der registrierten ID unterscheiden. In Msg.wParam steht die ID, die getriggert wurde.
if Msg.wParam = YourID then
begin
{ do something ... }
end;
Es wäre im Übrigen besser, wenn du dir eindeutige IDs vom System generieren lassen würdest, statt selbst IDs zu setzen, die womöglich bereits von anderen Programmen in Benutzung sind.
{ field declaration }
private
MyHotKeyID: Integer;
{ in FormCreate }
MyHotKeyID := GlobalAddAtom('MyHotKey');
RegisterHotKey(Handle, MyHotKeyID, MOD_CONTROL or MOD_SHIFT, VK_NUMPAD1);
Dein Feld HotkeyRegistered müsste zudem auf True gesetzt werden, sodass der Hotkey bei Programmbeendigung wieder entfernt wird. An sich könntest du aber auch komplett auf dieses Feld mitsamt Abfrage verzichten und einfach nur die UnRegisterHotKey-Funktion aufrufen.