2016-05-23 36 views
-1
auf DesktopWindow zeichnen

Ich habe versucht, jedes Ding auf Desktop-Fenster GetDC(GetDesktopWindow), wie das folgende einfache Programm zu ziehen:fehlgeschlagen

#include <windows.h> 

int main() 
{ 
    TextOut(GetDC(GetDesktopWindow()), 10, 10, TEXT("Test TextOut Tester!!"), 21); 
    return 0; 
} 

Es scheint, dass meine aktuellen Benutzer Privilegien die Zeichnungsverhalten beeinflussen, bin ich nicht Admin auf meinem PC, ist das der Grund dafür? Gibt es eine Dokumentation für dieses Problem? Vielen Dank im Voraus

+1

Das Problem ist, dass das Desktop-Fenster nicht zu Ihnen gehört. Es gibt keine vertragliche Dokumentation, die anzeigt, dass dies ein unterstütztes Szenario war. Das GDI unterliegt keinen Privilegien. Was Sie tun, schlägt aus einem anderen Grund fehl. Vollständige Abwesenheit von Fehlerbehandlung wird nicht hilfreich sein, um herauszufinden. – IInspectable

+0

Was soll ich tun? Wenn ich versuchte, 'TextOut' zu einem erstellten Fenster, es erfolgreich, aber es schlägt fehl, wenn es auf dem Desktop-Fenster tun, so was ist das Problem? obwohl der zurückgegebene Wert von 'GetDC' und' GetDesktopWindow' nicht Null ist. –

+1

Dies ist schwierig zu tun, ist nicht zwischen redraws und 99.9% der Zeit persistent eine schreckliche Idee mit besseren Alternativen (Sie sollten Ihr endgültiges Ziel angeben). Das GetDesktopWindow() - Fenster ist nicht das Fenster, das Sie sehen, das Icons, Hintergrundbilder usw. enthält, das ist eine Syslist-Ansicht, die Sie suchen müssen, beginnend mit GetShellWindow(). –

Antwort

1

Der einfache Grund, warum Sie nicht auf dem Desktop-Fenster ziehen kann, wie dies kann man nicht wirklich das Desktop-Fenster sehen. Seit Windows 95 wurde das Desktop-Fenster vollständig von einem Windows-Explorer-Cluster verdeckt.

Der DC, den Sie erhalten, wenn Sie GetDC(GetDesktopWindow()) aufrufen, wird so vollständig abgeschnitten.

Wenn Sie direkt auf dem Display zeichnen möchten, erhalten Sie von GetDC(NULL) einen DC, den Sie verwenden können, um über den gesamten Desktop und sichtbare Fenster zu zeichnen. Aber das wird, wie bereits erwähnt wurde, völlig außerhalb der Windows-Repainting-Logik funktionieren und die Ergebnisse werden, naja, hässlich und für einen wirklichen Zweck ungeeignet sein (anders gesagt, als ob man irgendeine Art von Debug-Feedback von einer fensterlosen App bekommt) im Entwicklungsprozess).

Die meisten Anwendungen, die "etwas auf dem Desktop anzeigen" möchten, tun dies, indem sie ein Fenster erstellen und darauf zeichnen. Warum ist das hier nicht angebracht?

+0

Danke, 'GetDC (NULL)' hat erfolgreich gearbeitet, und ich habe direkt auf dem Bildschirm gezeichnet. –

-1

Dies ist, was Sie tun sollten:

HDC hdc = ::GetDC(NULL); 

//draw on the desktop using the hdc 

::ReleaseDC(NULL, hdc); 
+0

Nein tu das nicht. Es wird nur im nächsten Farbzyklus gelöscht. Und es ist sowieso nicht dein Fenster, auf das du zurückgreifen kannst. –

+0

Danke, es arbeitet mit 'GetDC (NULL)'. –

+0

Ich bin erstaunt, dass du mir doch einen negativen Rang gegeben hast !!! Manchmal ist es sehr wünschenswert, so zu zeichnen, speziell beim Zeichnen mit :: SetROP2 mit einem R2_XORPEN Raster-Vorgang auf dem Desktop. Tatsache ist, dass es so gemacht wird, niemand fragte, warum es gemacht werden sollte! Das ist eine Schande. – AlphaP8