2009-07-16 39 views
20

我有一個應用程序通過SendKeys嚮應用程序注入按鍵。在遠程桌面上運行時替代SendKeys?

不幸的是,當我通過遠程桌面 運行該應用程序時,該應用程序將無法工作,因爲SendKeys無法與遠程桌面配合使用。

有沒有人解決了這個問題,或者對如何解決它的任何好的建議嗎?

+0

我發現這個問題的解決方案是使用AutoIT腳本將密鑰發送到RDP窗口。 – 2017-06-13 17:51:06

回答

7

的SendKeys是不適合的主要原因是:

  • 它只能發送鍵主動/集中申請,這是從來無法保證正常工作,因爲活躍的應用程序可以在時間的鍵之間切換實際發送。
  • RDP和許多其他的庫(例如,DirectX的)阻止它們主要是出於安全的原因。

更好的替代品:

示例代碼:

HWND hwndNotepad = FindWindow(_T("Notepad"), NULL); 
HWND hwndEdit = FindWindowEx(hwndNotepad, NULL, _T("Edit"), NULL); 
SendMessage(hwndEdit, WM_SETTEXT, NULL, (LPARAM)_T("hello")); 
+1

對於具有增加的安全選項的RDP會話,模擬用戶輸入的唯一兩種方法是編寫驅動程序(https://msdn.microsoft.com/en-us/library/windows/hardware/hh439659%28v=vs.85% 29.aspx)這對C#開發人員來說是一件麻煩事,或者使用SendInput來完成工作!我建議使用庫http://inputsimulator.codeplex.com/ 但請注意使用InputSimulator.SimulateTextEntry(「text」);而不是InputSimulator.SimulateKeyDown(VirtualKeyCode.VK_B); – McK 2015-10-14 06:34:28

1

在我來說,我使用的SendKeys作爲自動化測試的一部分。它不能在我的構建機器上運行,構建代理通過遠程桌面協議運行。我對此並不滿意,但作爲自動化構建的一部分,我可以跳過該測試。

使用Win32調用發送窗口消息可能會奏效,如果我有時間,我可能會嘗試,總有一天。

總之,這裏是檢查是否當前的代碼是在遠程桌面會話中運行:

System.Environment.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-") 
2

可以通過讓桌面解決辦法RDP問題始終記錄在使用之前(或配置爲自動登錄@每次啓動)。

甚至與自動登錄,如果你需要遠程桌面訪問運行自動化或管理系統等,首選方法是使用VNC遠程訪問,而不是RDP。原因是VNC是跨平臺的,你不會遇到這個RDP問題。 VNC就像你的實際桌面(RDP控制檯會話0或機器的「頭」)的接力,缺點在目前一個遠程會話只(或大家分享相同的桌面+鍵盤+鼠標)。 VNC也可以用於虛擬機。(VMWare/Hyper-V/Xen)虛擬機管理器軟件使用VNC代替RDP或本地(RDP)訪問。

VNC唯一需要注意的是,桌面不會被配置爲在閒置或屏保上自動鎖定,也可能會停止發送鍵和GUI自動運行,因此請務必禁用該功能。屏保&顯示器省電狀態正常,只是沒有自動鎖&密碼保護。

注意:我不確定,但相信自從VNC按照「按原樣」轉發桌面後,它與從應用程序/系統的角度在本地執行相同,因此理論上也應該可以愚弄通過RDP不允許SendKeys的系統/應用程序。對於AutoIt + SendKeys,無論是通過VNC主動連接,還是斷開連接,我都沒有遇到過使用此VNC方法的問題(由於在實際桌面上它仍然已登錄,所以sendkeys/automation仍然在斷開連接後繼續工作,而VNC卻沒有活性)。

+0

Intersting,感謝您的信息。您有推薦的特定VNC軟件嗎?最好是開源的。 – 2011-09-07 17:42:39

+0

對不起,不能推薦Windows以外的地方,我只在Windows上使用VNC服務器和客戶端。在Windows上,RealVNC和TightVNC很好地工作,不要回想起是否是OSS,但他們有免費和商業版本。我只使用免費。免費的唯一限制通常是關於加密安全級別。但是,如果你在VPN或公司網絡中工作,這通常不是一個問題。 – David 2011-09-07 19:02:34

2

在我的情況下,我成功地使用WinAPI的SendInput和硬件掃描代碼。它看起來像SendKeys映射字符不正確地掃描代碼。