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/)
-   -   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!

RXR-Max 15. Apr 2007 10:08

Re: Maus auf ein Ereignis reagieren lassen
 
Danke. Aber das weiß ich doch nicht das ich das deklarieren muss. Es gibt einiges an Funktionen die ich nicht vorher deklarieren muss oder? :gruebel:

TonyR 15. Apr 2007 10:13

Re: Maus auf ein Ereignis reagieren lassen
 
Zitat:

Zitat von RXR-Max
Danke. Aber das weiß ich doch nicht das ich das deklarieren muss. Es gibt einiges an Funktionen die ich nicht vorher deklarieren muss oder? :gruebel:

Bloß der Vollständigkeit halber: DesktopDC ist eine Variable :zwinker:

Aber ich kanns versthehen, dass du da noch nicht ganz dahinter stehst...
Aber dann musst du ja auch noch nicht solche schweren Sachen machen, oder?

RXR-Max 15. Apr 2007 10:25

Re: Maus auf ein Ereignis reagieren lassen
 
Übung macht den Meister. Funzt mit dem Mausklick und so aber der macht immer den Klick egal welche Farbe ich eingestellt habe und nur auf dem Desktop. Das soll aber in jeder Anwendung gehen und nicht nur auf dem Desktop. Und vor allem soll es auf Farbe reagieren. :wiejetzt:

Ich wusste nicht DesktopDC eine Variable ist :lol:

RXR-Max 15. Apr 2007 11:25

Re: Maus auf ein Ereignis reagieren lassen
 
Hat denn jetzt jemand noch eine Lösung? Egal was ich ausprobiere es funzt einfach nicht!?

TonyR 15. Apr 2007 11:47

Re: Maus auf ein Ereignis reagieren lassen
 
Gib mal ein biss'l CODE!
Kann jetzt aber erst mal nicht helfen... weil: Formel 1

bitsetter 15. Apr 2007 13:22

Re: Maus auf ein Ereignis reagieren lassen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe mal ein Beispiel angehängt, wo ein Mausklick ausgelöst wird, wenn man die Maus bewegt und sich darunter eine rote Farbe befindet. Das ganze funktioniert mit einem Hook, eventuell kannst du ja da was von gebrauchen.

RXR-Max 15. Apr 2007 13:49

Re: Maus auf ein Ereignis reagieren lassen
 
oha hast du den schon gehabt oder hast du dir ganze arbeit extra für mich gemacht? :cheers:
Bestimmt kann ich es gebrauchen, aber ich bin ja noch neuling und dachte es gibt eine einfachere lösung weil ich bei deinem quellcode noch garnicht so durchsteige. Ih werd wohl noch ein paar jahre üben müssen.
:stupid: :wall:


an tonyr: ich schick gleich mal was ich jetzt moentan habe...

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  DesktopDC: hDC;

implementation

{$R *.dfm}
function GetPixelFarbe: TColor;
var
  Pos: TPoint;
begin
  GetCursorPos(Pos);
  Result := GetPixel(DesktopDC, Pos.X, Pos.Y);
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
DesktopDC := GetDC(0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
x, y: integer;
begin
if GetPixelFarbe = clGreen then
mouse_event(MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, x, y, 0, 0);
end;

end.
Und da ist er auch schon... :gruebel:

RXR-Max 15. Apr 2007 13:53

Re: Maus auf ein Ereignis reagieren lassen
 
Lässt sich ja auch compilieren aber was gescieht hab ich ja schon geschriben. der mausklick wird immer auf dem desktop simu obwohl er niht grün ist.


oha sorry doppelpost

TonyR 15. Apr 2007 14:39

Re: Maus auf ein Ereignis reagieren lassen
 
1. Frage: Welches Interval hast du im Moment im Timer???

2. Sache: In der Timer-Prozedur hast du die Variablen X und Y...diese sind immer 0! Ich dachte, du willst den Mausklick dort ausführen, wo die Farbe ist :wink:
Da musst du entweder nochmal das
Delphi-Quellcode:
var
  Pos: TPoint;
begin
  GetCursorPos(Pos);
einfügen, oder Pos gleich global deklarieren, um auch in Timer1Timer darauf zugreifen zu können!!

3. Ein weiteres Problem ist, dass du dir ganz sicher sein musst, welche Farbe es nun sein soll! Ich hoffe du weist, dass die ganze Sache nicht funktioniert, wenn die Farbe unter der Maus auch nur eine winzige Farbnuance anders ist!!!
ClGreen ist also in dem Fall auch nicht sehr empfehlenswert! Lieber eine Farbangabe im Hexadezimalstil verwenden (Wie z.B. "FFFFFF")...
Optimal wäre natürlich ein Farbbereich... aber da bin ich überfragt, was die Realisierung angeht... [Da weis vielleicht ein anderer bescheid!?]


So... nun werd ich mir mal deinen Code ansehen Bitsetter!

PS: Juhuuuu... Alonso ist bloß Fünfter :thumb:

Edit: Noch was gaaanz wichtiges!! Warum vergisst du das begin und end für den Block im OnTimer???
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
x, y: integer;
begin
//hier musst du das mit dem Getcursor noch machen ;-)
if GetPixelFarbe = clGreen then
  begin //dieses hier meine ich
  mouse_event(MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0);
  mouse_event(MOUSEEVENTF_RIGHTUP, x, y, 0, 0);
  end;
end;

RXR-Max 15. Apr 2007 15:40

Re: Maus auf ein Ereignis reagieren lassen
 
OK ich habe jetzt eine Änderung vorgenommen, he. Und erst hat es nicht gefunzt und dann hab ich nochmal etwas geändert und es funzt. Aber leider geht das mit der Farbe nicht da hast du recht. Das heisst ich habs mal mit schwarz ausprobiert, und das muss dann wirklich auh richrig schwarz sein.

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  DesktopDC: hDC;
  Pos: TPoint;
  x, y: integer;

implementation

{$R *.dfm}
function GetPixelFarbe: TColor;
begin
  GetCursorPos(Pos);
  Result := GetPixel(DesktopDC, Pos.X, Pos.Y);
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
DesktopDC := GetDC(0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if GetPixelFarbe = clBlack then
begin
mouse_event(MOUSEEVENTF_RIGHTDOWN, x, y, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, x, y, 0, 0);
end;
end;

end.
Jo sieht es gerade aus und es funzt. Aber dat mit der Farbe geht nicht. :(

RXR-Max 15. Apr 2007 16:11

Re: Maus auf ein Ereignis reagieren lassen
 
ok die maus soll reagieren wenn der cursor auf einer farbe zwischen der und der ist. das könnte ich ja in hex machen so

Delphi-Quellcode:
$B5D4F19E
.
Aber in delphi gibt es das schlüsselwort 'between' leider nicht dafür. Wie kann ich es denn machen? :wiejetzt:

TonyR 15. Apr 2007 16:38

Re: Maus auf ein Ereignis reagieren lassen
 
Zitat:

Zitat von RXR-Max
Wie kann ich denn rausfinden wie ich machen kann das das mausereignis passiert wenn der cursor auf einer farbe zwischen dem und dem ist...

Da kann ich dir wie gesagt auch nicht weiterhelfen :cry:

Aber nochmal zu den Code: Hast du den hier richtig reingepostet??? Weil so kann der nicht funktionieren... Wenn dann so:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  DesktopDC: hDC;
  Pos: TPoint;

implementation

{$R *.dfm}
function GetPixelFarbe: TColor;
begin
  Result := GetPixel(DesktopDC, Pos.X, Pos.Y);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DesktopDC := GetDC(0);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
GetCursorPos(Pos);
if GetPixelFarbe = clGreen then
  begin
  mouse_event(MOUSEEVENTF_RIGHTDOWN, Pos.x, Pos.y, 0, 0);
  mouse_event(MOUSEEVENTF_RIGHTUP, Pos.x, Pos.y, 0, 0);
  end;
end;

end.

TonyR 15. Apr 2007 16:51

Re: Maus auf ein Ereignis reagieren lassen
 
Zitat:

Zitat von RXR-Max
ok die maus soll reagieren wenn der cursor auf einer farbe zwischen der und der ist. das könnte ich ja in hex machen so
Delphi-Quellcode:
$B5D4F19E
...

Ich hätte da so eine Idee...
Man kann ja die Farbe des Pixels unter der Maus und die gewünschte Farbe in die 3 Grundfarben zerlegen.... und dann subtrahieren und wenn das Ergebnis so ziehmlich bei null ist, dann ist es eine ähnliche Farbe!!!
Anregung in diesem Thread!

Farbe 1: R=120...G=100...B=12
Farbe 2: R=130...G=90...B=10

Ergebnis: R=10...G=10...B=2

--> Farbe ähnlich.... Klick ausführen.

Und, wie findes du die Idee???

bitsetter 15. Apr 2007 16:57

Re: Maus auf ein Ereignis reagieren lassen
 
Und wenn das Programm beendet wird, sollte man den Speicher auch wieder frei geben:
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin
 if DesktopDC > 0 then
   ReleaseDC(0, DesktopDC);
end;

RXR-Max 15. Apr 2007 17:01

Re: Maus auf ein Ereignis reagieren lassen
 
sehr gute idee. jedoch sind die farben in zu großem unterschied. hatte ich schon erwähnt das die farben wechseln!!!!!!!!!!?? :lol:

Aber da fällt mir auch noch etwas ein. jetzt musst du mir nur noch sagen wie ich das auf delphi übertrage :lol:

du weißt ja...

NEULING :spin2:

edit: Kann mir denn jemand erkläre wie ich das machen soll?

HannosG 15. Apr 2007 18:58

Re: Maus auf ein Ereignis reagieren lassen
 
Vielleicht so:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  DesktopDC: hDC;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
DesktopDC := GetDC(0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
If DesktopDC > 0 then
   ReleaseDC(0, DesktopDC);
end;

function GetPixelAbweichung(Farbe: TColor): Integer;
var DCFarbe: TColor;
begin
DCFarbe:=GetPixel(DesktopDC, Mouse.CursorPos.X, Mouse.CursorPos.Y);
Result:=Abs(GetRValue(Farbe)-GetRValue(DCFarbe)) +
        Abs(GetGValue(Farbe)-GetGValue(DCFarbe)) +
        Abs(GetBValue(Farbe)-GetBValue(DCFarbe));
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
If GetPixelAbweichung(clGreen)<100 // die Abweichung von der Farbe, z.B. 100. maximale Abweichung wäre 3*255
  then begin
  mouse_event(MOUSEEVENTF_RIGHTDOWN, Mouse.CursorPos.X, Mouse.CursorPos.Y, 0, 0);
  mouse_event(MOUSEEVENTF_RIGHTUP, Mouse.CursorPos.X, Mouse.CursorPos.Y, 0, 0);
  end;
end;
"Abs" gibt den Betrag bzw. den Absolut-Wert zurück. Bsp.: Abs(2-7)=5

EDIT: Achja, DesktopDC am Ende noch freigeben. (s. bittsetter)

RXR-Max 15. Apr 2007 19:04

Re: Maus auf ein Ereignis reagieren lassen
 
du bist ein schatz!!! :-D

ää *räusper*. Nein ich bin nicht schwul...

hab herzlichen dank :P

TonyR 15. Apr 2007 19:56

Re: Maus auf ein Ereignis reagieren lassen
 
Aber nicht den letzten Beitrag von Bitsetter unter den Tisch fallen lassen!!!
Es gehört sich einfach den Speicher wieder freizugeben :wink:

Und jetzt ist da die redbox... und die sagt, dass der Hanno das schon geändert hat in seinem Code... Naja... spät, aber gemacht^^

TonyR 15. Apr 2007 20:09

Re: Maus auf ein Ereignis reagieren lassen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hab jetzt aber nochmal was nachgeprüft...
Ob es vielleicht klüger wäre den Schnitt an Abweichungen auszurechnen???

Weil siehe Screenshot (Bild 1): die zwei Farben sehen sich doch ziemlich ähnlich...
Code:
        R   G   B
oben: 150  255   0
unten: 0   255  150
ergibt: 150 + 0 + 150 = 300
Sehr große Abweichung für kleine sichtbare Abweichung oder?

Edit: Anhang

Edit2: Bild 2 im Anhang...
Code:
        R   G   B
oben:  0  205   230
unten: 0   255  150
ergibt: 0 + 50 + 80 = 120
und hier ist ein deutlicher Unterschied sichtbar...

Edit 3: Mit dem Schnitt bilden geht ja auch net...
300/3 = 100
120/3 = 40
auch eine Verfälschung... :cry:


Toll, oder?

RXR-Max 15. Apr 2007 20:20

Re: Maus auf ein Ereignis reagieren lassen
 
die abweichung könnte noch größer sein, aber ich hab keine ahnung wie ich die jetzt vergrößere. ich lege die farbe dann ja eh fest. Vielleicht mach ich eine TComboBox mit rein das man die farbe selber auswählen kann. :stupid:

RXR-Max 15. Apr 2007 20:34

Re: Maus auf ein Ereignis reagieren lassen
 
der letzte quellcode funzt leider nicht. die maus reagiert dann garnicht mehr. also sie macht den rechtsklick nicht meine ich. ich kapier garnix :wall:

RXR-Max 15. Apr 2007 20:51

Re: Maus auf ein Ereignis reagieren lassen
 
Ist sowas vielleicht möglich?

Delphi-Quellcode:
const FarbAbweichung: Array [$FFFFFFFF..$BBBBBBBB] of Integer;
:gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel: :gruebel:

TonyR 15. Apr 2007 20:56

Re: Maus auf ein Ereignis reagieren lassen
 
Nee... geht net... (außer vielleicht mit nem Array of TColor??? glaub ich aber nicht)...

Man müsste die Farben auf einem Farbverlauf, der alle Farben beinhaltet darstellen können...
Dann könnte man ganz einfach feststellen, ob sich die Farbe noch im gültigen Bereich befindet...

Ich mach dazu auch noch ne Skizze... aber jetz muss ich ins Bett... morgen halb sechs aufstehen...

RXR-Max 15. Apr 2007 21:00

Re: Maus auf ein Ereignis reagieren lassen
 
mir ist noch jede meneg eingefallen. ich probiere es einfach mal aus...

muss jetzt auch gleich pennen. :pale:

bitsetter 15. Apr 2007 21:10

Re: Maus auf ein Ereignis reagieren lassen
 
Ich habe noch eine andere Funktion geschrieben, kannst ja mal testen ob die anders ist:
Delphi-Quellcode:
function ColorToleranz(SollColor, IstColor: TColor; Toleranz: Byte): boolean;
var
  rSoll, gSoll, bSoll, rIst, gIst, bIst: byte;
begin
  Result:= false;
  SollColor := ColorToRgb(SollColor);
  rSoll := GetRvalue(SollColor);
  gSoll := GetGvalue(SollColor);
  bSoll := GetBvalue(SollColor);

  IstColor := ColorToRgb(IstColor);
  rIst := GetRvalue(IstColor);
  gIst := GetGvalue(IstColor);
  bIst := GetBvalue(IstColor);
  if (rIst >= rSoll- Toleranz) and (rIst <= rSoll + Toleranz) and
    (gIst >= gSoll- Toleranz) and (gIst <= gSoll + Toleranz) and
    (bIst >= bSoll- Toleranz) and (bIst <= bSoll + Toleranz) then
      Result := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  DCFarbe: TColor;
begin
  DCFarbe := GetPixel(DesktopDC, Mouse.CursorPos.X, Mouse.CursorPos.Y);
  if ColorToleranz(clGreen, DCFarbe, 20) then//max 255
  begin
    mouse_event(MOUSEEVENTF_RIGHTDOWN, Mouse.CursorPos.X, Mouse.CursorPos.Y, 0, 0);
    mouse_event(MOUSEEVENTF_RIGHTUP, Mouse.CursorPos.X, Mouse.CursorPos.Y, 0, 0);
  end;
end;
Obwohl was ist denn das $B5D4F19E für eine Farbe?
z.B. Blau = $FF0000

Es kann natürlich auch sein, dass es so eine Funktion schon irgendwo gibt.

RXR-Max 15. Apr 2007 21:30

Re: Maus auf ein Ereignis reagieren lassen
 
Liste der Anhänge anzeigen (Anzahl: 1)
cool danke gleich mal angucken. ich weiß nicht was das für eine farbe ist :lol:
das war ja bloß ein beispiel. aber ich gucke gerne bei Photoshop:

die letzten beiden hat er weggelassen wie du dem bild entnehmen kannst

:gruebel:

bitsetter 15. Apr 2007 21:43

Re: Maus auf ein Ereignis reagieren lassen
 
Also bei mir ist die Farbe andersrum richtig :?: , probiere es doch mal aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Color:= $F1D4B5; //$B5D4F1;
end;
Kann ja sein, dass es daran liegt.

RXR-Max 15. Apr 2007 21:54

Re: Maus auf ein Ereignis reagieren lassen
 
mal noch ne andere frage!? ich probiere gerade das ganze in eine dll zu 'basteln'. alles soweit fertig, lässt sich compilieren alles ok. aber wie setzte ich ein timer in einer dll bzw. einen intervall. das was ich jetzt da rein geschrieben habe soll ganz schnell gemacht werden, also der mausklick :?:


bis morgen geh jetzt erstmal pennen... :angel:

RXR-Max 16. Apr 2007 14:54

Re: Maus auf ein Ereignis reagieren lassen
 
ok die funktion oben geht aber es wird immer ein mausklick simuliert auch wenn ich nicht über der farbe bin?? :gruebel:

TonyR 16. Apr 2007 15:36

Re: Maus auf ein Ereignis reagieren lassen
 
Wow :shock:

Bitsetter legt sich ja richtig ins Zeug...
Ich teste den Code auch mal...

Aber warum willst du das in eine DLL auslagern??? Nur so zum probieren???
Naja... jedenfalls, Wenn du dazu auch Fragen hast, dann bitte einen neuen Thread aufmachen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr.
Seite 1 von 2  1 2      

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