Ich schreibe eine Remote-Desktop-Anwendung wie TeamViewer in C ++ unter Windows 7 (x64) ) und Windows 8 (x64).
1. Was mich feststeckte
Ich habe die Mauseingabe und die Tastatureingabe mithilfe von SendInput () implementiert. Ich fand SendInput () perfekt funktioniert, wenn der Prozess unter winsta0\desktop
ausgeführt wurde. Aber nachdem der Benutzer den Computer gesperrt oder der Bildschirmschoner gestartet wurde, hat es nicht funktioniert.
Wenn ich den Prozess unter winsta0\winlogon
ausführe, funktioniert SendInput()
nicht unter winsta0\default
.
2. Was ich versucht habe
Ich habe versucht, SetThreadDesktop () zu verwenden, um den Prozess von winsta0\desktop
zu winsta0\winlogon
zu wechseln, aber ich habe Fehler 170: "Die angeforderte Ressource wird verwendet" und ich steckte.
3. Was ich wissen möchte
Ich habe bemerkt, dass TeamViewer einen Prozess namens TeamViewer_Desktop.exe
hat, der Maus und Tastatur unter Winlogon, Standard und Bildschirmschoner steuern kann. Wie macht es das?
Können Sie mir den Code zur Verfügung stellen, der mir hilft zu verstehen, wie ich meine Frage lösen kann?
Ich möchte wissen **, wie ich meine Anwendung zwischen dem Standarddesktop und dem Winlogon-Desktop wechseln lassen kann. So kann ich Maus und Tastatur auf einem gesicherten Desktop steuern, ohne einen weiteren Prozess zu erstellen, der unter winlogon.exe
ausgeführt wird.
Sie haben das Richtige getan: SetThreadDesktop
ist korrekt. Der Fehler weist darauf hin, dass auf dem aktuellen Desktop einige Ressourcen geöffnet sind, z. B. ein Fenster, und dass Sie nicht wechseln können. Wenn Sie versucht hätten, einen minimalen Testfall zu erstellen (wie Sie es bei Fragen tun sollten!), Hätten Sie das herausgefunden.
Schneiden Sie Teile Ihres Programms aus, bis Sie den Block gefunden haben, der den Wechsel des Desktops verhindert. Einige Windows-APIs sind unangenehm und verhindern, dass Sie den Desktop wechseln. Sie müssen daher in einem dedizierten Thread aufgerufen werden.
Wie @NicholasWilson sagte, ist SetThreadDesktop()
der richtige Weg, um zwischen Standard-Desktop und Winlogon-Desktop zu wechseln.
Der Fehler 170, "Die angeforderte Ressource wird verwendet", ist aufgetreten, weil ich MessageBox()
aufgerufen habe, bevor SetThreadDesktop()
aufgerufen wurde. Auch der Aufruf von CreateWindow()
kann den Fehler verursachen.
Ich denke, jede Funktion, die mit der GUI-Erstellung verbunden ist, die vor SetThreadDesktop()
aufgerufen wurde, kann den Fehler verursachen. Wenn Sie also SetThreadDesktop()
erfolgreich aufrufen möchten, müssen Sie sicherstellen, dass Sie keine GUI-Erstellungsfunktion aufrufen, bevor Sie SetThreadDesktop()
aufrufen.
Code
Code ist hier, um den Prozess auf den angegebenen Desktop zu wechseln.
Verwendung: SetWinSta0Desktop(TEXT("winlogon"))
, SetWinSta0Desktop(TEXT("default"))
SetWinSta0Desktop()
Funktion:
ShowLastErrorMessage()
Funktion: