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/)
-   -   Delphi Bildschirm nach bestimmten Bitmap absuchen (https://www.delphipraxis.net/141240-bildschirm-nach-bestimmten-bitmap-absuchen.html)

Fredyy 5. Okt 2009 17:14


Bildschirm nach bestimmten Bitmap absuchen
 
hi,

ich suche eine Funktion, die den Desktop nach einem bestimmten Bitmap absucht und die Koordinaten zurück gibt, wo es gefunden wurde habe bis jetzt leider nur Möglichkeiten für AutoIt gefunden, nun brauche ich eine für Delphi.

Danke schon einmal für eure hilfe,

gruß,
fredyy

rollstuhlfahrer 5. Okt 2009 17:26

Re: Desktop nach bestimmten Bitmap absuchen
 
HI,

1.) wie sieht die Möglichkeit für AutoIT aus? Vllt. kann man die ja umschreiben.
2.) 2 Schleifen und dann den Desktop systematisch absuchen.

Bernhard

Fredyy 5. Okt 2009 17:37

Re: Desktop nach bestimmten Bitmap absuchen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist die Funktion + Beschreibung und dazu wird noch eine DLL benötigt, hängt im Anhang.

Danke,
Fredyy

Code:
;===============================================================================
;
; Description:     Find the position of an image on the desktop
; Syntax:          _ImageSearchArea, _ImageSearch
; Parameter(s):    
;                  $findImage - the image to locate on the desktop
;                  $tolerance - 0 for no tolerance (0-255). Needed when colors of
;                               image differ from desktop. e.g GIF
;                  $resultPosition - Set where the returned x,y location of the image is.
;                                    1 for centre of image, 0 for top left of image
;                  $x $y - Return the x and y location of the image
;
; Return Value(s): On Success - Returns 1
;                  On Failure - Returns 0 
;
; Note: Use _ImageSearch to search the entire desktop, _ImageSearchArea to specify
;      a desktop region to search
;
;===============================================================================
Func _ImageSearch($findImage,$resultPosition,ByRef $x, ByRef $y,$tolerance)
   return _ImageSearchArea($findImage,$resultPosition,0,0,@DesktopWidth,@DesktopHeight,$x,$y,$tolerance)
EndFunc

Func _ImageSearchArea($findImage,$resultPosition,$x1,$y1,$right,$bottom,ByRef $x, ByRef $y, $tolerance)
   ;MsgBox(0,"asd","" & $x1 & " " & $y1 & " " & $right & " " & $bottom)
   if $tolerance>0 then $findImage = "*" & $tolerance & " " & $findImage
   $result = DllCall("ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"str",$findImage)

   ; If error exit
    if $result[0]="0" then return 0
   
   ; Otherwise get the x,y location of the match and the size of the image to
   ; compute the centre of search
   $array = StringSplit($result[0],"|")
   
   $x=Int(Number($array[2]))
   $y=Int(Number($array[3]))
   if $resultPosition=1 then
      $x=$x + Int(Number($array[4])/2)
      $y=$y + Int(Number($array[5])/2)
   endif
   return 1
EndFunc

Matze 5. Okt 2009 17:44

Re: Desktop nach bestimmten Bitmap absuchen
 
Je nachdem, was genau in der Registry steht (evtl. der Dateiname), kannst du dir dieses Thema näher ansehen und auch Luckies Links zu seinem Tool: Windows Desktop Icons - Position auslesen/verändern.

Ob du die Koordinaten in Pixeln bekommst oder nur eine fortlaufende Nummer, die du dann umrechnen musst, kann ich dir nicht sagen.

Fredyy 5. Okt 2009 17:47

Re: Desktop nach bestimmten Bitmap absuchen
 
Zitat:

Zitat von Matze
Je nachdem, was genau in der Registry steht (evtl. der Dateiname), kannst du dir dieses Thema näher ansehen und auch Luckies Links zu seinem Tool: Windows Desktop Icons - Position auslesen/verändern.

Ob du die Koordinaten in Pixeln bekommst oder nur eine fortlaufende Nummer, die du dann umrechnen musst, kann ich dir nicht sagen.

sry, hatte mich da wohl etwas ungenau ausgedrückt, meine nicht nur Desktop, sondern gesamte Anzeige auf dem Bildschirm.



zwischenstand:

Suche gerade eine Möglichkeit die DLL aufzurufen, wie hier via DllCall und verstehe die Sektion mit der tolerance noch nicht wirklich..

Fredyy 5. Okt 2009 20:14

Re: Bildschirm nach bestimmten Bitmap absuchen
 
Liste der Anhänge anzeigen (Anzahl: 1)
habe mir jetzt ne menge zum implementieren und bekomme es irgendwie nicht hin, leigt es evtl dran, dass die dll in c++ geschrieben ist?

also im source dll ist die funktion die ich brauche mit
Code:
ImageSearch(int aLeft, int aTop, int aRight, int aBottom, char *aImageFile)
definiert und genau die funktion brauche ich so in delphi, am besten ohne die riesige dll von Hand zu konvertieren :D

Habe nochmal den Source der DLL angehängt, evtl hilfts weiter.

danke an alle die hier mal lesen und überlegen.

gruß,
fredyy

rollstuhlfahrer 6. Okt 2009 15:46

Re: Bildschirm nach bestimmten Bitmap absuchen
 
also, wenn du die DLL benutzen willst, brauchst du sie nicht zu konvertieren. Eine DLL ist kompilierter Quelltext, der immer und jederzeit ausführbar ist, egal, wer/was die DLL aufruft.

je nach Delphi-Version sieht die Einbindung einer DLL anders aus. Guck doch mal in der Hilfe. Für D7 würde das dann heißen:

Delphi-Quellcode:
function ImageSearch(aLeft: Integer; aTop: Integer; aRight: Integer; aBottom: Integer; aImageFile: PChar): PChar; stdcall; external 'Datname.dll';
wobei ich mir beim Ergebnis nicht so sicher bin.

Bernhard

Fredyy 6. Okt 2009 16:37

Re: Bildschirm nach bestimmten Bitmap absuchen
 
Super, dass scheint schonmal zu funktionieren, jedoch funktioniert die Rückgabe der Koordianten x und y noch nicht richtig, habe die Variablen Global definiert, jedoch bleiben sie leer.
Hier meine erweiterte Funktion:

Delphi-Quellcode:
function _ImageSearch(findImage: string; tolerance: Integer): Boolean;
var
  ergebnis : PChar;
begin
  if (tolerance > 0) then findImage := '*' + inttostr(tolerance) + ' ' + findImage;

  ergebnis := ImageSearch(0,0,Screen.Width,Screen.Height,PCHAR(findImage));

  if ergebnis[0] = '1' then
  begin
  showmessage('found' + inttostr(x) + ' ' + inttostr(y));
  result := true;
  end
  else
  begin
  result := false
  end;

end;
Danke schon einmal für die Super Hilfe.

gruß,
Fredyy

mkinzler 6. Okt 2009 16:52

Re: Bildschirm nach bestimmten Bitmap absuchen
 
Gebe diese besser in Var/Out Parametern zurück

Fredyy 6. Okt 2009 16:59

Re: Bildschirm nach bestimmten Bitmap absuchen
 
Kannst du mir zufällig ein kleines Beispiel geben, weil so wie ich es bis jetzt gesehen habe muss ich das in die Funktionsdeklaration aus der DLL eingefügt werden, doch wie geht das genau?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:09 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