1

如何更换桌面?我有兴趣将鼠标事件发送到 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 正在工作

谢谢,

4

1 回答 1

1

Windows 登录桌面受到保护,需要特殊权限才能运行进程和消息循环。

如果您在 SYSTEM 下运行,您可以复制自己的安全令牌并使用 SetTokenInformation 更改 SessionId 以在目标用户会话的 WinSta0\Winlogon 桌面上创建一个新进程(使用 CreateProcessAsUser)。

或者,您可以复制目标用户会话中以 SYSTEM 身份运行的另一个进程的安全令牌,例如 winlogon.exe 和 lsass.exe。请参阅: 在 Windows 7 欢迎屏幕上运行进程

无论哪种方式,您都将进行大量 Win32 调用来完成此任务。

于 2013-12-03T22:05:36.990 回答