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 GetWindowRgn nicht in Vista. Ich habe versucht, Aero ausgeschaltet und erhebend Privileg meines Thread mit

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)            sonst       

Bitte entsprechenden Code in den Orten verwenden markiert oben als <...>

Vielen Dank für Ihre Begeisterung.


scroll top