2011-01-02 6 views

Antwort

3

bearbeiten: Dies wird nicht für unsichtbare Desktops arbeiten, habe ich zu meinem alten Code sah, und ich sehe, dass ich brauchte, dass für den Fang Screenshot von aktiven Desktop (die nicht ‚war WinSta0 \ Default '), um den aktiven Benutzer-Desktop zu bekommen, habe ich OpenInputDesktop verwendet.

+1 ThievingSix Sie haben Recht.

Leider jeder für mein Missverständnis.


Sie müssen SetThreadDesktop verwenden (wenn Sie Desktop von CreateDestkop erstellen, dann haben Sie Griff für sie, die Sie zu SetThreadDesktop passieren). Nachdem Sie den Desktop für den Thread gewechselt haben, können Sie den Screenshot abfangen. Eine gute Idee wäre, zum vorherigen Desktop zurückzukehren (um anderen/zukünftigen Code nicht zu "brechen").

var 
    lOldDesktop: HDESK; 
begin 
    lOldDesktop:= GetThreadDesktop(GetCurrentThreadId); 
    try 
    if not SetThreadDesktop(ADesktop) then // pass handle to your desktop, or dekstop handle obtained from OpenInputDesktop 
     {error handle, like RaiseLastOSError or Exit(False)}; 

    // your screenshot/input/mouse code here 

    finally 
    if lOldDesktop<> 0 then // GetThreadDesktop can fail (I don't know condition when this GetThreadDesktop(GetCurrentThreadId) could fail) 
     SetThreadDesktop(lOldDesktop); // revert thread to previous desktop 
    end; 
end; 

Dieser Code in Nicht-Haupt-Thread ausgeführt werden soll, wie ThievingSix hingewiesen, weil SetThreadDesktop in diesem Fall fehlschlagen kann. Ein sicherer Weg ist ein Spawn-Thread, um einen Screenshot zu erstellen.

PS. Ich bin mir nicht sicher, ob dies mit arbeiten (es soll) „-Eingang Maus/Tastatur senden“, aber für Screenshot funktioniert.

bearbeiten:

+0

können Sie einen Code für die Aufnahme eines Screenshots zur Verfügung stellen, weil ich einen Desktop namens setthreaddesktop erstellt habe, aber wenn ich versuche, einen Screenshot zu machen, bekomme ich nur das Tablett – opc0de

+0

Sie brauchen keinen anderen "screenshot code", weil es correct ist . Dein neuer Desktop * hat kein Startmenü, jeder Desktop hat "eigene Fenster". Sie können versuchen mit http://technet.microsoft.com/en-us/sysinternals/cc817881 (SysInternals Desktop wie ThievesingSix sagte), wenn Sie einen neuen Desktop mit diesem Tool erstellen wird es neue explorer.exe Prozess erstellen, die auf neuen Desktop ausgeführt wird . – kibab

+1

Ich würde gerne Arbeitscode sehen, weil das letzte Mal, als ich das versuchte, es einen schwarzen Bildschirm mit dem Screenshot zeigen würde (weil keine Fenster neu gezeichnet wurden). Die Tatsache, dass SysInternals keine Live-Thumbnails erstellt, trägt zu diesem Punkt bei. – ThievingSix

6

Die kurze Antwort, die ich gefunden habe ist, dass du kannst nicht. Sie können nicht einen Screenshot von einem inaktiven Desktop nehmen, weil es keine Farbe Anrufe sind, weil es keine sichtbaren Fenster sind neu zu zeichnen.

Sie können eine SwitchDesktop() -Aufruf tun, Screenshot, dann SwitchDesktop() zurück. Der Benutzer wird es nicht bemerken, aber Sie werden wahrscheinlich nicht viel im Screenshot, weil in dieser kurzen Zeit die Fenster haben keine Zeit gehabt, neu zu zeichnen.

Eine andere Sache ist, Sie müssen einen neuen Thread erstellen, um SetThreadDesktop() aufzurufen. Wenn Sie Ihren Haupt-Thread dazu verwenden, wird es bei der Verwendung einer GUI-Anwendung fehlschlagen. SetThreadDesktop() schlägt fehl, wenn Sie im aktuellen Desktop ein Fenster haben.

SysInternals verfügt über eine Anwendung zum Verwalten mehrerer Desktops (wie der Linux-Desktop-Switch). Wenn du einen Desktop auswählst, um dorthin zu wechseln, siehst du ein Thumbnail des Desktops. Dieses Thumbnail ist nicht live, es wird vom letzten bekannten vollständigen Neuzeichnen erfasst, wenn sich der Benutzer auf diesem Desktop befindet. Kurz gesagt, wenn SysInternals keinen Live-Screenshot machen kann, bezweifle ich, dass wir es tun.

Dies basiert natürlich auf meiner eigenen Untersuchung dieser genauen Funktion. Wenn jemand es tatsächlich zur Arbeit gebracht hat, würde ich es gerne wissen, damit ich es auch nicht benutzen kann!

+0

[Ich habe mein Programm auf 'Default' Desktop nach dem Wechsel zu neuen ausgeführt] (http://stackoverflow.com/questions/41029243/how-send-keys-and-mouse-inputs-to-default-desktop-when- new-desktop-created-is-vi) und ich kann Screenshots aufnehmen, aber ohne Erfolg in Maus/Tastatur-Interaktion. Hast du ein paar Vorschläge, um mir zu helfen? – Saulo

Verwandte Themen