2009-07-16 33 views
20

Tôi có một ứng dụng sẽ chuyển tổ hợp phím vào các ứng dụng thông qua SendKeys.Thay thế cho SendKeys khi chạy trên Remote Desktop?

Thật không may, ứng dụng sẽ không hoạt động khi tôi chạy nó qua Remote Desktop vì vấn đề nổi tiếng mà SendKeys không hoạt động với Remote Desktop.

Có ai đã giải quyết vấn đề này trước đây hoặc có bất kỳ đề xuất nào tốt về cách giải quyết vấn đề này không?

+0

Tôi đã tìm thấy giải pháp cho vấn đề này khi sử dụng kịch bản AutoIT để gửi tới cửa sổ RDP. –

Trả lời

7

SendKeys không phải là một sự phù hợp tốt chủ yếu là do:

  • Nó chỉ có thể gửi chìa khóa để hoạt động/tập trung ứng dụng, mà không bao giờ được bảo đảm để làm việc vì các ứng dụng hoạt động có thể thay đổi giữa thời gian các phím được thực sự đã gửi.
  • RDP và nhiều thư viện khác (ví dụ: DirectX) chặn chúng chủ yếu vì lý do bảo mật.

lựa chọn thay thế tốt hơn:

Mẫu mã sử dụng SendMessage:

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

Đối với phiên RDP với các tùy chọn bảo mật bổ sung, chỉ có hai cách để mô phỏng đầu vào của người dùng là viết trình điều khiển (https://msdn.microsoft.com/en-us/library/windows/hardware/hh439659%28v=vs.85% 29.aspx) đó là một rắc rối cho các nhà phát triển C# hoặc sử dụng SendInput mà không làm việc perferctly! Tôi khuyên bạn nên sử dụng thư viện http://inputsimulator.codeplex.com/ Nhưng hãy chú ý sử dụng InputSimulator.SimulateTextEntry ("văn bản"); thay vì InputSimulator.SimulateKeyDown (VirtualKeyCode.VK_B); – McK

1

Trong trường hợp của tôi, tôi đã sử dụng sendkeys như một phần của tự động hóa thử nghiệm. Nó sẽ không hoạt động từ máy xây dựng của tôi, nơi tác nhân xây dựng chạy qua giao thức máy tính từ xa. Tôi không hài lòng về nó nhưng tôi đã có thể bỏ qua thử nghiệm đó như là một phần của các bản dựng tự động của tôi.

Sử dụng các cuộc gọi Win32 để gửi tin nhắn cửa sổ có thể hoạt động, nếu tôi có thời gian tôi có thể thử vào một ngày nào đó.

Nhưng dù sao, đây là việc kiểm tra để xem nếu mã hiện đang chạy trong một phiên họp để bàn từ xa:

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

Bạn có thể workaround vấn đề RDP bằng việc có máy tính để bàn luôn đăng nhập trước khi sử dụng (hoặc cấu hình cho auto đăng nhập @ mỗi lần khởi động).

Và ngay cả khi tự động đăng nhập, nếu bạn cần truy cập máy tính để bàn từ xa để chạy tự động hóa hoặc quản lý hệ thống, v.v., phương pháp ưa thích là sử dụng VNC để truy cập từ xa thay vì RDP. Lý do là VNC là nền tảng chéo và bạn sẽ không gặp phải vấn đề RDP này. VNC hoạt động giống như một máy tính để bàn thực sự của bạn (RDP console 0 hoặc "head" của máy), bất lợi là một phiên làm việc từ xa tại một thời điểm (hoặc bạn chia sẻ cùng một bàn phím + bàn phím + chuột). VNC cũng sẽ làm việc cho các máy ảo.Sử dụng VNC thay vì truy cập RDP hoặc cục bộ (RDP) từ phần mềm quản lý máy ảo (VMWare/Hyper-V/Xen).

Điều duy nhất cần lưu ý với VNC là máy tính không được cấu hình để tự động khóa khi không hoạt động hoặc bảo vệ màn hình, cũng có thể dừng tự động gửi khóa và tự động hóa GUI. Screensaver & màn hình tiết kiệm điện năng là ok, chỉ cần không tự động khóa & mật khẩu bảo vệ. Chú ý: Tôi không chắc chắn, nhưng tin rằng kể từ khi VNC chuyển máy tính để bàn "như là", nó cũng giống như thực hiện tại địa phương từ quan điểm của ứng dụng/hệ thống, vì vậy nó nên trong lý thuyết cũng có thể đánh lừa hệ thống/ứng dụng không cho phép SendKeys qua RDP. Tôi không gặp vấn đề gì khi sử dụng phương thức VNC này cho AutoIt + SendKeys, cho dù tôi đã được kết nối tích cực qua VNC hay bị ngắt kết nối (sendkeys/automation vẫn tiếp tục hoạt động sau khi ngắt kết nối vì trên máy tính thực tế, nó vẫn đăng nhập, VNC không hoạt động).

+0

Intersting, cảm ơn thông tin. Có phần mềm VNC cụ thể nào bạn đề nghị không? Tốt hơn là nguồn mở. –

+0

Xin lỗi, không thể đề xuất nhiều hơn ngoài Windows, tôi chỉ sử dụng máy chủ VNC và máy khách trên Windows. Trên Windows, RealVNC và TightVNC hoạt động tốt, không nhớ nếu là OSS, nhưng chúng có các phiên bản miễn phí và thương mại. Tôi chỉ sử dụng miễn phí. Giới hạn duy nhất của những người miễn phí thường là về mức độ bảo mật mã hóa. Nhưng đó không phải là một mối quan tâm lớn nếu bạn làm việc trong mạng VPN hoặc mạng công ty. – David

2

Trong trường hợp của tôi, tôi đã sử dụng thành công SendInput của WinAPI với mã quét phần cứng. Dường như SendKeys lập bản đồ ký tự để quét mã không chính xác.

+1

+1 Đây là câu trả lời ngắn nhất và chính xác nếu sử dụng RDP với bảo mật nâng cao (bàn phím bị tắt, v.v.). Tôi khuyên bạn nên sử dụng thư viện này: http://inputsimulator.codeplex.com/ Nhưng hãy chú ý sử dụng InputSimulator.SimulateTextEntry ("văn bản"); thay vì InputSimulator.SimulateKeyDown (VirtualKeyCode.VK_B); – McK

Các vấn đề liên quan