Newsgroup: it.comp.lang.c++
Titolo: AIUTOOO!! URGENTE

Scusate se vi pongo una domanda sicuramente già trattata, ma sono alle
strette con il tempo di consegna, e vi sarei molto grato se mi poteste
aiutare. Lavoro in Developer 6.0, che presenta un'anomalia. Quando devo
visualizzare un report che contiene grafici, questo si blocca in attesa che
l'utente muova il mouse. Il che è improponibile. Volevo creare un
programmino in Visual C++ (6.0) da lanciare in background in modo da
simulare un evento di mouse move. Come posso mandare un messaggio di
mousemove ad un altro processo specifico? Io conosco solo il nome del .exe
del processo o eventualmente il nome che esce nella finestra quando si preme
Ctrl+alt+canc.
GRAZIE MILLE per tutto l'aiuto che mi darete  ... e soprattutto scusate per
aver sottopostovi una domanda già trattata.
--
Rimuovere KKK per rispondermi

 Ctrl+alt+canc.
Dubito che sia la soluzione migliore ai tuoi problemi, comunque
e` un problema carino di per se`!-)
Per simulare eventi di mouse, esiste l'API mouse_event (in NT,
c'e` la migliore SendInput, ma immagino che tu debba girare
anche in Win95/98, benche` tu non lo specifichi).  Pero` essa
simula eventi di mouse a livello _globale_, non "mandandoli"
a qualcuno di specifico... quindi, per usarla come desideri,
dovresti anzitutto identificare le finestre su cui vuoi che il
mouse appaia muoversi, poi trovare la loro geometria, la
posizione attuale del move, calcolare il movimento da simulare,
ecc.
Se veramente ti basta spedire un WM_MOUSEMOVE, allora
ti basta sapere a che finestra vuoi spedirli, quindi e` piu`
semplice (sempre che la finestra li accetti come genuini,
perche`, se vuole, puo` invece scoprire che sono artificiali
e rifiutarli; ma supponiamo che non lo faccia).
Anzitutto, dunque, devi sapere quale processo corrisponda
all'exe il cui nome conosci.  In NT, con la PSAPI, il lavoro non
e` terribile.  In 95 e` a livello di hack mostruoso -- devi
agganciare una tua DLL ad ogni processo del sistema, e
in ciascuno di essi usare GetModuleFileName per scoprire
se sia quello il processo giusto (in NT, GetModuleFileNameEx,
della PSAPI, ti facilita un minimo la vita:-).
Conosciuto il processo d'interesse (o piu` di uno), una
semplice EnumWindows ti permettera` di esaminare tutte
le finestre top-level e scoprire quella (o quelle) che sono
di pertinenza di quel processo (o, di quei processi).
Che si debba fare un giro cosi`, per rimediare a un bug di
un processo che si pianta sinche` non riceve un qualche
WM_messaggio, mi sembra un _pochino_ arzigogolato.  Non
sarebbe meglio scoprire le cause del piantamento e porvi
rimedio...?
Alex


Ho chiamato il supporto Oracle. Mi hanno detto che è un'anomalia
riconosciuta e che stanno lavorando per risoverla. Il problema è che non lo
faranno in tempi brevi. Tale anomalia si presenta solo su 95/98. Ma
l'applicazione deve funzionare sia su 95/98 che su NT.
Per trovare la finestra per ora ho usato una FindWindowEx con il titolo
della finestra (solo che se si installa su una macchina con la lingua
inglese sono fregato). Sto cercando un altro modo per beccare univocamente
la finestra indipendentemente dalla lingua (ad essere sincero il tuo
suggerimento non mi è chiaro. Non me ne intendo molto di queste cose). Ho
anche scoperto che non basta mandargli un messaggio. Bisogna mettere in
primo piano il "Modulo di gestione in background dei rapporti", e muovere
fisicamente il mouse su quella finestra e non al di fuori (ho usato la
mouse_move come da te consigliatomi, perchè una PostMessage(WM_MOUSEMOVE...)
a quella finestra non bastava). Ora devo trovare il modo di evitare che
l'utente possa "switchare" ad un'altra applicazione, perchè se lo facesse il
report si fermerebbe, in attesa del fatidico movimento del mouse.
Grazie dell'aiuto. Spero di farcela in tempo.
Ciao, Matteo


Per il problema della lingua, potresti creare una finestra sempre attiva e
non visibile, vuota, che ha un nome unico in tutte le lingue. Es:
"ASJHDTENVSYNMDS", Sperando che non ci sia mai un altro programma con lo
stesso nome.
--
Alessandro Monti