AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Maus auf ein Ereignis reagieren lassen

Ein Thema von RXR-Max · begonnen am 15. Apr 2007 · letzter Beitrag vom 18. Apr 2007
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Benutzerbild von RXR-Max
RXR-Max

Registriert seit: 15. Apr 2007
Ort: Hamburg
48 Beiträge
 
Delphi 7 Enterprise
 
#1

Maus auf ein Ereignis reagieren lassen

  Alt 15. Apr 2007, 07:15
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?


Ich hab etwas vergessen: Die Maus sollte aber nciht nur in meinem Programm reagieen sondern auch in anderen. Also eine systemweite funktion.
Der menschliche Körper ist immernoch das beste Instrument.
  Mit Zitat antworten Zitat
Benutzerbild von Mackhack
Mackhack

Registriert seit: 29. Nov 2003
Ort: San Diego, CA/USA
1.446 Beiträge
 
Delphi 2006 Architect
 
#2

Re: Maus auf ein Ereignis reagieren lassen

  Alt 15. Apr 2007, 07:51
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.
Um etwas Neues zu schaffen muss man seine Ohren vor den Nein-sagern verschliessen um seinen Geist öffnen zu können.
(George Lukas)
  Mit Zitat antworten Zitat
Benutzerbild von RXR-Max
RXR-Max

Registriert seit: 15. Apr 2007
Ort: Hamburg
48 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Maus auf ein Ereignis reagieren lassen

  Alt 15. Apr 2007, 08:55
Cool danke
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.



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?
Der menschliche Körper ist immernoch das beste Instrument.
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Maus auf ein Ereignis reagieren lassen

  Alt 15. Apr 2007, 10:02
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...
Kannst ja mal sagen, was du vorhast!
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Maus auf ein Ereignis reagieren lassen

  Alt 15. Apr 2007, 10:23
Gibts da nicht so was wie ein onMouseMove, das ausgelöst wird, sobald sich die Mauskkordinaten ändern?
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von RXR-Max
RXR-Max

Registriert seit: 15. Apr 2007
Ort: Hamburg
48 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Maus auf ein Ereignis reagieren lassen

  Alt 15. Apr 2007, 10:28
Genau so hab ich mir das vorgestellt. Danke TonyR
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.

Edit: Da gibts noch ein Problem. Das funktioniert nicht

Result := GetPixel(DesktopDC, Pos.X, Pos.Y); es hackt an DesktopDC.
Der menschliche Körper ist immernoch das beste Instrument.
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Maus auf ein Ereignis reagieren lassen

  Alt 15. Apr 2007, 10:43
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Maus auf ein Ereignis reagieren lassen

  Alt 15. Apr 2007, 10:46
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?
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
Benutzerbild von RXR-Max
RXR-Max

Registriert seit: 15. Apr 2007
Ort: Hamburg
48 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Maus auf ein Ereignis reagieren lassen

  Alt 15. Apr 2007, 10:59
Wie mache ich das denn jetzt? Das funzt nicht. Hättet ihr noch einen anderen Weg?
Der menschliche Körper ist immernoch das beste Instrument.
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Maus auf ein Ereignis reagieren lassen

  Alt 15. Apr 2007, 11:04
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

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!
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 Uhr.
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