bitmap in fenster finden
-
Hi,
also mein problem ist folgendes (ganz Konkret):
ich will ein 16x16 Bild im Minesweeper Fenster (also so ein Kasten) suchen. Hab mir also das HWND von Minesweeper per FindWindow() besorgt und daraus dann über GetDC das HDC bekommen. Jetzt wollte ich erst mit GetPixel arbeiten... allerdings wird das viel zu kompliziert weil seit Windows 7 Minesweeper sehr reich an farben geworden ist :D. Also, wie kann ich son Bild jetzt in dem Fenster suchen?
Sehe da noch das Problem dass die Kästen Richtung oben-links heller werden...
-
ok hab grade schonmal n bisschen rumprobiert und mir is aufgefallen dass das HDC irgendwie "ungültig" is... GetDC() gibt zwar was anderes als NULL zurück, aber wenn ich versuche z.b. mit FillRect() das Fenster von Minesweeper zu überzeichnen passiert nichts. FillRect gibt 1 zurück (also kein fehler) aber ich sehe nichts. Nehme ich stattdessen GetDC(NULL) klappt es. Warum das???
-
Mal ins Blaue geraten: Falscher Code.
Aber ohne Code ist das natürlich auch nur geraten.
-
HWND hWnd = FindWindowA(NULL, "Minesweeper"); HDC hDC = GetDC(hWnd); RECT rc; GetWindowRect(hWnd, &rc);und dann irgendwas damit machen... z.B.
FillRect(hDC, &rc, CreateSolidBrush(0));klappt nicht... also die funktion gibt 1 zurück aber er zeichnet nichts.... allerdings wenn ich
hDC = GetDC(NULL);mache klappt es
-
Soo, habe es mal getestet.
In der Tat, liefert GetDC(0) das gewünschte Ergebniss, während GetDC(hWnd) es nicht tut.
Habe mich dann mal durch etliche Foren und Google Links gewühlt, und kam zu folgendem Ergebniss:
GetDC(0) liefert den Handle für den aktuellen Bildschirm (nicht für ein Fenster).
GetWindowRect(hWnd, &rc);
Setzt dann trotzdem das Rechteck für hWnd (hdc wird dafür ja nicht benötigt).
FillRect(hDC, &rc, CreateSolidBrush(0));
Zeichnet dann direkt auf den Bildschirm ins Fensterrechteck.
Warum man aber das Minesweeper Fenster nicht mit GetDC(hWnd) zum Zeichnen bekommt, ist mir auch ein Rätsel.
Denn die MSDN Beschreibung sagt doch eindeutig:
The GetDC function retrieves a handle to a device context (DC) for the client area of a specified window or for the entire screen.
-
ja ganz genau so isses... ich check das nich.. oder könnte das sein dass das minesweeper in win7 mit directx gezeichnet wird? Glaube dann geht das nich.. wenn ich mich jetzt nich total irre...
EDIT:
ok mit GetWindowDC() geht es... keine ahnung warum...
-
Ich habs mit XP getestet und wie gesagt, das Gleiche.
GetWindowDC hatte ich auch probiert, aber klappte auch nicht.
-
ja probier mal statt GetWindowRect() GetClientRect() weil in deinem post hatte ich gelesen
"The GetDC function retrieves a handle to a device context (DC) for the client area of a specified window or for the entire screen."problem is halt, dass das zu klein is... aber es geht erstmal... also man sieht ein ergebnis^^.
Auf msdn steht noch
"The GetWindowDC function retrieves the device context (DC) for the entire window, including title bar, menus, and scroll bars. A window device context permits painting anywhere in a window, because the origin of the device context is the upper-left corner of the window instead of the client area."Das checke ich aber nich weil bei mir überzeichnet er dann nur die clientarea... also nich den titlebar... und das obwohl rc.left und rc.top = 0 sind...
-
1700 schrieb:
oder könnte das sein dass das minesweeper in win7 mit directx gezeichnet wird?
so ist es...
-
weiß hier keiner n lösungsansatz?
Vielleicht kann ich mit GetPixel() die einzelnen pixel vergleichen... allerdings wird diese methode sehr problematisch weil jedes kästchen sich in seiner helligkeit unterscheidet :S