如何在默认桌面和Winlogon桌面之间切换进程?

Leo*_*eon 10 c++ windows winlogon

我正在Windows 7(x64)和Windows 8(x64)上用C++ 编写远程桌面应用程序,如TeamViewer.

是什么让我陷入困境

我已经使用SendInput()实现了鼠标输入和键盘输入.我发现当进程运行时SendInput()工作正常winsta0\desktop.但是在用户锁定计算机或启动屏幕保护程序后,它无法正常工作.

如果我在下面运行该过程winsta0\winlogon,SendInput()则无法正常工作winsta0\default.

2.我尝试过的

我已经尝试使用SetThreadDesktop()将进程从切换winsta0\desktopwinsta0\winlogon,但我收到错误170:"请求的资源正在使用中",我坚持了下来.

3.我想知道什么

我注意到TeamViewer有一个名为的进程TeamViewer_Desktop.exe,可以在Winlogon,Default和Screensaver下控制鼠标和键盘.它是如何做到的?

你能提供代码来帮助我理解如何解决我的问题吗?

我想知道**如何在默认桌面和Winlogon桌面之间切换应用程序.因此,我可以在安全的桌面上控制鼠标和键盘,而无需在其下创建另一个进程winlogon.exe.

Nic*_*son 8

你做对了:SetThreadDesktop是对的.该错误告诉您在当前桌面上打开了一些资源,例如窗口,这会阻止您切换.如果你曾尝试制作一个最小的测试用例(就像你在这里提问时要做的那样!)你会发现这一点.

删除程序的一部分,直到找到阻止您切换桌面的块.某些Windows API很讨厌并且阻止您切换桌面,因此需要在专用线程中调用.

  • 在调用 SetThreadDesktop 之前不要使用 user32.dll 中的任何内容。 (2认同)