Autor Beitrag
Joridas
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 26.06.12 16:00 
Hallo. Ich habe gerade erst mit Delphi angefangen und wollte wissen ob es möglich ist die Farbe eines Pixel in einem minimiertem Fenster heraus zu kriegen.

Für die sichtbare Pixelfarbe im nicht minimiertem Fenster ist es ja relativ leicht :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
Farbe:TColor;
Pixel:TBitmap;

procedure TMainForm.FormCreate(Sender: TObject);
begin
Pixel:=TBitmap.Create;
Pixel.Width:=1;
Pixel.Height:=1;
BitBlt(Pixel.Canvas.Handle,0,0,1,1,GetDC(0),xcoorinate ,ycoordinate,SRCCOPY);
Farbe:=Pixel.Canvas.Pixels[0,0];
end;
Aber ich habe leider noch keine Ansatz dafür wie ich die Farbe eines Pixels im minimiertem Fenster herauskriegen kann.
Ich hoffe ihr könnt mir helfen:)

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus VisualCLX (Component Library for Cross Platform) verschoben am Di 26.06.2012 um 16:02
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 26.06.12 16:34 
ich glaube mit der folgenden Funktion und dem beiliegenden Beispiele, hast Du die Bausteine um das zu basteln was Du möchtest...

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
function ScreenshotHidden(wnd: HWND; const bmp: TBitmap): Boolean;
var
  rec: TRect;    //zum Zwischenspeichern der Fenstergröße
  dllh: THandle; //Handle der user32.dll
  //Prototyp der verwendeten Funktion
  PrintWindow: function(sHandle: HWND; dHandle: HDC; nFlags: UINT): BOOL; stdcall;
begin
  Result := False;                     //Rückgabewert initialisieren
  dllh := GetModuleHandle(user32);     //dll dynamisch laden...
  if dllh <> 0 then
  begin
    @PrintWindow:= GetProcAddress(dllh , 'PrintWindow'); //die Funktionsadresse aus der Dll laden...
    if @PrintWindow <> nil then
    begin
      GetWindowRect(wnd, rec);           //Größe des Fensters auslesen...
      bmp.Width := rec.Right - rec.Left;   //...und die Bitmap-Größe anpassen
      bmp.Height := rec.Bottom - rec.Top;
      bmp.Canvas.Lock;                 //Zugriff auf den Canvas für andere Threads blockieren
      try
        result := PrintWindow(wnd, bmp.Canvas.Handle, 0); //Das Fenster zeichnet sich
                                                          //selbst in das HDC des Bitmaps
      finally
        bmp.Canvas.Unlock;             //Zugriff wieder erlauben
      end;
    end;
  end;
end;

procedure TForm5.Button1Click(Sender: TObject);
var
 hwnd:THandle;
 bmp:TBitmap;
begin
  bmp:=TBitmap.Create;
  try
  hwnd := FindWindow('notepad',nil);
  if hwnd<>0 then ScreenshotHidden(hwnd,bmp);
  image1.Picture.Assign(bmp);
  finally
    bmp.Free;
  end;
end;

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS

Für diesen Beitrag haben gedankt: Joridas
Joridas Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 26.06.12 18:19 
Danke für die Hilfe erst mal aber leider führt deine Funktion bei mir irgendwie nicht zum erwünschten Erfolg.

Für ein nicht minimiertes Notepad funktioniert das ganze tadellos aber das wars dann auch schon bei mir :D.
Wenn ich ich es minimiere dann zeigt mir delphi lediglich eine minimierte Notepad-version.

Außerdem scheint das ganze bei mir nur bei wenigen Programmen zu helfen. Von ca. 20 Programmen die ich ausprobiert habe funktionierten lediglich das Notepad und ein altes Spiel namens Warcraft 3.
Hier natürlich leider auch nur im nicht minimiertem Zustand.

Außerdem verwirrt mich die Namensgebung der "Fenster" was evtl. auch der Grund dafür ist, dass ich viele Programme auch im nicht minimiertem Zustand nicht dazu bringen konnte mir ein Bild zu liefern.
So kriege ich beim Notepad immer ein Bild egal wie ich das Notepad benenne (und damit auch den Namen des Fensters) wohl weil der Prozess Notepad.exe heißt. Bei Warcraft 3 hingegen muss ich Warcraft 3 als Namen bei Delphi angeben obwohl der Prozess war3.exe heißt.


Es tut mir leid falls ich etwas übersehen habe - habe ja gerade erst mit delphi angefangen:)

Übrigends: Ich benutze Windows 7 und (leider) das alte delphi 6.

edit: Es scheint als zeichnet Windows keine minimierten Fenster also funktioniert das ganze wohl nicht. Schade. Dennoch interessiert es mich was ich an der Namensgebung falsch gemacht habe.

edit2: "Fehler" was die Namen der Fenster angeht ist gefunden.
Ein einfaches ändern von

hwnd := FindWindow('notepad',nil);

zu

hwnd := FindWindow(nil,'notepad');

hat das Problem gelöst.
Ich weis zwar nicht wieso es nur "umgedreht" bei manchen Fenster funktioniert aber es macht trotzdem einen Unterschied.
Ewig lange Fehlersuche für so eine Kleinigkeit - Sachen gibts....
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 29.06.12 17:12 
user profile iconJoridas hat folgendes geschrieben Zum zitierten Posting springen:
Ein einfaches ändern von

hwnd := FindWindow('notepad',nil);

zu

hwnd := FindWindow(nil,'notepad');

hat das Problem gelöst.
Ich weis zwar nicht wieso es nur "umgedreht" bei manchen Fenster funktioniert aber es macht trotzdem einen Unterschied.
Ewig lange Fehlersuche für so eine Kleinigkeit - Sachen gibts....
Naja, ein Blick in die Doku zeigt ja wo der Unterschied liegt:
msdn.microsoft.com/e...esktop/ms633499.aspx
Das eine ist der Klassenname des Fensters, das andere der Fenstername, sprich der Fenstertitel. ;-)