我正在编写一个远程桌面应用程序,如 TeamViewer 在 Windows 7 (x64) 和 Windows 8 (x64) 上使用 C++。
<强>1。是什么让我卡住了
我已经使用 SendInput() 实现了鼠标输入和键盘输入。当进程在 winsta0\desktop
下运行时,我发现 SendInput() 工作得很好。但是在用户锁定计算机或启动屏幕保护程序后,它不起作用。
如果我在 winsta0\winlogon
下运行进程,SendInput()
在 winsta0\default
下不起作用。
<强>2。我尝试过的
我曾尝试使用 SetThreadDesktop() 将进程从 winsta0\desktop
切换到 winsta0\winlogon
,但我收到错误 170:“请求的资源正在使用中"然后我卡住了。
<强>3。我想知道的
我注意到TeamViewer 有一个名为TeamViewer_Desktop.exe
的进程,它可以在Winlogon、Default 和Screensaver 下控制鼠标和键盘。它是如何做到的?
你能提供代码来帮助我理解如何解决我的问题吗?
我想知道**如何让我的应用程序在默认桌面和 Winlogon 桌面之间切换。因此,我可以在安全桌面上控制鼠标和键盘,而无需创建另一个在 winlogon.exe
下运行的进程。
最佳答案
您做对了:SetThreadDesktop
是正确的。该错误告诉您您在当前桌面上打开了一些资源,例如窗口,这会阻止您切换。如果您尝试生成一个最小的测试用例(正如您在这里提问时应该做的那样!),您就会发现这一点。
删除部分程序,直到找到阻止您切换桌面的 block 。一些 Windows API 很讨厌,会阻止您切换桌面,因此需要在专用线程中调用。
关于c++ - 如何在默认桌面和 Winlogon 桌面之间切换进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16010659/