2012-01-06 10 views
9

Sto scrivendo un'app (in C#) che come parte di esso deve simulare e inviare alcuni tratti chiave a un'altra applicazione. Sto usando il progetto http://inputsimulator.codeplex.com/ per simulare le chiavi, e funziona in molte applicazioni, ma in alcune non lo fa - cioè Mortal Combat 4.Come simulare l'input da tastiera in TUTTE le applicazioni?

Ho cercato su Google e ho trovato molte risposte che variano da 'è impossibile 'a' devi usare la libreria di XXX 'ecc. Quelli che mi hanno risposto mi hanno spaventato molto, e sono quasi convinto di non essere in grado di farlo in quel momento, MA ...

M $ Tastiera virtuale funziona. Funziona in TUTTE le applicazioni. Quindi è possibile ... Qualcuno di voi, ragazzi intelligenti, sa come posso ottenerlo?

+0

quale codice hai effettivamente fino ad ora che hai provato ..? – MethodMan

+0

Sto usando il progetto che ho menzionato sopra. Il metodo più basso è [DllImport ("user32.dll", SetLastError = true)] interno statico esterno UInt32 SendInput (UInt32 numberOfInputs, InputMsg [] input, Int32 sizeOfInputStructure); e funziona perfettamente in molte app, ma non tutte. :/ –

+4

@FenixVoltres: ho eseguito il reverse engineering della tastiera su schermo di Windows e utilizza lo stesso metodo di input della libreria a cui è collegato ('SendInput'). Ho collegato tutte le funzioni relative alla tastiera che mi venivano in mente ('keybd_event',' SendInput', 'SetKeyboardState', ecc.) E l'unica funzione che è stata chiamata era' SendInput'). Prova a ricontrollare il codice della libreria con la documentazione MSDN. –

risposta

6

Ok, penso che finalmente ho potuto farlo funzionare. Ho usato API Monitor raccomandato da Neal P e ha mostrato differenze minime tra le chiamate OSK e le mie. Un po 'più tardi ho provato a far sì che il mio thread chiamante si fermasse un po' di tempo tra l'invio di messaggi con la chiave di stampa e di rilascio e così è stato.

+0

Per chiunque tenti di usare API Monitor, mostrerà solo il primo elemento dell'array INPUT, cioè se passi un array di 4 elementi a SendItem (per esempio OSK lo fa quando si chiude per simulare il keydown LWIN, U keydown , Chiave U, chiave LWIN). Per visualizzare l'intero array nella finestra dei parametri, modificare il file User32.xml nella directory "\ API \ Windows" in cui è installato API Monitor e modificare la riga a Julius

+0

Come hai fatto a farlo funzionare? Sto cercando di capire lo stesso problema, ma semplicemente mettere il thread per dormire per qualche tempo non risolve nulla. 'InputSimulator.SimulateKeyDown (VirtualKeyCode.VK_0);' ' System.Threading.Thread.Sleep (1000);' ' InputSimulator.SimulateKeyUp (VirtualKeyCode.VK_0);' –

+0

qualsiasi notizia sul commento da @BogdanMolinger? – Mathias

0

Date un'occhiata a SendKeys su MSDN

+2

Ho dato un colpo, ma accade la stessa situazione - SendKeys.Send (stringa) funziona, ma non in ogni applicazione. Blocco note o Explorer lo gestisce correttamente, ma non riuscivo a farlo funzionare in qualsiasi gioco a schermo intero. –

+0

I giochi online più recenti si impegnano molto a provare a sventare le persone che scrivono programmi "bot", quindi è un po 'più difficile che dire mandare i tasti al blocco note. È ancora possibile ignorare alcuni dei loro sforzi utilizzando le chiamate api Win32.dll di basso livello ma si apre a responsabilità, ovviamente a seconda di dove si vive, quindi lascio la ricerca a voi per capirlo. – Bueller

+0

Beh, potresti risparmiare una parola o due se quei metodi non sono quelli che ho usato? In realtà questo progetto è una parte di un lavoro più ampio che è il mio progetto finale di laurea triennale all'Università di Scienza e Tecnologia dell'Università di Cracovia, in Polonia, non voglio violare alcuna legge. : P BTW fare una tastiera virtuale (o un nuovo metodo di input del computer nel mio caso) è completamente legale, penso? –

0

Sebbene tu sia stato in grado di raggiungere il tuo scopo, il modo in cui l'hai raggiunto non rispecchia fondamentalmente la tua domanda: come simulare l'input da tastiera in TUTTE le applicazioni?

C'è un sacco di situazioni in cui la modalità utente comune API Microsoft già menzionata non funziona, come le applicazioni di gioco che utilizzano l'API DirectInput o giochi protetti.

Ho creato un library che può essere d'aiuto in queste situazioni, fornisce una semplice API C che comunica internamente con i driver di filtro dei dispositivi. È in grado di inviare input per i giochi basati su DirectInput ed è anche in grado di bypassare alcune protezioni di gioco. Ho controllato ed è ancora in grado di aggirare alcune protezioni note del gioco usando la versione x64 della libreria. Le protezioni di gioco comunemente agganciano solo l'api del sistema x86. Bene, finalmente, il 18 febbraio 2012, questo è ciò che sto vedendo accadere.

+0

Hai ragione, DirectInput è il mio dolore nel (_! _). Ho dovuto smettere di sviluppare la mia app per un po ', ma controllerò sicuramente la tua libreria nei prossimi giorni, sembra essere qualcosa che stavo cercando. –

+0

@FenixVoltres Inoltre, come al momento sto supportando solo una semplice API C, un utente ha contribuito con un progetto C# che P/Invoke lo github, puoi verificarlo [qui] (https://github.com/candera /kchordr/blob/master/Program.cs) –

Problemi correlati