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

标签 c++ windows winlogon

我正在编写一个远程桌面应用程序,如 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/

相关文章:

windows - 在登录到 Windows 之前启动 Windows 窗体应用程序

c++ - 为什么我不能放置/插入到我的 map 中?

C++ 如何验证与重载 >> 运算符一起使用的输入

c++ - 两个单独的指针可以引用同一个地址吗?如果是这样,我可以用任一指针更改该地址的值吗?

c++ - 在 C++ 中将两个 3 x 3 数组连接成一个数组

Java 不会在应用程序关闭时释放所有资源

c# - 在 Windows XP 中使用 C# 在登录屏幕上显示窗口

c - write() 没有在 C 语言的 Windows 上写入正确数量的字节

windows - 如何在 Windows 7 的路径中添加 protoc.exe

使用 “unlock” 锁定后到 “LockWorkStation()” 窗口的 C++ 脚本