Autor Beitrag
SirDregan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

WIN 2000, WinXP
D5 Prof
BeitragVerfasst: Di 02.08.05 14:31 
Hallo!

Ich möchte die Tastenkombination STRG+F11 abfangen. Das Problem ist nur, das ganze soll über mehrere Forms hinweg, also Anwendungsweit funktionieren, jedoch nicht systemweit. Daher fällt RegisterHotKey schonmal weg. OnKeyDown etc. ebenso.
Hat jemand eine Idee wie das zu realisieren ist?

CyA, SirDregan
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: Di 02.08.05 14:43 
Moin,

ich würd da per KeyDown auf jedem Form reagieren und nen Event werfen, welches dann zentral mit was immer du tun willst behandelt wird. Ist fies, aber was geschickteres fällt mir dazu grad nicht ein.

Gruß

noidic

_________________
Bravery calls my name in the sound of the wind in the night...
SirDregan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

WIN 2000, WinXP
D5 Prof
BeitragVerfasst: Di 02.08.05 14:51 
das ist eben das Problem, ich hab ~100 Formulare und da kommen auch immer mal welche dazu, wär also ätzend das überall reinzuschreiben.
Und Systemweit ist immer so ne Holzhammerlösung ;)
Scheint wohl echt nichts anderes zu geben oder?
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Di 02.08.05 14:56 
Hmm, wie wärs mit dem Message-Loop? der wird glaub in Application.Run gestartet (-> dpr Datei). Da müssten glaub ich alle OnKeyDowns für die ganze Applikation durch und da solltest du das abfangen können...
Ansonsten wär noch ne Möglichkeit: Du leitest dir ne eigene Klasse von TForm ab (nenn sie z.B. TMyForm). Dann gehst du in jedes Formular und leitest jedes Formular nicht mehr von TForm sondern von TMyForm ab. Das ist einfach ein Suchen & Ersetzen aufruf. und in TMyForm hänngst du dich dann ganz frech ans OnKeyDown ereignis, wodurch allerdins alle OnKeyDowns der Forms selber verloren gehen würden. Oder du nimmst in TMyForm wieder die Message-Routine (sprich: Die Procedure WndProc übetrschrieben)...



MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
SirDregan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

WIN 2000, WinXP
D5 Prof
BeitragVerfasst: Di 02.08.05 15:07 
uh langsam.
Ok das mit dem Klasse ableiten klingt nice, geht aber nicht da ich die OnKeyDown einzeln noch brauche.
Messageloop... hmmm *verwirrtbin* könntest du mir das grob erklären?
Delphi hilfe sagt mir nur das ich das abfange, aber ich müsste dann ja im Endeffekt für jede Form wieder die Form.wnd_proc überschreiben, right?
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Di 02.08.05 15:18 
user profile iconSirDregan hat folgendes geschrieben:
Messageloop... hmmm *verwirrtbin* könntest du mir das grob erklären?
Delphi hilfe sagt mir nur das ich das abfange, aber ich müsste dann ja im Endeffekt für jede Form wieder die Form.wnd_proc überschreiben, right?


Also es gibt den Message-Lioop, der wird in Application.Run gestartet. Lass dir einfach mal den Quellötext der Projekt-Dtaei anzeigen (Projekt -> Quelltext anzeigen). Da steht dann ein Application.Run. Wenn du dir da mal den Quelltext von anschaust, siehst du ne Schleife, die Abbricht, wenn "Terminated" true wird. Diese schelife läuft also ständig, solange bis dein Programm beendet wird. In dieser Schleife werden die ganzen Windows-Messages, die dein Profgramm so geshcickt bekommt (u.A. auch KeyDowns) veratrbeitet und an die entsprechend zuständigen Instanzen der Klassen wietergeleitet (also an deinen Button oder wohin auch immer). Das müsstest du jetzt praktrisch per hand nachbauen, und immer wenn ein OnKeyDown ereignis kommt (den Message-Code vom OnKeyDown kannst in der MSDN nachschauen) dann fängst du das hier ab und leitest es erst nach der Überprüfung ob ein Strg+F11 gedrückt wurde evtl. an die Instanzen der Klassen weiter. Und wenn Strg + F11 gedrückt wurde dann rufst das auf, was du so haben willst :)
Die zweite Möglichkeit die Messages abzufangen ist die WndProc. Die hängt nun in den einzelnen Klassen. Da würd ichs nun wieder gleich machen: eigene Klasse von TForm ableiten und in der abgeleiteten Klasse WndProc überschrieben und wenn dann ein Strg+F11 kommt das machen was du willst, ansonsten läßt du die Message weiter verteilen. Da musst du dann auch nicht in jeder Form die WndProc überschreiben, sondern eben nur in TMyForm. Nachteil davon ist allerdings, wenn der Focus auf einem Button auf der Form liegt, dann bekommt die Form-Klasse glaube ich keine Message, dass eine Taste gedrückt wurde, sonsern nur der Button. Dann würde dir das nichts bringen. Bin mir aber grad nicht 100%ig sicher....



MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
SirDregan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

WIN 2000, WinXP
D5 Prof
BeitragVerfasst: Di 02.08.05 15:21 
ah jetzt weis ich was du meinst.
Vielen Dank werd das gleich mal probieren!
SirDregan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

WIN 2000, WinXP
D5 Prof
BeitragVerfasst: Di 02.08.05 15:34 
sorry doch nicht :(
Komme nicht in "Run" rein. Quelltext anzeigen, sprich die DPR ist mir klar, aber wie komme ich zu von dir beschriebenen Schleife?
MrSaint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: Di 02.08.05 15:39 
Rechtsklick auf das "Run" und dann "Deklaration suchen". ALternativ kannst auch die Unit Forms öffnen und dann nach "TApplication.Run" suchen :)



MrSaint

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Di 02.08.05 15:41 
Hallo,

mit Application.OnMessage in der MainForm müsste es gehen,
ein einfaches Beispiel zum Ausbauen:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  public
    { Public-Deklarationen }
    procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
  end;
var
  Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := AppMessage;
end;

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_KEYDOWN then
    if chr(Msg.wParam) = 'A' then
    begin
    showmessage('Taste "'+chr(Msg.wParam)+'" gedrückt.');
    Handled := True;//Taste 'a' ist verarbeitet
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.show;
end;

end.

Die Unit2 enthält keine Proceduren, Form2 ist leer.
Nur bei der Taste 'a' wird eine Meldung ausgegeben, unabhängig davon welche Form aktiv ist.

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
SirDregan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17

WIN 2000, WinXP
D5 Prof
BeitragVerfasst: Di 02.08.05 16:36 
vielen Dank!
Hab das jetzt über die OnMessage gelöst, sehr einfach und funktioniert klasse.
Danke für eure schnellen Antworten! *verbeug*