Autor Beitrag
Limster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72


Delphi 5 & 7 Enterprise
BeitragVerfasst: Di 05.07.05 16:38 
Hi Leute!

Ich hab ein Problem mit der Funktion "MouseCapture" bzw. "SetCapture" ..

Wenn ich MouseCapture=true setze, dann hat das doch den effekt, dass ich mit der Maus am ganzen Screen
umherfahren kann und die darunterliegenden Fenster(zb. auch andere Threads) die Message nicht bekommen,
sondern nur meine Form , oder täusche ich mich ?

Ich verstehe das nicht ganz.. Ein LButtonDown setzt auch MouseCapture=true und es funktioniert..
wenn ich zb. in der OnFormShow oder sonst wo MouseCapture=true setze, dann ist das ganz sicher
gesetzt (und ich lasse es mir zusätzlich über MouseMove-Event in der Form-Caption anzeigen).

Ich krieg nun NonClient MouseMove Nachrichten (zb. wenn ich mit der Maus auf der
TitelLeiste rumfahre) ins normale MouseMove, aber ausserhalb von dem Fenster tut sich nichts..
und wenn ich ausserhalb der Form klicke verhält es sich auch ganz normal als wäre nichts..
fahre ich mit der Maus wieder auf meine Form, sehe ich, dass MouseCapture immer noch gesetzt ist..

Kann mir das jemand erklären, da in der Windows-hilfe doch steht, dass auch MausEvent über anderen threads
(sprich andere Programme) 'abgefangen' werden und an meine Form geleitet werden.. ??

Vielen Dank im voraus !

Mfg , Limbo
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Di 05.07.05 22:50 
Zitat:
Wenn ich MouseCapture=true setze, dann hat das doch den effekt, dass ich mit der Maus am ganzen Screen
umherfahren kann und die darunterliegenden Fenster(zb. auch andere Threads) die Message nicht bekommen,
sondern nur meine Form , oder täusche ich mich ?


Zitat:
Kann mir das jemand erklären, da in der Windows-hilfe doch steht, dass auch MausEvent über anderen threads
(sprich andere Programme) 'abgefangen' werden und an meine Form geleitet werden.. ??


Andere Thread vielleicht, aber nicht andere Prozesse. Für das gewünschte Verhalten, musst du SetWindowsHookEx benutzen.

_________________
Ciao, Sprint.
Limster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72


Delphi 5 & 7 Enterprise
BeitragVerfasst: Mi 06.07.05 08:55 
Titel: das akzeptier ich aber nicht ;)
Hi!

Ich bin aber anderer Meinung. Das muss ich nicht über Hooks lösen.
Kuckst du dir hier die Tutorial-Seite an:

www.dsdt.info/tutorials/hooks/?page=2

Das steht gleich im ersten kurzen Absatz:

"Zum Beispiel ist es kein Problem, mit Mouse-Capturing auch Mouseereignisse über fremden Fenstern abzufangen. Nur bekommen eben diese Fenster dann keine Messages!"

Das ist genau das, was ich brauche... FREMDE Fenster ! Und fremde Fenster gehören meiner Meinung
nach zu fremden Prozessen.

Wenn ich dazu unbedingt Hooks brauchen würde, dann wär es ja auch so, dass Delphi auch nen normalen Maus-Hook verwenden
würde, wenn ich die Maustaste gedrückt halte und aus dem Fenster fahre.. weil dabei wird auch alles
nur an mein Fenster gesendet. Ganz LOW-Level gesehen wirds schon etwa so funktionieren, aber für besseres
Handling stellt Delphi bestimmt was anderes zur Verfügung, was meiner Meinung nach 'MouseCapture' wäre..

Danke für deine Antwort, aber die macht mich leider nicht glücklich.. :wink:

Bitte um weitere Infos..

vielleicht liege ich auch falsch und ihr könnt mich überzeugen..

Nur ist das aus meiner Sicht umständlich.. DLL schreiben für globalen Hook, Windows-Messages registrieren und das
umherschicken und MausEvents unterdrücken.. das MUSS schöner gehen ;)

Grüsse, Limbo
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mi 06.07.05 09:39 
Titel: Re: das akzeptier ich aber nicht ;)
user profile iconLimster hat folgendes geschrieben:
Nur ist das aus meiner Sicht umständlich.. DLL schreiben für globalen Hook, Windows-Messages registrieren und das umherschicken und MausEvents unterdrücken.. das MUSS schöner gehen

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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  idHook: HHOOK;

{--------------------------------------------------------------------------------------------------}

function JournalRecordProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin

  if nCode = HC_ACTION then
    if lParam <> 0 then
      with PEventMsg(lParam)^ do
        if message = WM_MOUSEMOVE then
          Form1.Caption := IntToStr(paramL) + ' x ' + IntToStr(paramH);
  Result := CallNextHookEx(idHook, nCode, wParam, lParam);
  
end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.FormCreate(Sender: TObject);
begin

  idHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalRecordProc, HInstance, 0);
  
end;

{--------------------------------------------------------------------------------------------------}

procedure TForm1.FormDestroy(Sender: TObject);
begin

  if idHook <> 0 then
  begin
    UnhookWindowsHookEx(idHook);
    idHook := 0;
  end;

end;

{--------------------------------------------------------------------------------------------------}

end.


So kann man die Mouse Nachrichten zwar empfangen, aber wohl nicht unterdrücken.

_________________
Ciao, Sprint.
Limster Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72


Delphi 5 & 7 Enterprise
BeitragVerfasst: Mi 06.07.05 10:13 
Titel: hm..
Hi!

Danke für deine Mühe, aber ohne Maus unterdrücken werd ichs
wohl nicht brauchen können ...

Ich brauche eine User-Bereichsauswahl vom ganzen Screen und
somit muss ich ein MouseDown und ein MouseUp abfangen..
Ist ein Tool für MultiMonitor-Betrieb (theoretisch unabhängig von der
Grafikkarte sind sogar FullScreen-Videos flüssig), wobei ich eben
die Bereichsauswahl für den Benutzer erleichtern möchte..

Ich hoffe auf weitere Tips !

Mfg, Limbo