Avatar billede snorga Nybegynder
14. december 1999 - 17:19 Der er 14 kommentarer og
1 løsning

Hotkeys

Hvordan kan jeg lave et program der har et par hotkeys til forskellige ting.

F.eks  WIN(dowstasten)+T.

Programmet skal reager på hotkeys'ne selv om programmet ikke er aktivt.

Nogle forslag eller "guidelines"?
Avatar billede hlj Nybegynder
15. december 1999 - 07:51 #1
Ikke aktiv, skal der hermed menes at det ligger og kører i baggrunden eller at det ikke er startet?
Avatar billede snorga Nybegynder
15. december 1999 - 10:10 #2
I baggrunden.
Avatar billede sjensen Nybegynder
16. december 1999 - 13:29 #3
Jeg mener at Windows sender alle messages til alle programmer selvom de ikke nødvendigvis er i friont. Dermed kan du "grabbe" windows Message vedr. keypressed / keydown og så kigge på om det er noget du kan bruge. Hvis det er reagerer du på det og husker at sende message videre (enten uændret eller med en ny værdi) ellers sender du det bare videre.

Det burde virke.

Jeg mener at der i D4 er et eksempel på hvordan man "hooker" en Windows message.

sjensen
Avatar billede snorga Nybegynder
16. december 1999 - 17:38 #4
Hmm lyder som en god idé..

Kikker lige på det det før jeg accepter det.
Avatar billede snorga Nybegynder
17. december 1999 - 01:12 #5
Ved du hvad man skal "hooke" sig ind på.. hviken type message og er det muligt at blokker dem så de ikke kommer videre?
Avatar billede lrj Nybegynder
29. december 1999 - 12:51 #6
Keyboard messages...
Avatar billede snorga Nybegynder
03. januar 2000 - 13:59 #7
Jeg synes ikke at kunne få message om windows tasterne :(
Men det kan godt være at det bare er mig?
Avatar billede michaelras Nybegynder
03. januar 2000 - 16:30 #8
Lav følgende under private i (ex) TForm1:
MinHot : THandle;
procedure WMHOTKEY(var message : TWMHOTKEY); message WM_HOTKEY;

i Formens OnCreate:
  MinHot := GlobalAddAtom('MinHotkeyKombAfWinOgQ');
  RegisterHotkey(Handle, MinHot, MOD_WIN, ord('Q'));

i Formens OnDestroy:
  UnregisterHotkey(Handle, MinHot);
  GlobalDeleteAtom(MinHot);

i WMHOTKEY procedure har du så det stående der sker ved (her) WIN-Q tast kombinationen
Hvis der er flere hotkeys kan du smmenligne wParam værdien med MinHot eller hvad du nu vælger at kalde dem. Der skal være en seperat atom (MinHot) til hver hotkey...

Det i Create/Destroy kan selvfølgelig også flyttes andre steder hen men det er vigtigt at unregisterhotkey bliver kaldt da det ellers kan føre til GPF'er

for mere information se under WM_HOTKEY og RegisterHotkey i WIN32.hlp

Michael
Avatar billede michaelras Nybegynder
03. januar 2000 - 17:34 #9
Ok ovenstående kan godt virke lidt forvirende så derfor er her et eksempel med 4 hotkeys:
===================================
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    WIN_Q, WIN_T, WIN_Y, WIN_HOME : THandle;
    procedure WMHOTKEY(var message: TMessage); message WM_HOTKEY;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
    Win_Q := GlobalAddAtom('Min_Win-Q_HotKey');
    Win_T := GlobalAddAtom('Min_Win-T_HotKey');
    Win_Y := GlobalAddAtom('Min_Win-Y_HotKey');
    Win_HOME := GlobalAddAtom('Min_Win-HOME_HotKey');
    Registerhotkey(Handle, WIN_Q, MOD_WIN, Ord('Q'));
    Registerhotkey(Handle, WIN_T, MOD_WIN, Ord('T'));
    Registerhotkey(Handle, WIN_Y, MOD_WIN, Ord('Y'));
    Registerhotkey(Handle, WIN_HOME, MOD_WIN, VK_HOME);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    UnRegisterHotkey(Handle, WIN_Q);
    UnRegisterHotkey(Handle, WIN_Y);
    UnRegisterHotkey(Handle, WIN_T);
    UnRegisterHotkey(Handle, WIN_HOME);
    GlobalDeleteAtom(WIN_Q);
    GlobalDeleteAtom(WIN_Y);
    GlobalDeleteAtom(WIN_T);
    GlobalDeleteAtom(WIN_HOME);
end;

procedure TForm1.WMHOTKEY(var message: TMessage);
begin
    if message.wParam = WIN_Q then ShowMessage('Win-Q')
    else if message.wParam = WIN_Y then ShowMessage('Win-Y')
    else if message.wParam = WIN_T then ShowMessage('Win-T')
    else if message.wParam = WIN_HOME then ShowMessage('Win-HOME');
end;
end.
================================

Som du måske har opdaget har jeg ændret TWMHotKey til TMessage af den grund at TMessage indeholder wParam direkte (svarer sikkert til TWMHotKey.hotkey, men er ikke sikker) hvilket man kan læse sig til direkte i win32.hlp hvad betyder

Michael
Avatar billede michaelras Nybegynder
03. januar 2000 - 17:40 #10
Som du kan se kan du også bruge "specielle" taster som HOME ved at skrive VK_HOME, for at se en komplet liste af VK_* se under Browseren under unit'et windows og under konstanter (eller kig i Windows.pas filen, hvis du har installeret kilde kode filerne). Det er også muligt at bruge MOD_ALT eller MOD_CONTROL hvis man vil lave sådanne Hotkeys.

Det skal lige siges at hvis hotkey-kombinationen findes i forvejen vil den ikke blive oprettet, fx. hvis man prøver at lave en WIN-R hotkey vil den ikke blive lavet i ens program da Explorer allerede har taget den (Kør boxen) og WIN-R kombinationen vil så blive sendt til explorer i stedet for ens eget program. Så vidt jeg husker returnerer RegisterHotkey Treu eller False alt efter om det lykkedes at oprette hotkeyen eller ej.

Michael
Avatar billede snorga Nybegynder
04. januar 2000 - 00:56 #11
Jeg kan ikke lige overskue det.. Tjekker og vender tilbage med svar..
Avatar billede snorga Nybegynder
04. januar 2000 - 02:27 #12
Tak Michael.

Det var hvad jeg havde brug for.

Et spørgsmål: hvad er "GPF'er" (Blå skærm?)

Lidt nemmer end at skulle til at lave "Hook's"

Og du har ret med hensyn til at Registerhotkey er en funktion der returner false hvis hotkeyen ikke kunne oprettes.


Avatar billede michaelras Nybegynder
04. januar 2000 - 22:23 #13
GPF = "Programmet har udført en ulovlig handling" (General Protection Error)

Michael
Avatar billede michaelras Nybegynder
04. januar 2000 - 22:26 #14
General Protection Failure

F i Error, hmm....

Michael
Avatar billede snorga Nybegynder
04. januar 2000 - 22:50 #15
:-)
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