2010-12-27 19 views
8

In che modo, utilizzando C# o C++, inserire del testo nella casella di testo di un'altra applicazione? L'ho fatto molto tempo fa e sembrava ricordare qualcosa sull'utilizzo delle applicazioni HWND. Ma da quel cambiamento per ogni istanza dell'applicazione sento che non ricordo la storia completa. In qualche modo ottengo in qualche modo un elenco di app in esecuzione, estraggo quello che voglio, prendo l'HWND da quello e poi ... hmm .... e poi? :)Inserimento di testo nella casella di testo di un'altra applicazione

risposta

11

Usa FindWindowEx() per trovare la maniglia (HWND) e quindi inviare il messaggio utilizzando WM_SETTEXTSendMessage()

Quando si utilizza FindWindowEx è necessario prima trovare l'handle della finestra principale usando il suo nome di classe. Quindi dovrai trovare l'handle di qualsiasi contenitore sia presente nella casella di testo, chiamare FindWindowEx, passare l'handle del parent (la finestra) e il nome della classe del contenitore. Dovrai ripetere questa operazione fino a raggiungere la casella di testo. È possibile utilizzare uno strumento chiamato Spy++ installato per impostazione predefinita con Visual Studio per ispezionare l'applicazione di destinazione e scoprire la gerarchia dei contenitori (tutti gli oggetti sono in realtà chiamati finestre nell'API, ma li chiamerò contenitori in contrasto con il top- finestra di livello) con i loro nomi di classe.

+0

Inoltre, potrebbe essere necessario aggiungere una chiamata al InvalidateRect come SendMessage sarebbe cambiare e vorrei vedere il valore nel Winspector ma il valore sul mio modulo è rimasto lo stesso , quindi InvalidateRect causerà il repaint –

+0

Cosa succede se l'applicazione contiene più di una casella di testo e voglio leggere i dati da una casella di testo specifica. C'è un modo per distinguere il gestore delle caselle di testo? – MK446

3

Poi SendMessage(), WM_SETTEXT

-1

è possibile utilizzare classe Clipboard per ottenere lo stesso

+0

ma questo comporterà utente gestione invece di esecuzione di codice – RvdK

-2

Invece del targeting di un'app specifica è possibile inviare semplicemente sequenze di tasti al campo di testo.

private void button1_Click(object sender, EventArgs e) 
    { 
     System.Threading.Thread.Sleep(5000); 
     SendKeys.Send(send_text); 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     send_text = textBox1.Text;    
    } 
+0

Gentilmente aggiungi anche qualche spiegazione – CodeWarrior