Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OnMouseOut-Event (https://www.delphipraxis.net/84575-onmouseout-event.html)

Hirnsausen 18. Jan 2007 17:26


OnMouseOut-Event
 
Leider gibt es kein OnMouseOut-Event bei der Form, welches ich mit dem OnMouseOver-Event verknüpfen kann.

Meine Zielsetzung ist es, ein Programmfenster zu haben, welches bemerkt, wann die Mouse außerhalb des Fensters ist, und wann sie wieder darüber (über einer der Komponenten) ist. Ich will ein Fenster haben, was bei MousOut fast ganz transparent ist, aber bei MouseOver wieder sichtbar wird.

Weiß jemand, wie ich diese Events erzeugen kann?

MrKnogge 18. Jan 2007 17:32

Re: OnMouseOut-Event
 
Das müsstest du über einen hook realisieren.

Gruß

Hirnsausen 18. Jan 2007 17:36

Re: OnMouseOut-Event
 
Hallo Knogge,

was ist ein Hook? Und wie erstelle und nutze ich so einen Hook?

MrKnogge 18. Jan 2007 17:47

Re: OnMouseOut-Event
 
Dieser Hook wird ausgelöst, wenn die Maus bewegt wird:

Delphi-Quellcode:
var
  Form1: TForm1;
  aHook : Cardinal;
  FHookStarted : Boolean;

[...]

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  Handled := False;
  if (Msg.message = WM_CANCELJOURNAL) and FHookStarted then
    aHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, 0, 0);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if FHookStarted then
    UnhookWindowsHookEx(aHook);
end;

function JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg; Sender: TObject): Integer; stdcall;
var
  aPoint : TPoint;
begin
 Result := CallNextHookEx(aHook, Code, wParam, Longint(@EventStrut));
 if Code < 0 then Exit;
 if Code = HC_SYSMODALON then Exit;
 if Code = HC_ACTION then
  begin
   if (EventStrut.message = WM_MOUSEMOVE) then
   begin
     GetCursorPos(aPoint);
     Form1.Label1.Caption := IntToStr(aPoint.x) + ' ' + IntToStr(aPoint.y)
   end;
  end;
end;
so wird der hook gestartet:
Delphi-Quellcode:
hook starten

if (FHookStarted = false) then begin
  aHook := SetWindowsHookEx(WH_JOURNALRECORD, @JournalProc, hInstance, 0);
  FHookStarted := True;
end;
Du musst jetzt nur noch prüfen, ob sich sich in dem bereich deiner Form befindet oder nicht.

Gruß

[Edit]Sorry, hab ein Stückchen Code vergessen[/Edit]

bitsetter 18. Jan 2007 17:50

Re: OnMouseOut-Event
 
Hier ist ein Link mit Tutor und Source in Deutsch.assarbad Ein Hook (Haken) wird normalerweise in einer Dll ausgelagert.

xaromz 18. Jan 2007 18:03

Re: OnMouseOut-Event
 
Hallo,

Du kannst Dich auch mit MSDN-Library durchsuchenTrackMouseEvent von Windows benachrichtigen lassen.

Gruß
xaromz

Sunlight7 18. Jan 2007 18:17

Re: OnMouseOut-Event
 
'n Abend!

Zitat:

Zitat von bitsetter
Ein Hook (Haken) wird normalerweise in einer Dll ausgelagert.

Nur globale Haken, lokale Hooks können auch in der Exe sein :wink:


@MrKnogge: Hier wäre ein Mouse-Hook (Flag WH_MOUSE) angebracht, erspart auch das GetCursorPos :wink:

Grüßle!

Edit: Mal auf diesen Thread aufmerksam mache: Klick

Hirnsausen 20. Jan 2007 12:20

Re: OnMouseOut-Event
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo, danke für Eure Hilfen.

Ich habe den Code von MrKnogge verwendet. Hier mein gegenwärtiges Problem:

Delphi-Quellcode:
procedure TAlpha.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
 Handled:=False;
 if (Msg.message=WM_CANCELJOURNAL) and FHookStarted then aHook:=SetWindowsHookEx(WH_JOURNALRECORD,@JournalProc,0,0);
end;
Beim Kompilieren gibt es die folgenden Fehler: VARIABLE REQUIRED.

Dieser Fehler taucht in der mit IF beginnenden Zeile auf.

Wenn es okay mit Euch ist, kann ich den gesamten Code mal in eine ZIP order RAR packen und Euch zur Verfügung stellen.

Meine Absicht ist, den TimerDown auszulösen, sobald die Mouse außerhalb des Fensters ist, und den Timer Up auszulösen, sobald die Mouse über dem Fenser ist.

MrKnogge 20. Jan 2007 12:47

Re: OnMouseOut-Event
 
Nimm für die ApplicationEvents mal die gleichnamige Komponente unter "Zusätzliches".

Gruß

[Add]
Aber um auf den eigentlichen Fehler zu kommen, da bin ich noch auf der Suche. Ich habe bei deinem Projekt das gleiche Problem, aber sehe keinen Unterschied zu meinem Code.

bitsetter 20. Jan 2007 13:00

Re: OnMouseOut-Event
 
Versuche es mal hiermit:
Delphi-Quellcode:
function JournalProc(Code, wParam: Integer; var EventStrut: TEventMsg; Sender: TObject): Integer; stdcall;
var
 aPoint: TPoint;
begin
 Result:=CallNextHookEx(aHook, Code, wParam, Longint(@EventStrut));
 if Code<0 then Exit;
 if Code=HC_SYSMODALON then Exit;
 if Code=HC_ACTION then
 begin
  if (EventStrut.message=WM_MOUSEMOVE) then
  begin
   GetCursorPos(aPoint);
   Alpha.Label1.Caption:=IntToStr(aPoint.x)+' '+IntToStr(aPoint.y)
  end;
 end;
end;

procedure TAlpha.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
 Handled:=False;
 if (Msg.message=WM_CANCELJOURNAL) and FHookStarted then aHook:=SetWindowsHookEx(WH_JOURNALRECORD,@JournalProc,0,0);
end;
Die Function JournalProc muss wohl global sein, sie war bei dir unter der Klasse TAlpha eingetragen.


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

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