Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [Visual C# 2005] Lettura proprietà dei controlli di una finestra qualsiasi.
Forum - C# / VB.NET - [Visual C# 2005] Lettura proprietà dei controlli di una finestra qualsiasi.

Avatar
en666 (Normal User)
Newbie


Messaggi: 3
Iscritto: 06/11/2006

Segnala al moderatore
Postato alle 20:26
Venerdì, 07/10/2011
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'.

Codice sorgente - presumibilmente C# / VB.NET

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



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!

PM
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Up
2
Down
V
Segnala al moderatore
Postato alle 21:55
Venerdì, 07/10/2011
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 il 07/10/2011 alle 21:56
PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
1
Down
V
Segnala al moderatore
Postato alle 12:00
Sabato, 08/10/2011
Con GetForegroundWindow puoi trovare la finestra attiva:
http://stackoverflow.com/questions/115868/how-do-i-get-the ...
Così puoi enumerare i controlli:
http://www.codeguru.com/forum/archive/index.php/t-314824.html
Infine, con GetClientRect, puoi ottenere le dimensioni e la posizione dei controlli.

Il tutto usando il pinvoke:
http://msdn.microsoft.com/en-us/library/system.runtime.int ...

Già, i link proposti da totem sono appunto la base, per specificare su che controllo vuoi/puoi agire. Esiste anche una funzione che a partire dalla posizione del mouse, ti restuisce l'handle della finestra. Se poi vuoi agire sui controlli devi lavorare tramite subclassing con la funzione sendMessage - Renny - 08/10/11 14:16
@Totem: Che velocità e che precisione! Grazie per le dritte, precise e al punto. C'è un'unica cosa che non sono riuscito a capire, nel link dell'enumerazione dei controlli, in realtà enumera le ChildWindows. Gli oggetti sono per caso visti come minifinestrelle figlie? - en666 - 09/10/11 16:00
@Renny: Grazie anche a te per la velocità e per i consigli! La funzione (api?) per l'handle della finestra ti ricordi mica come si chiama? - en666 - 09/10/11 16:02
Inoltre, se voglio fare subclassing per agire sui controlli in C#, come faccio? Cioé, devo creare un'istanza della finestra che voglio analizzare oppure agisco sulla finestra direttamente tramite sendMessage? Riusciresti a farmi un HelloWorld della cosa? - en666 - 09/10/11 16:04
PM
Avatar
Renny (Normal User)
Expert


Messaggi: 231
Iscritto: 30/07/2011

Up
1
Down
V
Segnala al moderatore
Postato alle 16:19
Domenica, 09/10/2011
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:

PM