2009-07-16 13 views
20

Ho un'applicazione che inietta i tasti nelle applicazioni tramite SendKeys.Alternativa a SendKeys quando si esegue su Desktop remoto?

Sfortunatamente, l'applicazione non funzionerà quando eseguo tramite Remote Desktop a causa del noto problema che SendKeys non funziona con Desktop remoto.

Qualcuno ha già risolto questo problema prima o ha qualche buon suggerimento su come risolverlo?

+0

Ho trovato una soluzione a questo problema utilizzando gli script AutoIT per inviare i server alla finestra RDP. –

risposta

7

SendKeys non è una buona misura dovuta principalmente a:

  • Può inviare solo le chiavi di applicazione attiva/concentrata, che non è mai garantito per funzionare perché l'applicazione attiva può cambiare tra il momento in cui le chiavi sono effettivamente inviato.
  • RDP e molte altre librerie (ad es. DirectX) li bloccano principalmente per motivi di sicurezza.

alternative migliori:

codice di esempio utilizzando SendMessage:

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

Per le sessioni RDP con opzioni di sicurezza aggiuntive, gli unici due modi per simulare l'input dell'utente sono la scrittura di un driver (https://msdn.microsoft.com/en-us/library/windows/hardware/hh439659%28v=vs.85% 29.aspx) che è una seccatura per gli sviluppatori di C# o l'utilizzo di SendInput che funziona in modo perfettoso! Consiglio di utilizzare la libreria http://inputsimulator.codeplex.com/ Ma attenzione a utilizzare InputSimulator.SimulateTextEntry ("testo"); invece di InputSimulator.SimulateKeyDown (VirtualKeyCode.VK_B); – McK

1

Nel mio caso stavo usando sendkeys come parte dell'automazione di test. Non funzionerebbe dalla mia macchina di compilazione, dove l'agente di compilazione funziona attraverso il protocollo desktop remoto. Non ne sono felice, ma sono stato in grado di saltare quel test come parte delle mie build automatiche.

L'utilizzo delle chiamate Win32 per inviare messaggi finestra potrebbe funzionare, se ho tempo posso provarlo un giorno.

Comunque, ecco il controllo per vedere se il codice corrente è in esecuzione in una sessione di desktop remoto:

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

È possibile risolvere problema RDP avendo scrivania sempre connesso prima dell'uso (o configurato per auto- login @ ad ogni avvio).

E anche con l'accesso automatico, se è necessario l'accesso desktop remoto per eseguire l'automazione, o gestire il sistema, ecc., Il metodo preferito è l'utilizzo di VNC per l'accesso remoto anziché RDP. La ragione è che VNC è multipiattaforma e non ti imbatterai in questo problema RDP. VNC funziona come un relay del tuo desktop attuale (sessione di console RDP 0 o "testa" della macchina), lo svantaggio è una sola sessione remota alla volta (oppure tutti condividono lo stesso desktop + tastiera + mouse). VNC funzionerà anche per le macchine virtuali.Utilizzare VNC anziché l'accesso RDP o locale (RDP) dal software di gestione della macchina virtuale (VMWare/Hyper-V/Xen).

L'unica cosa a cui fare attenzione con VNC è che il desktop non è configurato per il blocco automatico su inattivo o salvaschermo, che potrebbe anche impedire l'invio di chiavi e automazione GUI, quindi assicurati di disabilitarla. Salvaschermo & il risparmio energetico del monitor è ok, basta il blocco automatico & protezione password.

NOTA: Non sono sicuro, ma credo che dal momento VNC trasmette il desktop "come è", è lo stesso di esecuzione a livello locale dal punto di vista dell'applicazione/del sistema, e quindi dovrebbe, in teoria, anche essere in grado di ingannare il sistema/app che non consente SendKeys via RDP. Non ho avuto problemi con questo metodo VNC per AutoIt + SendKeys, se ero attivamente connesso via VNC, o disconnesso (sendkeys/automazione continua a funzionare anche dopo la disconnessione perché sul desktop reale, è ancora loggato, solo che VNC no attivo).

+0

Intersting, grazie per le informazioni. C'è qualche particolare software VNC che consigli? Preferibilmente open source. –

+0

Mi spiace, non posso raccomandare molto oltre Windows, ho usato solo server e client VNC su Windows. Su Windows, RealVNC e TightVNC funzionano bene, non ricordare se è OSS, ma hanno versioni gratuite e commerciali. Uso solo gratuito. L'unica limitazione di quelli gratuiti riguarda spesso i livelli di sicurezza della crittografia. Ma questo spesso non è un problema se lavori all'interno di una rete VPN o aziendale. – David

2

Nel mio caso stavo usando con successo SendInput di WinAPI con codici di scansione hardware. Sembra che SendKeys mappa i caratteri per analizzare i codici in modo errato.

+1

+1 Questa è la risposta più breve e corretta se si utilizza RDP con sicurezza avanzata (tastiera disabilitata, ecc.). Raccomando questa libreria: http://inputsimulator.codeplex.com/ Ma attenzione per utilizzare InputSimulator.SimulateTextEntry ("testo"); invece di InputSimulator.SimulateKeyDown (VirtualKeyCode.VK_B); – McK

Problemi correlati