Domanda

Sto provando a inviare input da tastiera falsi a un'applicazione in esecuzione in una sessione di Desktop remoto. sto usando:

Byte key = Ord("A");

keybd_event(key, 0, 0, 0); // key goes down
keybd_event(key, 0, KEYEVENTF_KEYUP, 0); // key goes up

Ora questo codice invia il carattere " a " a qualsiasi finestra locale, ma non verrà inviato alla finestra del desktop remoto.

Ciò significa che utilizzo Remote Desktop per connettermi a un server, quindi apro Blocco note su quel server. Se foro manualmente i tasti sulla tastiera: compaiono nella finestra dell'editor di Blocco note. Ma il finto input da tastiera di keybd_event non causa la comparsa di "quot" a nel Blocco note.

Come posso inviare programmaticamente input di tastiera falsi a un'applicazione in esecuzione all'interno di una connessione desktop remoto, da un'applicazione in esecuzione sul computer locale?


Nitpickers Corner

In questo caso specifico, voglio farlo perché sto cercando di sconfiggere un timeout di inattività. Ma potrei anche provare a

  • esegue test di automazione dell'interfaccia utente
  • Prove di stress UI
  • Test di ricerca guasti dell'interfaccia utente
  • Test delle unità UI
  • Test di input dei dati dell'interfaccia utente
  • Test della vernice dell'interfaccia utente
  • o test di resilienza dell'interfaccia utente.

In altre parole, le mie ragioni per volerlo non sono importanti

Nota: il timeout potrebbe essere dall'inattività del desktop remoto, o forse no. non lo so e non influisce sulla mia domanda.

È stato utile?

Soluzione

risposta

Sebbene Microsft affermi che non è necessario, e non dovresti , invia il codice OEM, devi inviare i codici di scansione OEM. In questo esempio, devo inviare i codici di scansione OEM per

  • il tasto A scende
  • il tasto A sale

Esiste una un'immagine di un grafico su CodeProject che elenca i codici di scansione di make e break per vari tasti:

alt text

Nel mio caso, le chiamate originali a keybd_event devono essere modificate in:

Byte key = Ord("A");

keybd_event(key, 0x1E, 0, 0); // key goes down
keybd_event(key, 0x9E, KEYEVENTF_KEYUP, 0); // key goes up

Ho provato questo e funziona. Quindi va tutto bene.

Altri suggerimenti

Forse puoi eseguire uno autoit con lo script PsExec , una sostituzione telnet leggera che consente di eseguire processi su altri sistemi, completi di interattività completa per le applicazioni della console, senza dover installare manualmente il software client.

(AutoIt è in grado di inviare qualsiasi segnale (tasti o altro) a qualsiasi applicazione per finestre e potrebbe essere avviato con PsExec sul desktop remoto)

Uno script AutoIt come KillSaver , ad esempio, è progettato per muovere il mouse per evitare lunghi periodi di inattività su un computer!

Questo ha funzionato molto bene grazie. Per ottenere il codice di scansione della tastiera è possibile utilizzare:

int scan;
scan = MapVirtualKey(key & 0xff, 0);
keybd_event(key, scan, 0, 0); // key goes down
keybd_event(key, scan | 0x80, KEYEVENTF_KEYUP, 0); // key goes up

È possibile utilizzare SendMessage (); È davvero un simulatore molto migliore per le chiavi. Bene, buona fortuna per questo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top