Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Pixelfarbe in minimiertem Fenster
Joridas - Di 26.06.12 16:00
Titel: Pixelfarbe in minimiertem Fenster
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 :
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
Narses: Delphi-Tags hinzugefügt
Moderiert von
Narses: Topic aus VisualCLX (Component Library for Cross Platform) verschoben am Di 26.06.2012 um 16:02
bummi - 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...
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; dllh: THandle; PrintWindow: function(sHandle: HWND; dHandle: HDC; nFlags: UINT): BOOL; stdcall; begin Result := False; dllh := GetModuleHandle(user32); if dllh <> 0 then begin @PrintWindow:= GetProcAddress(dllh , 'PrintWindow'); if @PrintWindow <> nil then begin GetWindowRect(wnd, rec); bmp.Width := rec.Right - rec.Left; bmp.Height := rec.Bottom - rec.Top; bmp.Canvas.Lock; try result := PrintWindow(wnd, bmp.Canvas.Handle, 0); finally bmp.Canvas.Unlock; 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; |
Joridas - 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 - Fr 29.06.12 17:12
Joridas hat folgendes geschrieben : |
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:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499.aspx
Das eine ist der Klassenname des Fensters, das andere der Fenstername, sprich der Fenstertitel. ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!