Oppure

Loading
07/10/11 18:26
en666
Buonasera a tutti, sarò breve:

Ciò che vorrei fare è più o meno una funzione come quella di SnagIT (sftw per eseguire screenshots). Questo programma infatti riesce a capire qual è l'oggetto sul quale sta passando il mouse e lo evidenzia, che sia esso bottone, menu, casella di testo etc.

In C# sono riuscito ad ottenere le proprietà left, top, width e height di ciascun controllo in finestra usando una variabile di tipo 'Control.ControlCollection'.

Control.ControlCollection insiemeControlli;
insiemeControlli = this.Controls;
foreach (Control c in insiemeControlli)
{
  textBox1.Text += "\r\n Left: " + c.PointToScreen(c.Location).X + "px, Top: " + c.PointToScreen(c.Location).Y;
}


La domanda ora è questa. Se io questa cosa la volessi fare per ogni finestra presente sul desktop? Da quella di Word a quella di Chrome? Insomma, proprio ogni finestra. :heehee:

ringrazio in anticipo tutti quanti si cimenteranno nell'impresa!
aaa
07/10/11 19:55
Renny
Bhe.. per i controlli del tuo form, è semplicissimo. Il problema si complica quando hai a che fare con altri oggetti/applicazioni che sono in esecuzione sul tuo PC. Di preciso non saprei aiutarti, ma avevo smanettato un po' in queste cose tempo.. Ogni processo in esecuzione ha un thread, a livello di sistema operativo. Esistono dei metodi in VB.NET per enumerare tutti i processi in esecuzione. Da li recuperi l'handle del processo (una specie di ID) e tramite delle API di win puoi ottenere alcune informazioni aggiuntive.. Ma mica vuoi fare un programma tipo Spy++?
Spero di non aver scritto troppe castronerie..
Ultima modifica effettuata da Renny 07/10/11 19:56
aaa
08/10/11 10:00
Il Totem
Con GetForegroundWindow puoi trovare la finestra attiva:
stackoverflow.com/questions/115868/…
Così puoi enumerare i controlli:
codeguru.com/forum/archive/index.php/…
Infine, con GetClientRect, puoi ottenere le dimensioni e la posizione dei controlli.

Il tutto usando il pinvoke:
msdn.microsoft.com/en-us/library/…
aaa
09/10/11 14:19
Renny
Ciao..
Il nome preciso della funzione non lo ricordo, ma se cerchi con google trovi.. Prova getWindowsFromPoint.. Una cosa del genere. Ovviamente funziona in abbinata con un'altra funzione che restituisce le coordinate del cursore del mouse. Per quanto riguarda il subclassing, la funzione "madre" è sendMessage. L'interfaccia di windows funziona tramite una serie di "controlli" disegnati dai vari processi, che comunicano tra loro tramite messaggi.. Per ogni controllo devi rintracciare l'handle e puoi farlo cercando i vari child del processo padre, che li ha "disegnati". Poi, rintracciato l'handle identificativo tramite sendMessage puoi interagire con questi, entro certi limiti. Il casino è scrivere instruzioni che riescano ad interagire con i controlli in modo flessibile. Ad esempio, una textbox, generata da un programma in VB6 è diversa da una generata in dot.net. Se i controlli che cerchi sono creati da un processo che è compilato a partire da Java, non puoi far niente, perchè le dinamiche sono diverse.
Comunque io, tempo che fu, avevo fatto un programmino che interagiva con una maschera di un'applicazione fatta in vb.net. Nella maschera c'erano delle textbox, con dei valori. Tramite sendmessage mi copiavo il contenuto delle textbox e cambiavo il valore. Ma sono tutti esperimenti, bisogna andare a tentativi e sono metodi poco flessibili. Se hai bisogno del codice, te lo posso incollare.. Comunque guardati Spy++, è molto interessante. Trovi ovviamente anche dei cloni, che spy++ è nella suite di VisualStudio 6.0.. (almeno io ho quello, di sicuro c'è in giro)..
ciao!:k:
aaa