Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Nicht aktive Form auf Tastendruck reagieren lassen (https://www.delphipraxis.net/150924-nicht-aktive-form-auf-tastendruck-reagieren-lassen.html)

Samufi 30. Apr 2010 15:03


Nicht aktive Form auf Tastendruck reagieren lassen
 
Hallo,
ich versuche gerade, ein Programm zu schreiben, das es möglich macht, die Maus mit der Tastatur zu bedienen - die Steuerung des Cursors mit den Pfeiltasten, den Klick mit Enter usw. Ich habe dazu die Eigenschaften OnKeyDown und On KeyPress meiner HauptUnit genutzt. Logischerweise funktioniert das aber nur solange die Form auch aktiviert ist. Da ich das Ganze nutzen will um den Computer zu steuern und nicht dieses Programm, stellt das der Funktionstüchtigkeit ein Bein. Meine Frage ist also: Wie schaffe ich, dass das Programm auf eine Taste Reagiert ohne die OnKeyDown-, bzw. OnKeyPresseigenschaften zu nutzen (und dass das auch passiert, wenn es nicht aktiviert ist) - oder aber: Wie schaffe ich, dass das Fenster dauerhaft aktiviert bleibt?
Treuergebenst,
Samufi

shmia 30. Apr 2010 15:16

Re: Nicht aktive Form auf Tastendruck reagieren lassen
 
Unter Windows XP gibt es das doch schon.
Systemsteuerung -> Eingabehilfen -> Tabsheet "Maus"
Tastaturmaus aktivieren

Es gibt auch genügend Freewaretools die ebenfalls über die Tastatur die Maus steuern...

DeddyH 30. Apr 2010 15:22

Re: Nicht aktive Form auf Tastendruck reagieren lassen
 
Ansonsten (und wenn es nur zum Üben ist) könntest Du einen HotKey registrieren, wobei sich da die Pfeiltasten ohne Zusatztaste wohl eher nicht so gut eignen.

Samufi 30. Apr 2010 15:24

Re: Nicht aktive Form auf Tastendruck reagieren lassen
 
Das war mir schon im Prinzip klar. Mir geht es nicht um das Produkt, sondern den Weg dorthin. Das Wissen kann man dann ja auch anderswo anwenden. Die Maussteuerung ist bloß ein Testobjekt, das mal (abgesehen davon, dass es sie schon gibt) nicht ganz sinnlos schien.
Vom Schreiben von HotKeys habe ich überhaupt keine Ahnung... Eine Zusatztaste wäre kein Problem. Wie mache ich denn sowas? (Is jetzt vielleicht ein bisschen im Urschleim, die Frage)

DeddyH 30. Apr 2010 15:26

Re: Nicht aktive Form auf Tastendruck reagieren lassen
 
Beispielunit mit einem Memo auf der Form (HotKey ist STRG-Pfeiltaste runter):
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const MY_HOTKEY = WM_APP + 100;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RegisterHotKey(Handle,MY_HOTKEY,MOD_CONTROL,VK_DOWN);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnregisterHotKey(Handle,MY_HOTKEY);
end;

procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = MY_HOTKEY then
    Memo1.Lines.Add('Hotkey empfangen');
  Msg.Result := 1;
end;

end.
[edit] Das funktioniert natürlich nur, wenn der Hotkey nicht bereits anderweitig registriert ist, siehe MSDN. [/edit]

Samufi 30. Apr 2010 15:36

Re: Nicht aktive Form auf Tastendruck reagieren lassen
 
Vielen Dank! Zum Verständnis: Was bedeutet "WM_APP + 100; "?

DeddyH 30. Apr 2010 15:41

Re: Nicht aktive Form auf Tastendruck reagieren lassen
 
Du kannst ja selbst Messages deklarieren. Diese sollten aber oberhalb von WM_USER oder WM_APP (beides vordefinierte Konstanten) liegen.
Das war Quatsch, die Konstante ist ja nicht für die Message, sondern die ID gedacht :oops:

Samufi 30. Apr 2010 15:52

Re: Nicht aktive Form auf Tastendruck reagieren lassen
 
Tut mir leid, ich verstehe leider nicht so ganz. Meine Kenntnisse liegen leider noch sehr weit an der Oberfläche...
Der HotKey wird also beschrieben durch eine Zahl? (hab ich das jetzt richtig verstanden?) Warum weise ich Msg.Result noch den Wert 1 zu?
Ich habe das jetzt so ziemlich eins zu eins übernommen, es passiert aber nichts... Woran kann das liegen?

DeddyH 30. Apr 2010 15:57

Re: Nicht aktive Form auf Tastendruck reagieren lassen
 
Hast Du die Ereignisse auch im OI zugewiesen? Ansonsten erweitere das FormCreate mal etwas:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  if not RegisterHotKey(Handle,MY_HOTKEY,MOD_CONTROL,VK_DOWN) then
    ShowMessage(Format('RegisterHotKey ist fehlgeschlagen.%sMeldung:%s', [sLineBreak,SysErrorMessage(GetLastError)]));
end;

Samufi 30. Apr 2010 16:06

Re: Nicht aktive Form auf Tastendruck reagieren lassen
 
OnCreate und OnDestroy habe ich zugewiesen. Bei der HotKey-Prozedur weiß ich nicht, wo ich sie eintragen sollte. Ich habe die Änderung übernommen, es kommt aber keine Fehlermeldung - das Registrieren des HotKeys muss also fehlerfrei funktionieren...


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz