首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c#中将输入发送到winlogon

如何在c#中将输入发送到winlogon
EN

Stack Overflow用户
提问于 2013-11-25 20:25:43
回答 1查看 2K关注 0票数 1

如何更换台式机?我对发送鼠标事件到winlogon桌面感兴趣(我将以系统帐户运行应用程序)。问题是,当我调用mouse_event(或任何其他函数(keybd_event、sendinput、sendkey等)时,没有任何反应。)即使我仍然在默认桌面上,也不会发生任何事情。setthreaddesktop返回true,这意味着更改成功。我甚至试着放一个有相同结果的信箱。

我创建了一个新线程,因为否则setthreaddesktop会返回170错误代码(资源正在使用)。

代码语言:javascript
复制
      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将正常工作

谢谢,

EN

回答 1

Stack Overflow用户

发布于 2013-12-04 06:05:37

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20193048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档