Avatar billede cool-wil Nybegynder
22. april 2002 - 19:07 Der er 38 kommentarer og
3 løsninger

keyhook?

Hvordan kan jeg aktivere en funktion i mit program, via et enkelt taste tryk
også selvom at et andet vindue er det aktive i windows
nogen ide?

wil/
Avatar billede cool-wil Nybegynder
22. april 2002 - 19:07 #1
det er nok værd at sige at mit program kører i traybaren, og kun der...
Avatar billede laffe Nybegynder
22. april 2002 - 19:14 #2
Det tror jeg ikke man kan.
Avatar billede cool-wil Nybegynder
22. april 2002 - 19:16 #3
det burde kunne lade sig gøre, har set det...

hvis jeg nu f.eks. vil have F12 til at aktivere en funktion i mit program

Hvad gør jeg?
Avatar billede laffe Nybegynder
22. april 2002 - 19:19 #4
Jamen det keyhook skal jo fanges at et window, som ved at der skal sendes en besked videre ned til din applikation i traybaren.
Avatar billede hermandsen Juniormester
22. april 2002 - 19:24 #5
Det kan sagtens lade sig gøre! Ved ikke helt hvordan, men jeg fandt da noget til dig som du måske kan bruge:
http://www.delphipages.com/advancedsearch.cfm?eSearch=keyhook&AO=and
Avatar billede cool-wil Nybegynder
22. april 2002 - 19:24 #6
mm hvordan kan man mon gøre det nemmest?
Avatar billede laffe Nybegynder
22. april 2002 - 19:28 #7
Jeg skal lige være med. Din application ligger i Traybar'en, og har IKKE fokus, men en hvilken som helst anden applikation har fokus ?
Avatar billede cool-wil Nybegynder
22. april 2002 - 19:34 #8
jepper laffe, netop..
man kommer ikke til at kunne se min app på prosess linien, men kun i tray
Avatar billede hermandsen Juniormester
22. april 2002 - 19:36 #9
Avatar billede cool-wil Nybegynder
22. april 2002 - 19:59 #10
mmm kigger lige på dine links hermandsen

er der andre som har efaring med netop dette?
Avatar billede cms Nybegynder
22. april 2002 - 20:04 #11
ja - og det kan godt lade sig gøre. skriv til mig cnt@cnt.dk hvis du ikke får brugbare links, så forklarer jeg dig det
Avatar billede laffe Nybegynder
22. april 2002 - 20:05 #12
Må vi andre ikke være med ?
Avatar billede cool-wil Nybegynder
22. april 2002 - 22:17 #13
jeg kan ikke rigtig komme vidre med de få links jeg har fået her, er der virklig ikke nogle som har arbejdet med hooks i delphi her?
Avatar billede borrisholt Novice
23. april 2002 - 10:15 #14
Start med at instalere dette komponent og vend så tilbage :

{------------------------------------------------------------------------------
  Unit    : GlobalHotKey.pas
  Purpose  : System hot key handling
  Status  : Freeware
  Copyright: ©2000 Jens Borrisholt, http://Borrisholt.com
  contact  : Jens@Borrisholt.com
-------------------------------------------------------------------------------

  History:

  Date                By      Comments
  ----                ----    --------
  15 August 2000      JB      Created

}
unit GlobalHotKey;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, menus;

type
  TGlobalHotKey = class(TComponent)
  private
    FEnabled: Boolean;
    FRegistered: Boolean;
    prOldWndProc: TWndMethod;
    FHotkey: TSHortcut;
    FOnHotKeyPressed: TNotifyEvent;
    prWindow: TWinControl;
    procedure RegisterKey;
    procedure UnRegisterKey;
    { Private declarations }
  protected
    { Protected declarations }
    procedure SetEnabled(const Value: Boolean);
    procedure SetHotKey(const Value: TShortcut);
    procedure NewWindowProc(var Message: TMessage);
    procedure Loaded; override;
  public
    { Public declarations }
    constructor Create(aOwner: TComponent); override;
    destructor Destroy; override;
    property Registered: boolean read FRegistered;
  published
    { Published declarations }
    property Enabled: Boolean read FEnabled write SetEnabled default true;
    property Key: TShortcut read FHotkey write SetHotkey;
    property OnHotKey: TNotifyEvent read FOnHotKeyPressed write FOnHotKeyPressed;
  end;

procedure Register;

implementation


{ TGlobalHotKey }

constructor TGlobalHotKey.Create(aOwner: TComponent);
begin
  inherited;
  FEnabled := True;
  FHotKey := 0;
  FRegistered := false;
  if not (csDesigning in ComponentState) then
  begin
    prWindow := TWinControl.CreateParented(GetDesktopWindow);
    prOldWndProc := prWindow.WindowProc;
    prWindow.WindowProc := NewWindowProc;
  end;
end;

destructor TGlobalHotKey.Destroy;
begin
  if not (csDesigning in ComponentState) then
  begin
    UnRegisterKey;
    prWindow.WindowProc := prOldWndProc;
    prWindow.Free;
  end;
  inherited;
end;

procedure TGlobalHotKey.Loaded;
begin
  inherited;
  if (FEnabled) and (not (csDesigning in ComponentState)) then RegisterKey;
end;

procedure TGlobalHotKey.NewWindowProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_HOTKEY:
    begin
      if assigned(FOnHotkeyPressed) then
        FOnHotKeyPressed(self);
    end;
  end;
  prOldWndProc(Message);
end;

procedure TGlobalHotKey.RegisterKey;
var
  lVKey: word;
  lvShift: TShiftstate;
  lModifier: UINT;
begin
  if not FRegistered then
  begin
    lModifier := 0;
    ShortcutToKey(FHotkey, lvKey, lvShift);

    if ssShift in lvShift  then
      lModifier := lModifier or MOD_SHIFT;

    if ssAlt in lvShift then
      lModifier := lModifier or MOD_ALT;

    if ssCtrl in lvShift then
      lModifier := lModifier or MOD_CONTROL;

    FRegistered := RegisterHotKey(prWindow.Handle, 0, lModifier, LOBYTE(lVKey));
  end;
end;

procedure TGlobalHotKey.SetEnabled(const Value: Boolean);
begin
  FEnabled := Value;
  if FEnabled then
    RegisterKey
  else
    UnregisterKey;
end;

procedure TGlobalHotKey.UnRegisterKey;
begin
  if FRegistered then
  begin
    UnregisterHotKey(prWindow.Handle, 0);
    FRegistered := False;
  end;
end;

procedure TGlobalHotKey.SetHotKey(const Value: TShortcut);
begin
  if Value <> FHotkey then
  begin
    FHotkey := Value;
    if not (csDesigning in ComponentState) then
    begin
        UnRegisterKey;
        if FEnabled then
          RegisterKey;
    end;
  end;
end;

procedure Register;
begin
  RegisterComponents('System', [TGlobalHotKey]);
end;

end.

Jens B
Avatar billede cool-wil Nybegynder
23. april 2002 - 10:51 #15
hey jens..
hvorfor skriver den:
[Fatal Error] global.pas(1): Program or unit 'global.pas' recursively uses itself når jeg prøver at installere det komponent?

wil/
Avatar billede borrisholt Novice
23. april 2002 - 11:15 #16
Det har ikke noget med mit komponent at gøre
Avatar billede cool-wil Nybegynder
23. april 2002 - 11:15 #17
oki, hvad tror du så der er sket?
Avatar billede cool-wil Nybegynder
23. april 2002 - 11:25 #18
hvad hedder komponenten når den er blevet installeret?
skal nemlig lige finde den rigtige:-)
Avatar billede borrisholt Novice
23. april 2002 - 11:33 #19
Klassen heddet TGlobalhotkey, og ligger under System .. Prøv at luk ALLE ting i din Delphi. Åben mit komponent op og instaler det ...

HUSK uniten skal hede GlobalHotKey.pas

Jens B
Avatar billede cool-wil Nybegynder
23. april 2002 - 11:35 #20
fandt den, kunne ikke lige se hvor den skulle være..

nu er det installeret jens, hvad gør jeg så?
Avatar billede cool-wil Nybegynder
23. april 2002 - 11:36 #21
vidste bare ikke lige hvor den var lagt på min palette, men har jo fundet den:-)
Avatar billede borrisholt Novice
23. april 2002 - 11:39 #22
så sæt den på din form .... i din Object Inspector har du en property der hedder "Key" den sætter du bare ....

Så skriver du blot noget kode i OnHotkey eventet !

Jens B
Avatar billede cool-wil Nybegynder
23. april 2002 - 11:40 #23
mmm keyen kan kun være et nummer right? ikke en F12 f.eks.

den skriver en error hvis jeg gør det..
Avatar billede cool-wil Nybegynder
23. april 2002 - 11:49 #24
jens:
jeg ved godt det er et newbiee spm, men hvorfor får jeg ikke noget frem ved:
procedure TForm1.GlobalHotKey1HotKey(Sender: TObject);
begin
ShowMessage('tester om borrisholts component virker!');
end;

sætter min key til 8 og mit tag til 8 også..

så sker der intet når jeg compiler, og prøver at aktivere et andet program, så mit ikke er i focus...

hvad gør jeg forkert?

end.
Avatar billede borrisholt Novice
23. april 2002 - 13:06 #25
Hmmn .. OKI minor bug på D6 ...

Men et godt WorkArround vil være :

procedure TForm1.FormCreate(Sender: TObject);
begin
  GlobalHotKey1.Key := TextToShortCut('Ctrl+F12');
end;

Jens B
Avatar billede cool-wil Nybegynder
23. april 2002 - 13:11 #26
mmm skal jeg så ikke sætte noget i key i object inspectoren?
og TextToShortCut skal det så være min kode der står der eller hvad?
Avatar billede cool-wil Nybegynder
23. april 2002 - 13:13 #27
kunne du evt. ikke lige prøve at lave en lille demo som indeholder nogle forskellige koder, som man kan bruge med dit komponent?, skal nok sætte points lidt op så;.)
Avatar billede borrisholt Novice
23. april 2002 - 13:14 #28
Det er fuldstendig ligemeget hvad du sætter Key til på Design time ... Altså i Object Inspectoren

Og JA det der TextToshortCut skal du skrive i den kode ..

Jens b
Avatar billede borrisholt Novice
23. april 2002 - 13:15 #29
Send mig lige en e-mail
Avatar billede cool-wil Nybegynder
23. april 2002 - 13:34 #30
oki doki
Avatar billede cool-wil Nybegynder
23. april 2002 - 13:36 #31
mail sendt til jens@borrisholt.dk


wil/
Avatar billede elv Nybegynder
25. april 2002 - 00:06 #32
Det er ikke nødvendigt med den komponent, hvis det blot er en simpel tast der skal bruges. Følgende eksempel viser, hvad man kan gøre, hvis man vil have programmet til at reagere på Ctrl + R og Ctrl + Q, og virker med andre taster også, f.eks. F12:
--------------- Kode start ---------------
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  protected
    procedure hotykey(var msg:TMessage); message WM_HOTKEY;
  end;

var
  Form1: TForm1;
  id,id2:Integer;

implementation
{$R *.DFM}

procedure TForm1.hotykey(var msg:TMessage);
begin
  // Ved Control + Q: Q = 81, Control = MOD_CONTROL
  if (msg.LParamLo=MOD_CONTROL) and (msg.LParamHi=81) then
  begin
    ShowMessage('Ctrl + Q!');
  end;

  if msg.LParamHi=vk_f12 then
  begin
    ShowMessage('F12');
  end;

  if (msg.LParamLo=MOD_CONTROL) and (msg.LParamHi=82) then
  begin
    ShowMessage('Ctrl + R!');
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  id:=GlobalAddAtom('hotkey');
  RegisterHotKey(handle,id,mod_control,81);

  id2:=GlobalAddAtom('hotkey2');
  RegisterHotKey(handle,id2,mod_control,82);

  id3:=GlobalAddAtom('hotkey3');
  RegisterHotKey(handle,id3,0,vk_f12);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotKey(handle,id);
  UnRegisterHotKey(handle,id2);
  UnRegisterHotKey(handle,id3);
end;
--------------- Kode slut ---------------

Det blev brugt i et gammelt spørgsmål her også, kan dog ikke lige huske det.

Elv
Avatar billede cool-wil Nybegynder
25. april 2002 - 18:21 #33
jeg har fundet lidt kode, er der en som kan se hvorfor den kun kan paste i offline ting( notepad f.eks.) og ikke direkte på nettet:

Kode start:---- 
unit Unit1;
interface
uses  Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,  StdCtrls, ClipBrd;
type
TForm1 = class(TForm)
    Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure WndProc(var Message: TMessage); override;
  public
  { Public declarations }
procedure ToClipbrd(StrValue: string);
end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WndProc(var Message: TMessage);
var
TmpStr : String;
begin
TmpStr := Memo1.Text;
  if (Message.Msg = WM_HOTKEY) and (Message.wParam = IDHOT_SNAPWINDOW)
  then
  begin
  if length(TmpStr) > 0 then
  begin
  ToClipbrd(TmpStr);
  keybd_event(VK_CONTROL, 0, 0, 0);
  keybd_event(VkKeyScan('v'), 1, 0, 0);
    keybd_event(VK_CONTROL, 0,KEYEVENTF_KEYUP,0);
    keybd_event(VkKeyScan('v'), 1, KEYEVENTF_KEYUP, 0);
    end;
    end;
    inherited WndProc(Message);
    end;
    procedure TForm1.ToClipbrd(StrValue: string);
    var
    A: array[0..255] of char;
    begin
    StrPCopy(A, StrValue);
    Clipboard.SetTextBuf(A);
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      if not (csDesigning in ComponentState) then
      RegisterHotkey(handle,IDHOT_SNAPWINDOW,MOD_CONTROL + MOD_SHIFT,VK_F12);
      end;
      end.
smid en tmemo ind, og så sku det virke...gør det det hos jer?

denne kode fandt jeg via http://www.d-tnt.co.uk/forum/default.asp?ReadMessage=YES&ID=10223

somsagt leder jeg efter fejlen i dette styk kode, hvorfor kan den ikke paste online, men kun offline?


wil/

sætter points lidt mere op:-)
Avatar billede elv Nybegynder
25. april 2002 - 23:25 #34
Det er sådan set ganske enkelt, det kommer ikke an på offline eller online, men hvilket program du bruger, og internet explorer (eller netscape eller whatever du bruger) napper din genvejstast ctrl+shift+f12. Det samme gør nogle andre programmer (word etc.), men notepad gør ikke, derfor virker det der. Hvis du ændrer din genvej til rent F12, virker det fint:
    RegisterHotkey(handle, IDHOT_SNAPWINDOW, 0,VK_F12);
så kan du jo rode lidt rundt med det til du finder en genvej der virker overalt :)
Avatar billede cool-wil Nybegynder
26. april 2002 - 01:24 #35
kan du ikke lige prøve at lave et projekt og teste det hos dig? og se om det virker?
jeg kan ikke få lortet til at spille:-(
Avatar billede elv Nybegynder
26. april 2002 - 16:28 #36
jeg kopierede sådan set bare det kode du skrev, smækkede en TMemo på formen... det virkede dog ikke helt, for du er nødt til lige at dobbeltklikke på formen for at få sat formcreate til at virke.... og så ændrede jeg genvejen til
RegisterHotkey(handle, IDHOT_SNAPWINDOW, 0,VK_F12);
Så virkede det... hvis du stadig ikke kan få det til at virke, kan du smide din mailadresse ind, så kan jeg sende projektet.
Avatar billede cool-wil Nybegynder
26. april 2002 - 17:08 #37
prøv lige at smid projektet +source over til mig ( wil@asio.dk )

ved ikke lige hvad problemet er, men min vil ikke som jeg vil...

tak

wil/
Avatar billede elv Nybegynder
26. april 2002 - 17:26 #38
Sendt!
Avatar billede cool-wil Nybegynder
26. april 2002 - 19:12 #39
det var jo helt lækkert, jeg har nu fået noget der virker:-)
points bliver delt ud nu:-)

Mange tak for hjælpen

wil/
Avatar billede elv Nybegynder
26. april 2002 - 19:14 #40
no problem :)
Avatar billede cool-wil Nybegynder
26. april 2002 - 19:27 #41
rigtig lækkert det endelig virker:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester