2013-11-25 79 views
1

如何更改桌面?我有興趣將鼠標事件發送到winlogon桌面(我將在系統帳戶上運行該應用程序)。問題是,當我調用mouse_event(或任何其他函數(keybd_event,sendinput,sendkeys等)時,什麼也沒有發生) 即使我仍然在默認桌面上,也沒有任何反應 setthreaddesktop返回true,所以表示更改成功 我甚至試圖把一個消息具有相同的結果如何發送輸入到winlogon中c#

我創建了一個新的線程,因爲否則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正在工作

謝謝,

+0

我對此有兩個想法: 1)系統帳戶可能是非交互式的(它沒有鼠標) 2)Winlogon可能是安全關鍵的,所以你不應該混淆它。 你甚至想要歸檔什麼? – TGlatzer

+0

當我在默認桌面上時,會發生同樣的事情。我會理解,如果只是在Winlogon桌面上的情況,但事實並非如此。 – mertin

+0

你爲什麼要切換用戶?如果您需要以另一個用戶身份運行進程,則可以使用「runas」命令。 – Robert

回答

1

Windows登錄桌面受保護,需要特殊權限才能運行進程和消息循環。

如果您在SYSTEM下運行,您可以複製自己的安全令牌並使用SetTokenInformation更改SessionId,以在目標用戶會話的WinSta0 \ Winlogon桌面上創建一個新進程(使用CreateProcessAsUser)。

或者,您可以複製在目標用戶會話中以SYSTEM身份運行的另一個進程(例如winlogon.exe和lsass.exe)的安全性令牌。請參閱:Running a process at the Windows 7 Welcome Screen

無論採用哪種方式,您都將進行大量的Win32調用來完成此任務。