如何在c#中向winlogon发送输入

时间:2013-11-25 12:25:43

标签: c# windows visual-studio desktop winlogon

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

谢谢,

1 个答案:

答案 0 :(得分:1)

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

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

或者,您可以复制目标用户会话中作为SYSTEM运行的另一个进程的安全令牌,例如winlogon.exe和lsass.exe。请参阅:Running a process at the Windows 7 Welcome Screen

无论哪种方式,你都会进行大量的Win32调用来完成这项任务。