Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Maus auf ein Ereignis reagieren lassen (https://www.delphipraxis.net/90311-maus-auf-ein-ereignis-reagieren-lassen.html)

RXR-Max 15. Apr 2007 06:15


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.

Mackhack 15. Apr 2007 06:51

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.

RXR-Max 15. Apr 2007 07:55

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?

TonyR 15. Apr 2007 09:02

Re: Maus auf ein Ereignis reagieren lassen
 
Delphi-Quellcode:
function GetPixelFarbe: TColor;
var
  Pos: TPoint;
begin
  GetCursorPos(Pos);
  Result := GetPixel(DesktopDC, Pos.X, Pos.Y);
end;
Das würde glaube ich reichen...

Und das jetzt ins OnTimer von einem Timer...
Delphi-Quellcode:
if GetPixelFarbe = DieFarbe then
  MachDenMausklick;
Das kommt mir allerding ein bisschen ... naja... schwammig vor...
Vielleicht gibts es noch eine bessere Lösung dein Ziel zu erreichen... :gruebel:
Kannst ja mal sagen, was du vorhast!

Nikolas 15. Apr 2007 09:23

Re: Maus auf ein Ereignis reagieren lassen
 
Gibts da nicht so was wie ein onMouseMove, das ausgelöst wird, sobald sich die Mauskkordinaten ändern?

RXR-Max 15. Apr 2007 09:28

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:
Result := GetPixel(DesktopDC, Pos.X, Pos.Y);
es hackt an DesktopDC. :gruebel:

Nikolas 15. Apr 2007 09:43

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.

TonyR 15. Apr 2007 09:46

Re: Maus auf ein Ereignis reagieren lassen
 
Zitat:

Zitat von Nikolas
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.

Ist das bei einer normalen if-Abfrage mit einem Standard-timer auch so?
Mit OnMouseMove... geht das systemweit? Und: Wäre da die CPU-Belastung nicht eigentlich höher?

RXR-Max 15. Apr 2007 09:59

Re: Maus auf ein Ereignis reagieren lassen
 
Wie mache ich das denn jetzt? Das funzt nicht. Hättet ihr noch einen anderen Weg? :(

TonyR 15. Apr 2007 10:04

Re: Maus auf ein Ereignis reagieren lassen
 
Zitat:

Zitat von RXR-Max
Wie mache ich das denn jetzt? Das funzt nicht. Hättet ihr noch einen anderen Weg? :(

Ich weis, dass du neu bist in dem Bereich...
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 14:35 Uhr.
Seite 1 von 5  1 23     Letzte »    

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