![]() |
Maus auf ein Ereignis reagieren lassen
Hallo an alle,
ich habe folgendes Problem: Ich möchte ein kleines Programm schreiben, wo die Maus auf ein Ereignis reagiert. Um genau zu sein, die Maus soll einen Mausklick simulieren, wenn der Cursor auf einer bestimmten Farbe ist. Wie ich einen Mausklick simuliere weiß ich schon, aber leider nicht wie ich die Maus reagieren lassen kann, wenn man z.B. über die Farbe blau fährt. Könnte mir jemand weiterhelfen? :stupid: Ich hab etwas vergessen: Die Maus sollte aber nciht nur in meinem Programm reagieen sondern auch in anderen. Also eine systemweite funktion. |
Re: Maus auf ein Ereignis reagieren lassen
Hier ein alter Quellcode den ich auf Platte noch hatte. Funktioniert nicht nur in deinem eigenen Window sondern auf allen. Zeigt dir die Koordinaten an, die Farbe, Saettigung und Helligkeit von RGB!
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls; type TForm1 = class(TForm) Panel1: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } DesktopDC: hDC; hCross, hSavedCursor : hCURSOR; procedure GetPixelFarbe; procedure WM_TIMER(var Msg: TMessage); message WM_TIMER; procedure RGBtoHSV(const aR, aG, aB: Integer; var zH, zS, zV: Integer); function Min(A, B: Integer): Integer; function Max(A, B: Integer): Integer; function GetHValue(ACol: TColor): Integer; function GetSValue(ACol: TColor): Integer; function GetVValue(ACol: TColor): Integer; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin DesktopDC := GetDC(0); SetTimer(Self.Handle, 1, 10, nil); end; function TForm1.Min(A, B: Integer): Integer; begin if A < B then Result := A else Result := B; end; function TForm1.Max(A, B : Integer): Integer; begin if A > B then Result := A else Result := B; end; procedure TForm1.RGBToHSV(Const aR, aG, aB: Integer; var zH, zS, zV: Integer); var Delta, Mini: integer; begin Mini := Min(aR, Min(aG, aB)); zV := Max(aR, Max(aG,aB)); Delta := zV - Mini; // Saturation if zV = 0 then zS := 0 else zS := (Delta * 255) Div zV; if zS = 0 then zH := 0 else begin if aR = zV then zH := ((aG - aB) * 60) Div Delta else if aG = zV then zH := 120 + ((aB - aR) * 60) Div Delta else if aB = zV then zH := 240 + ((aR - aG) * 60) Div Delta; if zH <= 0 then zH := zH + 360; end; end; function TForm1.GetHValue(ACol: TColor): Integer; var H, S, V: Integer; begin RGBToHSV(GetRValue(ACol), GetGValue(ACol), GetBValue(ACol), H, S, V); Result := H; end; function TForm1.GetSValue(ACol: TColor): Integer; var H,S,V: Integer; begin RGBToHSV(GetRValue(ACol), GetGValue(ACol), GetBValue(ACol), H, S, V); Result := S; end; function TForm1.GetVValue(ACol: TColor): Integer; var H,S,V: Integer; begin RGBToHSV(GetRValue(ACol), GetGValue(ACol), GetBValue(ACol), H, S, V); Result := V; end; procedure TForm1.GetPixelFarbe; var Pos: TPoint; Col: TColor; begin GetCursorPos(Pos); if WindowFromPoint(Pos) = Self.Handle then begin //SetSystemCursor(LoadCursor(hInst, IDC_IBEAM), OCR_IBEAM); Exit; end else begin hCross := LoadCursor(0, IDC_CROSS); SetCursor(hCross); Col := GetPixel(DesktopDC, Pos.X, Pos.Y); Panel1.Color := Col; Panel1.Caption := 'Pixelkoordinate ' + IntToStr(Pos.X) + ':' + IntToStr(Pos.Y); Label1.Caption := 'R: ' + IntToStr(GetRValue(Col)); Label2.Caption := 'G: ' + IntToStr(GetGValue(Col)); Label3.Caption := 'B: ' + IntToStr(GetBValue(Col)); Label7.Caption := IntToStr(GetVValue(Col)); Label9.Caption := IntToStr(GetSValue(Col)); Label11.Caption := IntToStr(GetHValue(Col)); end; end; procedure TForm1.WM_TIMER(var Msg: TMessage); begin if Msg.WParam = 1 then //TimerID #1 GetPixelFarbe; end; procedure TForm1.FormDestroy(Sender: TObject); begin ReleaseDC(Self.Handle, DesktopDC); end; end. |
Re: Maus auf ein Ereignis reagieren lassen
Cool danke :thumb:
Da ich aber noch neu in der Programmierwelt bin, weiß ich nicht so recht was ich machen soll. Ich hätte ganz gerne einfach bloß die reine Funktion, mit der ich dann ein bischen rumspielen kann. Bei dem ganzen Code steig ich garnicht mehr durch. :wiejetzt: Also die Maus soll einen Mausklick simulieren wenn jemand mit dem Cursor über eine Farbe fährt die ich festgelegt habe. Aber an welcher Stelle füge ich den Mausklick denn jetzt ein? |
Re: Maus auf ein Ereignis reagieren lassen
Delphi-Quellcode:
Das würde glaube ich reichen...
function GetPixelFarbe: TColor;
var Pos: TPoint; begin GetCursorPos(Pos); Result := GetPixel(DesktopDC, Pos.X, Pos.Y); end; Und das jetzt ins OnTimer von einem Timer...
Delphi-Quellcode:
Das kommt mir allerding ein bisschen ... naja... schwammig vor...
if GetPixelFarbe = DieFarbe then
MachDenMausklick; Vielleicht gibts es noch eine bessere Lösung dein Ziel zu erreichen... :gruebel: Kannst ja mal sagen, was du vorhast! |
Re: Maus auf ein Ereignis reagieren lassen
Gibts da nicht so was wie ein onMouseMove, das ausgelöst wird, sobald sich die Mauskkordinaten ändern?
|
Re: Maus auf ein Ereignis reagieren lassen
Genau so hab ich mir das vorgestellt. Danke TonyR :thumb: :thumb: :thumb:
Gleich mal ein bischen rumprobieren. Danke Das mit dem mousemove hab ich mir alles angeguckt bei dsdt.info aber das war alles nciht das was ich suche. Aber jetzt hab ichs ja. :thumb: Edit: Da gibts noch ein Problem. Das funktioniert nicht
Delphi-Quellcode:
es hackt an DesktopDC. :gruebel:
Result := GetPixel(DesktopDC, Pos.X, Pos.Y);
|
Re: Maus auf ein Ereignis reagieren lassen
Das mit dem Timer ist aber recht unsauber. Wenn du die Frequenz zu niedrig einstellst, bekommst du kein sauberes Ergebniss und mit einer hohen Frequenz belastest du nur unnötig den Rechner.
|
Re: Maus auf ein Ereignis reagieren lassen
Zitat:
Mit OnMouseMove... geht das systemweit? Und: Wäre da die CPU-Belastung nicht eigentlich höher? |
Re: Maus auf ein Ereignis reagieren lassen
Wie mache ich das denn jetzt? Das funzt nicht. Hättet ihr noch einen anderen Weg? :(
|
Re: Maus auf ein Ereignis reagieren lassen
Zitat:
Aber trotzdem bitte ein bisschen denken vor dem Schreiben :wink: Es fehlt die Deklaration von dem Handle und die Zuweisung (wenn ich dir jetzt sage, dass du mal oben bei dem Quelltext guckst, müsstest dus eigentlcih hinbekommen...):
Delphi-Quellcode:
DesktopDC: hDC; //global deklarieren!
... DesktopDC := GetDC(0); //am bestens ins FormCreate! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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