Comunque, ci sono due "vie principali".

La prima è usare delle API o comunque delle interfacce di scripting - molti programmi che nascono fin dall'inizio con l'idea di essere "pilotati" da altro codice forniscono una qualche interfaccia "programmer-friendly", i metodi più diffusi sono:
- delle API C/COM/.NET/... per gestire l'applicazione;
- una libreria di cui l'applicazione non è altro che il frontend;
- un tool da riga di comando per controllare il funzionamento dell'applicazione;
- un linguaggio di scripting interno all'applicazione.

Alcune applicazioni offrono diverse opzioni di questo tipo (ad esempio, Office fornisce sia la prima che la quarta possibilità tramite le interfacce COM automation e VBA, che poi non è che un linguaggio che usa le sopracitate API).

In altri casi, si ha a che fare con applicazioni che non sono pilotabili da codice; in tal caso, c'è il lavoro gramo di simulare i vari click, input da tastiera, ... dell'utente - cosa che si può fare a diversi livelli - emulazione "completa" dell'interazione utente con SendInput & co. oppure inviando direttamente i messaggi rilevanti ai vari controlli (parlo di Windows qui).
In ogni caso, per quanto sia possibile usare linguaggi general purpose, per questo genere di lavori ci sono linguaggi specializzati - ad esempio, ho sentito parlare diverse volte di AutoIt per questi fini.