Avatar billede smith1 Nybegynder
16. april 2005 - 22:54 Der er 4 kommentarer og
3 løsninger

Spg ang.. Hotkeys

Virker perfekt, men jeg får nogle warnings?:
[Warning] Unit1.pas(31): Comparing signed and unsigned types - widened both operands

Spg. 2 hvordan kan jeg opfange hvilken tast der bliver trykket på ? har fundet ud at tast A har værdien 65 så jeg kan skrive Registerhotkey(Handle, ALT_A, MOD_ALT, 65); hvordan finder jeg værdien på de andre taster på mit keyboard? som f.eks de extra taster(play, pause, vloume osv.) som logitech keyboards har.

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMHOTKEY(var message: TMessage);
begin
    if message.wParam = ALT_A then ShowMessage('ALT + A')
    else if message.wParam = ALT_B then ShowMessage('ALT + B')
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ALT_A := GlobalAddAtom('test_ALT_A');
  ALT_B := GlobalAddAtom('test_ALT_B');
  Registerhotkey(Handle, ALT_A, MOD_ALT, Ord('A'));
  Registerhotkey(Handle, ALT_B, MOD_ALT, Ord('B'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotkey(Handle, ALT_A);
  UnRegisterHotkey(Handle, ALT_B);
  GlobalDeleteAtom(ALT_A);
  GlobalDeleteAtom(ALT_B);
end;

end.
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    ALT_A, ALT_B : THandle;
    procedure WMHOTKEY(var message: TMessage); message WM_HOTKEY;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMHOTKEY(var message: TMessage);
begin
    if message.wParam = ALT_A then ShowMessage('ALT + A')
    else if message.wParam = ALT_B then ShowMessage('ALT + B')
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ALT_A := GlobalAddAtom('test_ALT_A');
  ALT_B := GlobalAddAtom('test_ALT_B');
  Registerhotkey(Handle, ALT_A, MOD_ALT, Ord('A'));
  Registerhotkey(Handle, ALT_B, MOD_ALT, Ord('B'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotkey(Handle, ALT_A);
  UnRegisterHotkey(Handle, ALT_B);
  GlobalDeleteAtom(ALT_A);
  GlobalDeleteAtom(ALT_B);
end;

end.
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    ALT_A, ALT_B : THandle;
    procedure WMHOTKEY(var message: TMessage); message WM_HOTKEY;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMHOTKEY(var message: TMessage);
begin
    if message.wParam = ALT_A then ShowMessage('ALT + A')
    else if message.wParam = ALT_B then ShowMessage('ALT + B')
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ALT_A := GlobalAddAtom('test_ALT_A');
  ALT_B := GlobalAddAtom('test_ALT_B');
  Registerhotkey(Handle, ALT_A, MOD_ALT, Ord('A'));
  Registerhotkey(Handle, ALT_B, MOD_ALT, Ord('B'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotkey(Handle, ALT_A);
  UnRegisterHotkey(Handle, ALT_B);
  GlobalDeleteAtom(ALT_A);
  GlobalDeleteAtom(ALT_B);
end;

end.
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    ALT_A, ALT_B : THandle;
    procedure WMHOTKEY(var message: TMessage); message WM_HOTKEY;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMHOTKEY(var message: TMessage);
begin
    if message.wParam = ALT_A then ShowMessage('ALT + A')
    else if message.wParam = ALT_B then ShowMessage('ALT + B')
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ALT_A := GlobalAddAtom('test_ALT_A');
  ALT_B := GlobalAddAtom('test_ALT_B');
  Registerhotkey(Handle, ALT_A, MOD_ALT, Ord('A'));
  Registerhotkey(Handle, ALT_B, MOD_ALT, Ord('B'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotkey(Handle, ALT_A);
  UnRegisterHotkey(Handle, ALT_B);
  GlobalDeleteAtom(ALT_A);
  GlobalDeleteAtom(ALT_B);
end;

end.
Avatar billede smith1 Nybegynder
16. april 2005 - 22:55 #1
ups kom til at indsætte koden ind flere gange. her er den igen EN gang

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMHOTKEY(var message: TMessage);
begin
    if message.wParam = ALT_A then ShowMessage('ALT + A')
    else if message.wParam = ALT_B then ShowMessage('ALT + B')
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ALT_A := GlobalAddAtom('test_ALT_A');
  ALT_B := GlobalAddAtom('test_ALT_B');
  Registerhotkey(Handle, ALT_A, MOD_ALT, Ord('A'));
  Registerhotkey(Handle, ALT_B, MOD_ALT, Ord('B'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotkey(Handle, ALT_A);
  UnRegisterHotkey(Handle, ALT_B);
  GlobalDeleteAtom(ALT_A);
  GlobalDeleteAtom(ALT_B);
end;
Avatar billede vallemanden Nybegynder
16. april 2005 - 23:09 #2
http://www.lookuptables.com/

ved jeg har en der er bedre skal lige finde den, der er det også med funktions taster
Avatar billede smith1 Nybegynder
17. april 2005 - 13:41 #3
tak, så har jeg værdigerne for de normale tegn. Hvordan kan jeg finde værdien på volume knappen på mit tastertur?

OG hvordan slipper jeg af med denne : [Warning] Unit1.pas(31): Comparing signed and unsigned types - widened both operands
Avatar billede vallemanden Nybegynder
17. april 2005 - 18:11 #4
Avatar billede smith1 Nybegynder
17. april 2005 - 18:40 #5
tak, hvad med den warning?
Avatar billede vallemanden Nybegynder
17. april 2005 - 20:01 #6
Ved ikke lige hvad det erd er giver god den warning :-(
Avatar billede serge Nybegynder
18. april 2005 - 08:17 #7
Warning'en kommer pga. de to linier:

    if message.wParam = ALT_A then ShowMessage('ALT + A')
    else if message.wParam = ALT_B then ShowMessage('ALT + B')

... ALT_A konstanten er defineret som Cardinal (32bit heltal uden fortegn), message.wParam er defineret som Integer (32bit heltad MED fortegn).

Delphi advarer, fordi det ikke er muligt at sammenligne to typer med og uden fortegn - og samme præcision (antal bits) - præcist (f.eks. i tilfældet shortint og byte, -128 (shortint) (i hexadecimal = $81) og +129 (byte) (også skrevet i hexadecimal som $81) er nøjagtig det samme tal, set fra CPU'ens synspunkt. Derfor smider Delphi først tallene over i en mere præcis type (i dit tilfælde Int64).

Anyway, i dette tilfælde kommer problemet egentligt af, at wParam i Windows bruges til at sende flere forskellige typer værdier - alt efter hvilken Message der er tale om. Delphi's windows.pas library har blot defineret den som integer, fordi den jo ligesom skal være ét eller andet... I dit tilfælde er der ganske rigtigt tale om en Cardinal (faktisk kun et word, men ligemeget...) - så kort sagt er der ingen problemer.

Hvis du vil slippe for advarslen, må du blot fortælle compileren, at det virkelig er hvad du mener, ved at typecaste explicit:

    if cardinal(message.wParam) = ALT_A then ShowMessage('ALT + A')
    else if cardinal(message.wParam) = ALT_B then ShowMessage('ALT + B')
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