ShortCutKey

Tags:    delphi

<< < 12 > >>
User
Bruger #75 @ 10.08.01 21:54
Hejsa

Er der nogle kloge folk her, som kan sige mig hvordan at man får en ShortCut fra f.eks. TMenuItem til at virke, selvom mit program ikke er aktivt?? Komponenter kan bruges, bare det er til D6Personal.

Med venlig hilsen

Mikkel Bøg Clemmensen
mt.clemmensen@vip.cybercity.dk
http://www.tfweb.f2s.com



15 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 5 karma
Sorter efter stemmer Sorter efter dato
User
Bruger #58 @ 11.08.01 00:27
Er der nogle kloge folk her, som kan sige mig hvordan at man
>får en ShortCut fra f.eks. TMenuItem til at virke, selvom mit
>program ikke er aktivt?? Komponenter kan bruges, bare det
>er til D6Personal.

Her er nogen klip fra et program jeg har skrevet i FreePascal, men jeg har rettet dem til så de fungerer i Delphi. Det jeg gør er at registrere nogen globale hotkeys og fange Windows' WM_HOTKEY message når de hotkeys bliver trykket på. Læs også data's artikel 'eventhandlers'.
Det gør at man kan bruge tasterne Win+Z,X,C,V,B,J til at styre WinAMP med. Men det kræver også en ekstra fil (easyamp.pas) som ikke lige er med.
Der ligger en kompileret udgave på min lokale webserver!

Niels
http://www.niller.f2s.com/ - always there...
http://g4s.dnsq.org/ - when I'm online!

<hr> - - -

const
HotkeyPrev = $00;
HotkeyPlay = $01;
HotkeyPause = $02;
HotkeyStop = $03;
HotkeyNext = $04;
HotkeyPlaylist = $10;

procedure TForm1.WMHotkey(var Msg: TMessage);
begin
if GetAmpMainHandle <> 0 then
case wParam of
HotkeyPrev:
AmpCommand(Amp_Command_BUTTON1);
HotkeyPlay:
AmpCommand(Amp_Command_BUTTON2);
HotkeyPause:
AmpCommand(Amp_Command_BUTTON3);
HotkeyStop:
AmpCommand(Amp_Command_BUTTON4);
HotkeyNext:
AmpCommand(Amp_Command_BUTTON5);
HotkeyPlaylist:
AmpCommand(Amp_Command_Jump_To_File_Dialog);
end
else
AmpCommandLine('');
Result := 1;
end;

procedure RegHotkey(Ident: Longint; Key: Char);
begin
if not RegisterHotkey(Form1.Handle, Ident, MOD_WIN, Ord(Key)) then
ShowMessage('Could not register hotkey.');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
RegHotkey(HotkeyPrev, 'Z');
RegHotkey(HotkeyPlay, 'X');
RegHotkey(HotkeyPause, 'C');
RegHotkey(HotkeyStop, 'V');
RegHotkey(HotkeyNext, 'B');
RegHotkey(HotkeyPlaylist, 'J');
end;

procedure TForm1.Destroy(Sender: TObject);
begin
UnregisterHotkey(wnd, HotkeyPrev);
UnregisterHotkey(wnd, HotkeyPlay);
UnregisterHotkey(wnd, HotkeyPause);
UnregisterHotkey(wnd, HotkeyStop);
UnregisterHotkey(wnd, HotkeyNext);
UnregisterHotkey(wnd, HotkeyPlaylist);
end.;




User
Bruger #75 @ 11.08.01 11:55
<quote>Er der nogle kloge folk her, som kan sige mig hvordan at man
>får en ShortCut fra f.eks. TMenuItem til at virke, selvom mit
>program ikke er aktivt?? Komponenter kan bruges, bare det
>er til D6Personal.

Her er nogen klip fra et program jeg har skrevet i FreePascal, men jeg har rettet dem til så de fungerer i Delphi. Det jeg gør er at registrere nogen globale hotkeys og fange Windows' WM_HOTKEY message når de hotkeys bliver trykket på. Læs også data's artikel 'eventhandlers'.
Det gør at man kan bruge tasterne Win+Z,X,C,V,B,J til at styre WinAMP med. Men det kræver også en ekstra fil (easyamp.pas) som ikke lige er med.
Der ligger en kompileret udgave på min lokale webserver!

Niels
http://www.niller.f2s.com/ - always there...
http://g4s.dnsq.org/ - when I'm online!

<hr> - - -

const
HotkeyPrev = $00;
HotkeyPlay = $01;
HotkeyPause = $02;
HotkeyStop = $03;
HotkeyNext = $04;
HotkeyPlaylist = $10;

procedure TForm1.WMHotkey(var Msg: TMessage);
begin
if GetAmpMainHandle <> 0 then
case wParam of
HotkeyPrev:
AmpCommand(Amp_Command_BUTTON1);
HotkeyPlay:
AmpCommand(Amp_Command_BUTTON2);
HotkeyPause:
AmpCommand(Amp_Command_BUTTON3);
HotkeyStop:
AmpCommand(Amp_Command_BUTTON4);
HotkeyNext:
AmpCommand(Amp_Command_BUTTON5);
HotkeyPlaylist:
AmpCommand(Amp_Command_Jump_To_File_Dialog);
end
else
AmpCommandLine('');
Result := 1;
end;

procedure RegHotkey(Ident: Longint; Key: Char);
begin
if not RegisterHotkey(Form1.Handle, Ident, MOD_WIN, Ord(Key)) then
ShowMessage('Could not register hotkey.');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
RegHotkey(HotkeyPrev, 'Z');
RegHotkey(HotkeyPlay, 'X');
RegHotkey(HotkeyPause, 'C');
RegHotkey(HotkeyStop, 'V');
RegHotkey(HotkeyNext, 'B');
RegHotkey(HotkeyPlaylist, 'J');
end;

procedure TForm1.Destroy(Sender: TObject);
begin
UnregisterHotkey(wnd, HotkeyPrev);
UnregisterHotkey(wnd, HotkeyPlay);
UnregisterHotkey(wnd, HotkeyPause);
UnregisterHotkey(wnd, HotkeyStop);
UnregisterHotkey(wnd, HotkeyNext);
UnregisterHotkey(wnd, HotkeyPlaylist);
end.;
</quote>
Det er jeg ikke sikker på at jeg forstod... Jeg skal bruge det sådan at mens mit program ikke er aktivt, skal man kunne trykke på Ctrl+etellerandetbogstav, som er TMenuItems shortcut, og procedure TMenuItem.Click vil blive udført. Det er jo ikke noget problem, mens programmet er aktivt, men når det er kører i bagrunden virker det jo ikke...



Med venlig hilsen

Mikkel Bøg Clemmensen
mt.clemmensen@vip.cybercity.dk
http://www.tfweb.f2s.com



User
Bruger #58 @ 11.08.01 13:06
<quote>Det er jeg ikke sikker på at jeg forstod... Jeg skal bruge det sådan at mens mit program ikke er aktivt, skal man kunne trykke på Ctrl+etellerandetbogstav, som er TMenuItems shortcut, og procedure TMenuItem.Click vil blive udført. Det er jo ikke noget problem, mens programmet er aktivt, men når det er kører i bagrunden virker det jo ikke...</quote>

Jeg kan lige tage den igen (konceptet i det):
Du registrer de hotkeys som globale, så virker de i alle programmer. Så laver du en message-handler der fanger når de taster bliver trykket - den fanger dem ligegyldigt hvilket program der er aktivt. Den fungerer selvfølgelig også når dit eget program er aktivt.

Niels
http://www.niller.f2s.com/ - always there...
http://g4s.dnsq.org/ - when I'm online!



User
Bruger #75 @ 12.08.01 13:04
<quote>
Der ligger en kompileret udgave på min lokale webserver!
</quote>

Nå...Den kan jeg ikke finde, hvor helt præcist...


Med venlig hilsen

Mikkel Bøg Clemmensen
mt.clemmensen@vip.cybercity.dk
http://www.tfweb.f2s.com



User
Bruger #75 @ 12.08.01 17:11
<quote>
Der ligger en kompileret udgave på min lokale webserver!


Nå...Den kan jeg ikke finde, hvor helt præcist...


Med venlig hilsen

Mikkel Bøg Clemmensen
mt.clemmensen@vip.cybercity.dk
http://www.tfweb.f2s.com</quote>

Woohps, nu fandt jeg den...


Med venlig hilsen

Mikkel Bøg Clemmensen
mt.clemmensen@vip.cybercity.dk
http://www.tfweb.f2s.com



User
Bruger #75 @ 12.08.01 17:28
<quote>Det er jeg ikke sikker på at jeg forstod... Jeg skal bruge det sådan at mens mit program ikke er aktivt, skal man kunne trykke på Ctrl+etellerandetbogstav, som er TMenuItems shortcut, og procedure TMenuItem.Click vil blive udført. Det er jo ikke noget problem, mens programmet er aktivt, men når det er kører i bagrunden virker det jo ikke...

Jeg kan lige tage den igen (konceptet i det):
Du registrer de hotkeys som globale, så virker de i alle programmer. Så laver du en message-handler der fanger når de taster bliver trykket - den fanger dem ligegyldigt hvilket program der er aktivt. Den fungerer selvfølgelig også når dit eget program er aktivt.

Niels
http://www.niller.f2s.com/ - always there...
http://g4s.dnsq.org/ - when I'm online!</quote>

Jeg kan ikke finde ud af at bruge dit eksempel. Kan du ikke lave det om så det passer til min form og ikke til WinAmp... Du kan godt få flere point hvis det er det, som skal til.

Med venlig hilsen

Mikkel Bøg Clemmensen
mt.clemmensen@vip.cybercity.dk
http://www.tfweb.f2s.com



User
Bruger #58 @ 16.08.01 22:38
Ok, her kommer så et forsøg på noget kode du måske kan bruge:

- - -

interface

type
TForm1 = class(TForm)
mnuNummer1: TMenuItem;
mnuNummer2: TMenuItem;
// flere ting...
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
public
procedure WMHotkey(var Msg: TMessage); message WM_HOTKEY;
end;

implementation

const
MenuPunkt1 = 1;
MenuPunkt2 = 2;

procedure TForm1.WMHotkey(var Msg: TMessage);
begin
case wParam of
MenuPunkt1:
mnuNummer1.OnClick(nil);
MenuPunk2:
mnuNummer2.OnClick(nil);
end;
Result := 1;
end;

procedure RegHotkey(Ident: Longint; Key: Char);
begin
if not RegisterHotkey(Form1.Handle, Ident, MOD_WIN, Ord(Key)) then
ShowMessage('Could not register hotkey.');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// du må selv finde på nogen bedre taster... husk også
// at rette i RegHotkey() procedure oven over
RegHotkey(MenuPunkt1, 'A');
RegHotkey(MenuPunkt2, 'B');
end;

procedure TForm1.Destroy(Sender: TObject);
begin
UnregisterHotkey(Handle, MenuPunkt1);
UnregisterHotkey(Handle, MenuPunkt2);
end;

- - -

Så håber jeg du kan bruge det her!! Det er godtnok nærmest magen til det eksempel jeg gav før, meen... siden du ikke kan finde ud af at ændre lidt i koden!!! (Ærlig talt, hvis du lige læser det igennem to gange tror jeg du forstår det meste.)

Niels
http://www.niller.f2s.com/ - always there...
http://g4s.dnsq.org/ - when I'm online!



User
Bruger #58 @ 16.08.01 22:41
Ok, her kommer så et forsøg på noget kode du måske kan bruge:

- - -

interface

type
TForm1 = class(TForm)
mnuNummer1: TMenuItem;
mnuNummer2: TMenuItem;
// flere ting...
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
public
procedure WMHotkey(var Msg: TMessage); message WM_HOTKEY;
end;

implementation

const
MenuPunkt1 = 1;
MenuPunkt2 = 2;

procedure TForm1.WMHotkey(var Msg: TMessage);
begin
case wParam of
MenuPunkt1:
mnuNummer1.OnClick(nil);
MenuPunk2:
mnuNummer2.OnClick(nil);
end;
Result := 1;
end;

procedure RegHotkey(Ident: Longint; Key: Char);
begin
if not RegisterHotkey(Form1.Handle, Ident, MOD_WIN, Ord(Key)) then
ShowMessage('Could not register hotkey.');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// du må selv finde på nogen bedre taster... husk også
// at rette i RegHotkey() procedure oven over
RegHotkey(MenuPunkt1, 'A');
RegHotkey(MenuPunkt2, 'B');
end;

procedure TForm1.Destroy(Sender: TObject);
begin
UnregisterHotkey(Handle, MenuPunkt1);
UnregisterHotkey(Handle, MenuPunkt2);
end;

- - -

Så håber jeg du kan bruge det her!! Det er godtnok nærmest magen til det eksempel jeg gav før, meen... siden du ikke kan finde ud af at ændre lidt i koden!!! (Ærlig talt, hvis du lige læser det igennem to gange tror jeg du forstår det meste.)

Niels
http://www.niller.f2s.com/ - always there...
http://g4s.dnsq.org/ - when I'm online!



User
Bruger #58 @ 16.08.01 22:41
Ok, her kommer så et forsøg på noget kode du måske kan bruge:

- - -

interface

type
TForm1 = class(TForm)
mnuNummer1: TMenuItem;
mnuNummer2: TMenuItem;
// flere ting...
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
public
procedure WMHotkey(var Msg: TMessage); message WM_HOTKEY;
end;

implementation

const
MenuPunkt1 = 1;
MenuPunkt2 = 2;

procedure TForm1.WMHotkey(var Msg: TMessage);
begin
case wParam of
MenuPunkt1:
mnuNummer1.OnClick(nil);
MenuPunk2:
mnuNummer2.OnClick(nil);
end;
Result := 1;
end;

procedure RegHotkey(Ident: Longint; Key: Char);
begin
if not RegisterHotkey(Form1.Handle, Ident, MOD_WIN, Ord(Key)) then
ShowMessage('Could not register hotkey.');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
// du må selv finde på nogen bedre taster... husk også
// at rette i RegHotkey() procedure oven over
RegHotkey(MenuPunkt1, 'A');
RegHotkey(MenuPunkt2, 'B');
end;

procedure TForm1.Destroy(Sender: TObject);
begin
UnregisterHotkey(Handle, MenuPunkt1);
UnregisterHotkey(Handle, MenuPunkt2);
end;

- - -

Så håber jeg du kan bruge det her!! Det er godtnok nærmest magen til det eksempel jeg gav før, meen... siden du ikke kan finde ud af at ændre lidt i koden!!! (Ærlig talt, hvis du lige læser det igennem to gange tror jeg du forstår det meste.)

Niels
http://www.niller.f2s.com/ - always there...
http://g4s.dnsq.org/ - when I'm online!



User
Bruger #75 @ 17.08.01 20:24
Jeg er glad for din hjælp, og jeg er ked af det, men det virker stadig ikke. Du skal nok få lidt flere UP's. Jeg er temmelig meget begynder, når det kommer til det med Messages.
Jeg får følgende fejlmeddelelse ved linien med "case wParam of" og nedaf:

'(' expected but 'OF' found
'OF' expected but identifer 'MenuPunkt1' found
Undeclared identifer 'Result'

Jeg bruger Win2000 og Delphi 6 Personal.


Med venlig hilsen

Mikkel Bøg Clemmensen
mt.clemmensen@vip.cybercity.dk
http://www.tfweb.f2s.com



<< < 12 > >>
t