Hi,
@Olli: An Code für einen Hook habe ich bisher noch gar nichts.
@tommie und Thornberry: ja, das klingt gut, danke!
Aber irgendwie funktioniert das noch nicht so ganz...
Habe mir auf die Schnelle das schnell in eine Klasse gepackt:
Delphi-Quellcode:
unit uGlobalHotKey;
interface
uses
Windows, Classes, Forms, Menus, Messages;
type
TGlobalHotKey =
class(TObject)
private
FHotKey: TShortCut;
FOnHotKey: TNotifyEvent;
protected
procedure WMHotKey(
var msg: TMessage);
message WM_HOTKEY;
public
constructor Create;
destructor Destroy;
override;
function RegisterKey: boolean;
function UnregisterKey: boolean;
published
property HotKey: TShortCut
read FHotKey
write FHotKey;
property OnHotKey: TNotifyEvent
read FOnHotKey
write FOnHotKey;
end;
implementation
{ TGlobalHotKey }
constructor TGlobalHotKey.Create;
begin
inherited;
// Nothing to do
end;
destructor TGlobalHotKey.Destroy;
begin
// Hotkey wieder freigeben
UnregisterKey;
inherited;
end;
function TGlobalHotKey.RegisterKey: boolean;
var
uModifier, uKey: Word;
sShiftState: TShiftState;
begin
Result := false;
// Kombination zugewiesen?
if FHotKey = 0
then Exit;
// Kombination entschlüsseln
ShortCutToKey(FHotKey, uKey, sShiftState);
uKey := Ord('
A');
// Modifier-Key rausfinden
uModifier := 0;
if ssAlt
in sShiftState
then
uModifier := uModifier
or MOD_ALT;
if ssCtrl
in sShiftState
then
uModifier := uModifier
or MOD_CONTROL;
if ssShift
in sShiftState
then
uModifier := uModifier
or MOD_SHIFT;
// Kombination registrieren
Result := RegisterHotKey(Application.Handle, $BFFF, uModifier, uKey);
end;
function TGlobalHotKey.UnregisterKey: boolean;
begin
// HotKey deregistrieren
Result := UnregisterHotKey(Application.Handle, $BFFF);
end;
procedure TGlobalHotKey.WMHotKey(
var msg: TMessage);
begin
// Nachricht erhalten und Event auslösen
if Assigned(FOnHotKey)
then
FOnHotKey(self);
end;
end.
Nun wird allerdings mein Ereignis nie ausgelöst. Und auch wenn ich über
Application.OnMessage versuche die Nachricht
WM_HOTKEY abzufangen warte ich relativ ewig...
Habe schon geguckt... rein theoretisch müsste es funktioniert (Einzelschritt sagt mir, dass [CTRL]+[ALT]+[A] registriert wurde).
Habt ihr eine Idee?
Chris