如何更改桌面?我有兴趣将鼠标事件发送到winlogon桌面(我将在系统帐户上运行应用程序)。问题是,当我调用mouse_event(或任何其他函数(keybd_event、sendinput、sendkeys等)时,什么都不会发生即使我仍在默认桌面上,也不会发生任何事情。setthreaddesktop返回true,这意味着更改成功。我甚至试着放一个信息框,结果也是一样的。
我创建了一个新线程,因为否则setthreaddesktop会返回170错误代码(资源正在使用中)。
bool dd = false;
StringBuilder name = new StringBuilder(200, 200);
uint sss = 0;
IntPtr hDesktop = OpenInputDesktop(1, true, desktop_ReadObjects | desktop_WriteObjects);
System.Threading.Tasks.Task.Factory.StartNew(() =>
{ dd = SetThreadDesktop(hDesktop);
CloseDesktop(hDesktop);
bool get = GetUserObjectInformation(hDesktop, 2, name, 100, ref sss);
SendKeys.Send("X");
mouse_event(MOUSEEVENTF_LEFTDOWN, 400, 400, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 400, 400, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTDOWN, 400, 400, 0, 0);
mouse_event(MOUSEEVENTF_RIGHTUP, 400, 400, 0, 0);
}).Wait();
编辑:如果我不使用SetThreadDesktop mouse_event正在工作
谢谢,
Windows登录桌面受到保护,需要特殊权限才能运行进程和消息循环。
如果您在SYSTEM下运行,您可以复制自己的安全令牌,并使用SetTokenInformation更改SessionId,以在目标用户会话的WinSta0\Winlogon桌面上创建新进程(使用CreateProcessAsUser)。
或者,您可以在目标用户会话中复制另一个以SYSTEM运行的进程的安全令牌,如winlogon.exe和lsass.exe。请参阅:在Windows 7欢迎屏幕上运行进程
无论哪种方式,您都需要进行大量的Win32调用来完成这项任务。