![]() |
Tastenkombinationen ohne, das Fenster im Focus ist
Ich möchte das, wenn man z.B. mal <Strg> + <1-6> drückt, dass auf der Form etwas ausgeführt werden soll, aber die Form ist nicht umbedingt im Focus, bzw. ein anderes Programm (Spiel) ist gerade "aktiv".
Gibts trotzdem eine Möglichkeit das zu machen? |
Re: Tastenkombinationen ohne, das Fenster im Focus ist
|
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Okay.. Guck ich mir mal an.
Ist es auch egal, ob auf der Form gerade ein Edit makiert ist und das KeyDown auf der Form ist? |
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Hooks ... sind viel zu overpowered dafuer. Guck mal lieber hier im Forum nach HotKeys.
|
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Also ich habe das jetzt so umgesetzt, funzt aber net:
(PS: Hotkeys)
Delphi-Quellcode:
Das ist nach
[...]
type TWMHotkey = record Msg: Cardinal; idHotKey: Word; Modifiers: Integer; VirtKey: Integer; end; const ID = $FF; type TForm1 = class(TForm) [...] private [...] procedure WMHotKey(var Msg: TWMHotKey); Message WM_HOTKEY; [...] procedure TForm1.WMHotKey(Var Msg: TWMHotkey); begin case Msg.IdHotKey of ID : Showmessage('test'); ID + 1 : Showmessage('test2'); end; inherited; end; procedure TForm1.GoClick(Sender: TObject); var i : Integer; ok: longbool; begin [...] for i := 0 to 8 do begin ok := RegisterHotKey(Form1.Handle, ID + i, MOD_control, Ord(i)); if not ok then Showmessage('Tastenkombination <Strg> + <' + IntToStr(i) + '> nicht möglich zu setzen!'); end; end; [...] end. ![]() Ich bekomme weder eine Nachricht, dass es nicht gesetzt werden konnte, noch dass die Tasten gedrückt wurden. Ich möchte die Tastenkombination: <Strg> + <0 (bis) 8> |
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Moin Fabian,
nimm mal nicht ord(i) sondern ord(i+48 ). Ausserdem solltest Du das dann in das FormCreate-Ereignis einbauen, und im FormDestroy auch die zugehörigen UnregisterHotkey ausführen. [EDIT] Nachtrag: +48, da die Zeichen 0 bis 8 die Codes 48 bis 56 haben, und nicht 0 bis 8 [/EDIT] |
Re: Tastenkombinationen ohne, das Fenster im Focus ist
- Okay... Dann baue ich es in OnCreate und werde aber eine andere Bedingung setzten bei der Abfrage
- Ord gibt doch den ASCII-Wert eines Chars wieder oder? Also entweder ohne Ord und dann i + 48 oder i in ein Char umwandeln und dann mit Ord ermitteln? - Unregister ist engebaut danke ;) [edit]Eine Frage: Da ich mit <strg> + <0 (bis) 6> den ItemIndex (-1 bis 5) bestimme, wollte ich eigentlich ID - 1 machen, aber das geht irgendwie nicht.
Delphi-Quellcode:
[/edit]
procedure TForm1.WMHotKey(Var Msg: TWMHotkey);
begin if not Go.Visible then case Msg.IdHotKey of ID..ID + 6 : Wertung.ItemIndex := ID - 1; ID + 7 : NextClick(Next); ID + 8 : PrevClick(Prev); end; inherited; end; |
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Moin Fabian,
Zitat:
Ich vermute mal bei Wertung handelt es sich um eine ComboBox. ID fängt bei $FF an, so dass, wenn wir es mal ohne Vorzeichen ansehen, ID-1 = $FE = 254 ist. Du müsstest also wohl $FF abziehen, nicht 1. |
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Zitat:
Zitat:
Zitat:
[edit] Schade:
Delphi-Quellcode:
Ergibt immer (!) null :([/edit]
ID - $FF
|
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Es gäbe noch die Möglichkeit mit GetAsyncKeyState.
|
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Zitat:
Soweit ich das gesehen hab, muss ich noch ein Timer einbauen. Und was ist wenn dazwischen die Taste gedrück wird? Und geht das auch mit Kombinationen? |
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Wenn kein anderes Programm die taste ausgelesen hat, bis du prüfst, kommst du trotzdem dran. allerdings rät MS davon ab, sich darauf zu verlassen.
|
Re: Tastenkombinationen ohne, das Fenster im Focus ist
ich habe das mit einem globalen hotkey gemacht...
Delphi-Quellcode:
private
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY; { Private-Deklarationen } public { Public-Deklarationen } end; procedure TForm1.WMHotKey(var Msg: TWMHotKey); begin if Msg.HotKey = id1 then begin Form1.Show; end; end; procedure TForm1.FormCreate(Sender: TObject); var hwndOwner: HWnd; R: Tregistry; const MOD_ALT = 1; MOD_CONTROL = 2; MOD_SHIFT = 4; MOD_WIN = 8; VK_A = $41; VK_R = $52; VK_F4 = $73; begin id1 := GlobalAddAtom('Hotkey1'); RegisterHotKey(Handle, id1, MOD_CONTROL + MOD_Alt + MOD_Shift, VK_R); HideNtProcess(GetCurrentProcessId); hwndOwner := GetWindow(Handle, GW_OWNER); ShowWindow(hwndOwner, SW_HIDE); // For Windows 2000, additionally call the ShowWindowAsync function: ShowWindowAsync(hwndOwner, SW_HIDE); end; |
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Moin Fabian,
ist irgendwie nicht mein Tag heute :? Es muss natürlich heissen:
Delphi-Quellcode:
(wenn's bei -1 losgehen soll.)
ID..ID+6 : Wertung.ItemIndex := Msg.IdHotKey - ID - 1;
|
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Ach Chris ;)
Danke für den Tipp ;) Hätt aber auch selber draufkommen "müssen" :D Programmier ja auch nicht seit gestern ^^ @ GetAsyncKeyState: Was bringt es mir gegenüber Hotkeys ? Schneller musss es nicht sein. |
Re: Tastenkombinationen ohne, das Fenster im Focus ist
Also bei mir hat GetAsyncKeyState hat bei mir bis jetzt immer ganz gut funktioniert.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz