AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Harte Nuss: Cursor zu einer bestimmten Farbe springen
Thema durchsuchen
Ansicht
Themen-Optionen

Harte Nuss: Cursor zu einer bestimmten Farbe springen

Ein Thema von Ajin · begonnen am 25. Feb 2008 · letzter Beitrag vom 26. Feb 2008
Antwort Antwort
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#1

Harte Nuss: Cursor zu einer bestimmten Farbe springen

  Alt 25. Feb 2008, 14:47
Hallo DP!

Stellt euch vor ihr habt ein Fenster mit 3 Symbolen vor euch. Jedes Symbol hat eine eigene Farbe lässt sich innerhalb des Fensters verschieben. Die Anwendung soll nun eines der 3 Symbole mit der Maus erfassen (Drag) und ein kleinwenig verschieben.

Ich weiss nicht genau wie AUTOIT das macht, aber es "findet" z.B. das Sybol mit der Hex-Farbe: 0xFF00FF und bewegt es einen Zentimeter in irgendeine Richtung.

Ich weiss wie ich mit Delphi die Farbe am Mauscursor erkennen kann, aber wie zum Knüppel kann man den Cursor auf eine bestimmte Farbe springen lassen?

Muss ich da den Inhalt des Fensters rastern oder wie macht man das genau?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Harte Nuss: Cursor zu einer bestimmten Farbe springen

  Alt 25. Feb 2008, 14:54
Du musst den Canvas des Festers in eine Bitmap schreiben und kannst dann mit Scanline auf die Pixel zugreifen. Beim ersten Treffer hast Du die Position des Pixels mit der gewünschten Vergleichsfarbe gefunden.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#3

Re: Harte Nuss: Cursor zu einer bestimmten Farbe springen

  Alt 25. Feb 2008, 15:24
Ich hab mal die Suchfunktion bemüht und einiges zum Thema Scanline entdeckt. Aber "Du musst den Canvas des Festers in eine Bitmap schreiben" -- da habe ich nicht die geringste Ahnung wie ich das anstellen könnte. Sowas hab ich noch nie gemacht
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Harte Nuss: Cursor zu einer bestimmten Farbe springen

  Alt 25. Feb 2008, 16:14
Ok, es geht auch direkt mit dem Canvas des Formulars über Pixel. Nur schnell ist das dann nicht.
Delphi-Quellcode:
function FindColorInForm(AForm : TForm; AColor : TColor; var APoint : TPoint) : boolean;
var
   r, c : integer;
begin
   result := False;
   r := 0;
   while (r < AForm.ClientHeight) and not result do
   begin
      c := 0;
      while (c < AForm.ClientWidth) and not result do
      begin
         if AForm.Canvas.Pixels[c, r] = AColor then
         begin
            APoint.X := c;
            APoint.Y := r;
            result := True;
         end;
         inc(c);
      end;
      inc(r);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   pt : TPoint;
begin
   // Zum Test z.B. ein rotes TLabel irgendwo aufs Formular setzen
   if FindColorInForm(self, clRed, pt);
      Showmessage(Format('%d/%d', [pt.X, pt.Y]))
end;
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#5

Re: Harte Nuss: Cursor zu einer bestimmten Farbe springen

  Alt 25. Feb 2008, 16:24
Das wär schon prima! Nur muss ich statt einer TForm ein Fensterhandle auf die Farbe untersuchen.

Ich hab sowas zusammengeschustert und hing daran bevor dein Post kam:

Delphi-Quellcode:
clientHandle:=FindAWindow('Notepad', '');
canvas:=TCanvas.Create;
try
 if clientHandle=0 then
    ShowMessage('Notepad Handle not found!')
  else
   BringWindowToTop(clientHandle);
   canvas.Handle:=clientHandle;
finally
  canvas.free;
Ich dachte wenn ich das canvas vom fensterhanlde der Anwendung habe könnte ich damit weiter fahren und nach der Farbe suchen.

Kann man FindColorInForm irgendwie umschreiben zu einem FindColorInWindow?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Harte Nuss: Cursor zu einer bestimmten Farbe springen

  Alt 25. Feb 2008, 16:53
Ja das geht. So bekommst Du das Desktopbitmap im Bereich eines Fensters:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
   WindowHandle : HWND;
   DC : HDC;
   Rect : TRect;
   Bmp : TBitmap;
begin
   WindowHandle := FindWindow(nil, PChar('Unbenannt - Editor'));
   if WindowHandle > 0 then
   begin
      DC := GetWindowDc(WindowHandle);
      GetWindowRect(WindowHandle, Rect);
      Bmp := TBitmap.Create;
      Bmp.Pixelformat := pf8bit;
      Bmp.Width := Rect.Right - Rect.Left;
      Bmp.Height := Rect.Bottom - Rect.Top;
      BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, DC, 0, 0, SRCCOPY);
      ReleaseDc(WindowHandle, DC);
      // Hier dann Funktion zum Durchsuchen des Bitmap aufrufen...
      
      Bmp.Free;
   end;
end;
Dann kanst Du FindColorInFor Funktion in z.b. FindColorInBitmap umschreiben. Die Koordinaten musst Du dann noch umrechnen. Allerdings darf das Fenster nicht durch andere verdeckt sein.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Harte Nuss: Cursor zu einer bestimmten Farbe springen

  Alt 26. Feb 2008, 10:24
Danke für die Antwort. Ich tüftel noch bis heute Nachmittag an dem Fall und präsentiere dann entweder meine Lösung oder noch eine Frage.

Derzeit versuche ich gerade einen Farbwert in der Form: 0x80E0FF oder 80E0FF in einen TColor Wert zu ändern.

 Bmp.Canvas.Pixels[c, r] = HexToColor('0x80E0FF') Dazu gibts aber ne Menge Forenbeiträge, ich arbeite mich mal da durch.
  Mit Zitat antworten Zitat
26. Feb 2008, 13:06
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Multimedia" verschoben.
Das ist eine Delphi-Frage.
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: Harte Nuss: Cursor zu einer bestimmten Farbe springen

  Alt 26. Feb 2008, 13:21
Hi,

Das ist ganz einfach:

Bmp.Canvas.Pixels[c, r] := $80E0FF; in Delphi beginnen Hex-Zahlen mit einem $-Zeichen.

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#10

Re: Harte Nuss: Cursor zu einer bestimmten Farbe springen

  Alt 26. Feb 2008, 13:51
Huhu!

Somit scheint es zu klappen:

Delphi-Quellcode:
procedure TFmain.Button3Click(Sender: TObject);
var
 WindowHandle : HWND;
   DC : HDC;
   Rect : TRect;
   Bmp : TBitmap;
   r, c : integer;
   result:boolean;
begin
  WindowHandle:=FindAWindow('ICQ', '');
  if WindowHandle <> 0 then
  begin
    bsSkinMessage1.MessageDlg('ICQHandle found!',
    mtInformation, [mbOK], 0);
    DC := GetWindowDc(WindowHandle);
    GetWindowRect(WindowHandle, Rect);
    Bmp := TBitmap.Create;
    //Bmp.Pixelformat := pf8bit;
    Bmp.Width := Rect.Right - Rect.Left;
    Bmp.Height := Rect.Bottom - Rect.Top;
    BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, DC, 0, 0, SRCCOPY);
    ReleaseDc(WindowHandle, DC);

      // Hier dann Funktion zum Durchsuchen des Bitmap aufrufen...
      bsSkinMessage1.MessageDlg('Searching Bitmap!',
      mtInformation, [mbOK], 0);
      result:=FALSE;
      r := 0;
      while (r < Bmp.Height) and not result do
      begin
      c := 0;
      while (c < Bmp.Width) and not result do
      begin
         if Bmp.Canvas.Pixels[c, r] = RGB(128,224,255) then
//oder mit $HEX ^^
         begin
            showmessage('color found');
            l_x.Caption := IntToStr(c + Rect.left + 10);
            l_y.Caption := IntToStr(r + Rect.Top + 10);
            result := True;
         end;
         inc(c);
      end;
      inc(r);
   end;


      Bmp.Free;
   end
   else
   begin
     bsSkinMessage1.MessageDlg('ICQ Handle not found!',
     mtError, [mbOK], 0);
   end;
end;
Ich danke euch allen für die Hilfestellungen !
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:32 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