Oppure

Loading
08/02/12 10:49
en666
Buongiorno a tutti!

Mi scuso per l'assenza questi mesi. Ho già fatto questa domanda e volevo postare i miei risultati, per i quali ringrazio tutti quelli che hanno contribuito (Renny e Il Totem) ma non ho potuto perché di là non c'è il tastino 'risposta':

Il problema originale: creare un programma che individuasse le coordinate e le dimensioni di un qualsiasi controllo presente sul monitor, un po' come fa la funzione di Snagit! per lo screenshot dei singoli controlli.
pierotofy.it/pages/extras/forum/16/1032320-%5Bvisual_c_2005_lettura_propriet_dei_controlli_di_una_finestra_qualsiasi/

Grazie agli aiuti appunto, ciò che sono riuscito a fare questi mesi, è evidenziare ogni 'finestra' sulla quale passa il cursore del mouse. 'Finestra' è messa fra virgolette perché Windows costruisce le finestre con altre finestre più piccole, corrispondenti ai singoli pannelli (che so, la barra dei menù, le barre di scorrimento, le caselle di testo) che hanno ciascuna il loro numero Handle.
Di seguito un video seguito dal codice di cosa sono riuscito a fare.

youtube.com/…

        private void timer1_Tick(object sender, EventArgs e)
        {
           //Coordinate di formato Point del mouse.
           mouse = MousePosition;

           //Finestra Padre
           windowsUnderMouse = WindowFromPoint(mouse);
           GetWindowRect(windowsUnderMouse, ref rct);


            /*
           //Finestra figlia con coordinate giuste
           childUnderMouse = ChildWindowFromPoint(windowsUnderMouse, mouse, CWP_SKIPINVISIBILE);
           //GetWindowRect(childUnderMouse, ref rct);
            */
           
           //Questo è un Form che uso solo come evidenziatore.
           form2.Width=(rct.Right - rct.Left);
           form2.Height = 2;//(rct.Bottom - rct.Top);
           form2.Top=(rct.Top);
           form2.Left = (rct.Left);
           form2.TopMost = true;

           //Mi dice il numero di Handle della finestra che sta sotto il mouse.
           textBox1.Text = "Window Handle: " + windowsUnderMouse + "\r\n";
           //textBox1.Text += "Child Handle: " + childUnderMouse + "\r\n";
           //textBox1.Text += "Control ID: " + controlUnderMouse + "\r\n";

           //Mi dice la posizione del mouse e la dimensione della finestra che sta sotto il mouse.
           textBox1.Text += " (" + mouse.X + " - " + mouse.Y + ") " 
                            + " Dimensioni Finestra: " + (rct.Right - rct.Left) + ", " + (rct.Bottom - rct.Top)+"\r\n";

           Application.DoEvents();
        }



Ora la richiesta: io vorrei andare verso l'infinito e oltre a recuperare dimensioni e posizione dei singoli oggetti (bottoni, voci di menù, caselle di testo etc) come si fa?
Ultima modifica effettuata da en666 08/02/12 10:52
aaa
08/02/12 20:37
GN
Bello ;)! Se vuoi un consiglio, secondo me sarebbe utile un riquadro invece che una linea intorno alle 'finestre' in modo che si distingua meglio quella selezionata. Comunque complimenti, io non avrei la più pallida idea di come fare una cosa simile...
aaa
09/02/12 10:43
Il Totem
Anche i controlli sono finestre, perciò puoi enumerarli con EnumChildWindows:
pinvoke.net/default.aspx/user32/…
aaa
14/02/12 16:46
en666
Grazie per la pronta risposta, ma ho scoperto che il tutto è molto più impestato di quanto immaginassi. In effetti i bottoni non sono affatto visti come finestre, ma come vere e proprie entità a parte detti controlli e aventi Handle differente, chiamato Hdc (un po' come quando dovevi disegnare su una picture nel caro e vecchio VB5 e 6).

Pertanto decido di farne a meno e di usare ciò che ho prodotto in video, dovrebbe bastare... ;)

grazie ancora ragazzi!
aaa