Newsgroup: it.comp.lang.c++
Titolo: Invio messaggi tastiera e mouse

Salve a tutti.
Faccio seguito alla news del mio collega Agostini "colloquio con
applicazione attiva" per chiedere se qualcuno sa come fare per inviare
ad un'altra applicazione i messaggi relativi alla pressione di tasti
(comuni e speciali) della tastiera, e di spostamenti del mouse.
Ho provato, come suggerito da Antonello Salvatucci, il seguente codice:
HWND myhWnd = GetForegroundWindow();
if(myhWnd != NULL)
{
	PostMessage(myhWnd,WM_MOUSEMOVE,0,0x01000100);
	PostMessage(myhWnd,WM_CHAR,'A',0x001E0001);
	PostMessage(myhWnd,WM_KEYDOWN,0x30,0x000B0003);
	PostMessage(myhWnd,WM_KEYUP,0x30,0xC00B0001);
	PostMessage(myhWnd,WM_KEYDOWN,VK_NUMPAD0,0x00520003);
	PostMessage(myhWnd,WM_KEYUP,VK_NUMPAD0,0xC0520001);
	PostMessage(myhWnd,WM_KEYDOWN,VK_F3,0x003D0001);
	PostMessage(myhWnd,WM_KEYUP,VK_F3,0xC03D0001);
//	PostMessage(myhWnd,WM_CLOSE,0,0);
}
ma non riesco a scrivere ne' la 'A' ne lo zero (ASCII 0x30) e neppure a
muovere il mouse. Ho usato come applicazione attiva Notepad e i codici
sopra sono inviati con un timer dopo 5 secondi dall'avvio del programma,
il che mi permette di spostare il focus sul Notepad.
Gli unici codici che funzionano sono il VK_F3 che simula il tasto F3 ed
avvia quindi il Find di Notepad, ed il WM_CLOSE che mi chiude
l'applicazione Notepad.
Ma qualcuno ha una vaga idea di come fare per inviare i codici dei
tasti?
Ringrazio tutti in anticipo ed in particolare Antonello per la risposta
al messaggio precedente.
CIAO
Lorenzo Stefani
ste...@iroe.fi.cnr.it

tasti?
Usando programmi a 32 bit spesso non e' cosi' facile inviare dei
messaggi ad un'altra applicazione, prova ad usare le funzioni
keybd_event e mouse_event che generano gli eventi al livello piu'
basso disponibile, purtroppo non permettono di inviare gli eventi ad
un programma specifico ma solo di metterli nella coda di sistema da
dove verranno poi smistati al programma in foreground.
Gianpaolo Bottin
- Live Long and Prosper -

 (comuni e speciali) della tastiera, e di spostamenti del mouse.
Ehm, scusa per la mia precedente risposta, era frettolosa e scorretta...
cerco di rimediare.
RISPOSTA SEMPLICE
Inviare messaggi alle finestre di altre applicazioni funziona (anche sotto 
win32, con qualche distinzione da fare). Purtroppo per quello che volete fare
voi ci sono dei problemi che spiego nella risposta lunga. La soluzione piu'
semplice per voi e' usare mouse_event() e keybd_event(), come suggerito da 
Gianpaolo. Questo emula un evento di tastiera e/o mouse "a monte", lasciando 
a Windows anche il compito di inviare i relativi messaggi alla finestra 
appropriata (es., quella con il keyboard focus nel caso di eventi di tastiera).
RISPOSTA LUNGA
Il problema con il mouse e' che WM_MOUSEMOVE non provoca lo spostamento
del mouse, ma ne e' una conseguenza. In pratica "windows" non fa altro 
che informare una finestra che il mouse e' stato spostato. 
Il problema con i messaggi di tastiera e' che per funzionare devi inviarli 
alla finestra con il "keyboard focus". Vale a dire, per esempio, al controllo 
di edit attivo. Purtroppo non e' una cosa semplice rimediare quell'handle: la
GetActiveWindow() che ti avevo consigliato io funziona solo nell'ambito del
tuo thread, mentre la GetForegroundWindow() ti restituisce, temo, l'handle
della "top level window" attiva e non quello della finestra con il focus.
L'unica soluzione che mi viene in mente e' prendere l'id del thread attivo,
usare la AttachThreadInput() e poi la GetFocus(). A forza di calci prima o poi
dovrebbe funzionare, ma la soluzione di Gianpaolo mi sembra molto piu' pulita.
Ciao,
Antonello
-- 
// ------------------------------------------------------------
// Antonello Salvatucci
// Software Developer, Technical Writer
// LEGO A/S SPU-Darwin, Kloevermarken 120, 7190 Billund DENMARK
// 
// 
+45 75 33 22 33 ext. 5186
 
anto...@digi.lego.com

...
tutto esatto, in effetti la spiegazione del perche' quelle PostMessage
non funzionano e' abbastanza lunga e anch'io non avevo ne' tempo ne'
voglia di scrivere, comunque su Advanced Windows di Jeffrey Ritcher
c'e' un capitolo molto interessante sui messaggi e l'input asincrono
di Win32 e li' spiega molto bene queste cose.
Ciao


voglia di scrivere, comunque su Advanced Windows di Jeffrey Ritcher
[...]
Vorrei aggiungere anche io un commento positivo su questo libro, che
secondo me è ottimo e molto chiaro.
Cordialmente,
Gianni Rondinini, programmer and designer at Pierre s.n.c.
e-mail: mailto:
pie...@mail.asianet.it
homepage: 
http://www.geocities.com/Eureka/Plaza/7153
Red Hat Linux user since 9/25/97
Windows NT Server user since 9/19/97
e-mail: mailto:
pie...@mail.asianet.it

 secondo me è ottimo e molto chiaro.
Mi associo. Poi personalmente trovo che alcune parti della discussione
sui messaggio siano spassose, tragicamente ma spassose.
Attenzione, i dati nello header sono alterati per proteggermi dagli spammer.
L'indirizzo corretto e' nella firma.
o   oooooo	Gian Uberto Lauri        "So, are you working on finding
      o    o	
sa...@dei.unipd.it
        that bug *now* or leaving it until
     o o				  later?" - "Yes!"