Warum GetWindowRgn auf Vista nicht?
-
02-07-2019 - |
Frage
Ich schreibe ein Programm, das SetWindowRgn
transparente Löcher in einem Fenster zu machen, die zu einem anderen Prozess gehört. (Dies ist nur möglich, wenn der Benutzer es explizit anfordert.)
Das Programm muss davon ausgehen, dass das Zielfenster bereits Löcher aufweisen kann, die erhalten werden müssen, also, bevor es SetWindowRgn
ruft, ruft GetWindowRgn
die aktuelle Region zu erhalten, kombiniert dann die aktuelle Region mit dem neuen und ruft SetWindowRgn
:
HRGN rgnOld = CreateRectRgn ( 0, 0, 0, 0 );
int regionType = GetWindowRgn ( hwnd, rgnOld );
Dies funktioniert gut in XP, aber der Aufruf von
Lösung Sind Sie sicher, dass Ihre Fenster hat eine Region? Die meisten Top-Level-Fenster in XP zu tun, einfach weil die Standard-Theme sie für runde Ecken verwendet ... aber das ist immer noch eine schlechte Annahme zu machen, und kann sehr wohl nicht halten, wenn Sie auf Vista zu bekommen. Wenn Sie nicht eine Region noch festgelegt haben, und der Aufruf fehlschlägt, verwenden Sie einen vernünftigen Standard (das Fenster rect) und lassen Sie es nicht Ihr Leben ruinieren. Nun, wenn GetWindowRgn
nicht in Vista. Ich habe versucht, Aero ausgeschaltet und erhebend Privileg meines Thread mit
SetWindowRgn()
versagt ...
Andere Tipps
Unter Vista, um einen Prozess, der nicht als Administrator läuft ein Fenster aus einem anderen Prozess zum Ziel, muss er:
- Embed eine Manifest-Datei mit uiAccess = "true" (Beispiel unten)
- digital signieren die Anwendung
- Installieren und es von einem "sicheren" Ort ausführen, wie "Program Files"
Hier ist ein Beispiel Manifest:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="yourAssemblyNameWithoutExtension" type="win32"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="true" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Sie erwähnen, dass Sie versuchen, die Region des Fensters von einem anderen Prozess zu erhalten. Vista verschärft die Sicherheit von vielen Quer Prozess Win32 aufruft. Ich kann keine Dokumentation eine oder andere Weise für GetWindowRgn()
finden, aber man konnte es testen einfach genug. Machen Sie ein einfaches Projekt, das seine eigene Region setzt, und versuchen Sie Ihre ursprüngliche App nutzt die einfache Anwendung der Region zu erhalten. Wenn es funktioniert, dann geht es nur lästig zu sein, und die Leute können Ihre App nicht nur auf etwas verwenden. Wenn es nicht funktioniert, gibt es eine Chance, dass Ihre App überhaupt nicht auf Vista funktionieren.
Meine Antwort (basierend auf meiner Erfahrung) in Bezug auf die Windows-API-Funktion :: GetWindowRgn (...)
Diese Funktion schlägt fehl, in Vista und in Windows 7, das heißt, es gibt Fehler.
Aber diese Funktion funktioniert gut in Windows XP.
Daher würde ich die folgende nicht-komplexe Lösung beraten:
Wenn Sie diese Funktion innerhalb einer Anwendung zu erwarten laufen
unter verschiedenen Windows bieten den Test wie folgt aus:
int nResultOfRgnOperation = :: GetWindowRegion (...);
if (nResultOfRgnOperation! = ERROR)
Bitte entsprechenden Code in den Orten verwenden markiert oben als <...>
Vielen Dank für Ihre Begeisterung.