Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VC#2005] WindowFromPoint
Forum - C# / VB.NET - [VC#2005] WindowFromPoint

Avatar
en666 (Normal User)
Newbie


Messaggi: 3
Iscritto: 06/11/2006

Segnala al moderatore
Postato alle 11:49
Mercoledì, 08/02/2012
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.
http://www.pierotofy.it/pages/extras/forum/16/1032320-%5Bv ...

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.

http://www.youtube.com/watch?v=8PurK_-ZlYY

Codice sorgente - presumibilmente C# / VB.NET

  1. private void timer1_Tick(object sender, EventArgs e)
  2.         {
  3.            //Coordinate di formato Point del mouse.
  4.            mouse = MousePosition;
  5.  
  6.            //Finestra Padre
  7.            windowsUnderMouse = WindowFromPoint(mouse);
  8.            GetWindowRect(windowsUnderMouse, ref rct);
  9.  
  10.  
  11.             /*
  12.            //Finestra figlia con coordinate giuste
  13.            childUnderMouse = ChildWindowFromPoint(windowsUnderMouse, mouse, CWP_SKIPINVISIBILE);
  14.            //GetWindowRect(childUnderMouse, ref rct);
  15.             */
  16.            
  17.            //Questo è un Form che uso solo come evidenziatore.
  18.            form2.Width=(rct.Right - rct.Left);
  19.            form2.Height = 2;//(rct.Bottom - rct.Top);
  20.            form2.Top=(rct.Top);
  21.            form2.Left = (rct.Left);
  22.            form2.TopMost = true;
  23.  
  24.            //Mi dice il numero di Handle della finestra che sta sotto il mouse.
  25.            textBox1.Text = "Window Handle: " + windowsUnderMouse + "\r\n";
  26.            //textBox1.Text += "Child Handle: " + childUnderMouse + "\r\n";
  27.            //textBox1.Text += "Control ID: " + controlUnderMouse + "\r\n";
  28.  
  29.            //Mi dice la posizione del mouse e la dimensione della finestra che sta sotto il mouse.
  30.            textBox1.Text += " (" + mouse.X + " - " + mouse.Y + ") "
  31.                             + " Dimensioni Finestra: " + (rct.Right - rct.Left) + ", " + (rct.Bottom - rct.Top)+"\r\n";
  32.  
  33.            Application.DoEvents();
  34.         }



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 il 08/02/2012 alle 11:52


--= se (12 -> 6 AND 10 -> 5 AND 8 -> 4 AND 6 -> 3) allora 4 -> ? =--
PM Quote
Avatar
GN (Member)
Guru


Messaggi: 770
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 21:37
Mercoledì, 08/02/2012
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...


PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 11:43
Giovedì, 09/02/2012
Anche i controlli sono finestre, perciò puoi enumerarli con EnumChildWindows:
http://www.pinvoke.net/default.aspx/user32/EnumChildWindow ...


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
en666 (Normal User)
Newbie


Messaggi: 3
Iscritto: 06/11/2006

Segnala al moderatore
Postato alle 17:46
Martedì, 14/02/2012
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!


--= se (12 -> 6 AND 10 -> 5 AND 8 -> 4 AND 6 -> 3) allora 4 -> ? =--
PM Quote