- Modificare controlli di programmi esterni-
 
COSA SERVE PER QUESTO TUTORIAL
Download | Chiedi sul FORUM | Glossario Microsoft Visual Basic 6 - Conoscenze basiche di VB
WindowFromPoint e GetCursorPos per agire su programmi esterni

OTTENERE IL TESTO DI UNA RIGA DI UNA CASELLA DI TESTO NON APPARTENENTE AL PROGETTO
Le funzioni WindowFromPoint e GetCurosrPos

Fino ad ora abbiamo sempre lavorato su controlli che appartenevano al form (e quindi al processo) in cui veniva eseguito il codice, in sostanza abbiamo semplicemente usato un metodo complesso per fare qualcosa che si poteva ottenere più semplicemente con una chiamate a Split sul testo della casella (Prova.Text). Abbiamo sempre utilizzato la proprietà Prova.hwnd per ottenere l'handle della TextBox:
lngLunghezzaRiga = SendMessage(Prova.hwnd, EM_GETLINE, 2, ByVal strRiga)

Ma se volessimo agire su una TextBox (o qualunque altro controllo) di altri programmi? Avremmo bisogno del loro handle da sostituire a Prova.hwnd. Come possiamo ricavare l'handle di un programma in esecuzione?
Andiamo nella cartella degli strumenti di Visual Studio e avviamo Spy++: andare al menu Spy, Find Window e apparirà una finestra; selezionare Hide Spy++, cliccare sul mirino del Finder Tool e rilasciarlo su un controllo qualsiasi di un programma in esecuzione. Ecco che nella casella di testo Handle appare l'handle del controllo sul quale avete rilasciato il mouse!
Questa procedura dimostra un utilizzo pratico della funzione API che stiamo per impiegare: WindowFromPoint; ecco la sua dichiarazione da inserire nel modulo:


Public Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" _
    (ByVal xPoint As Long, ByVal yPoint As Long) As Long

I parametri xPoint e yPoint indicano la posizione del controllo del quale si desidera conoscere l'handle, nel nostro caso si tratterà delle coordinate del puntatore del mouse.
Proviamo a replicare il codice di Spy++. Per prima cosa abbiamo bisogno di un qualcosa simile al Finder Tool anche nel nostro programma, creiamo quindi una PictureBox che chiameremo (proprietà Name) pctFinderTool e impostiamo che dopo averci cliccato, quando si rilascia il mouse su un qualsiasi controllo di un qualsiasi programma, venga restituito l'handle del controllo sul quale il mouse è stato rilasciato attraverso la funzione WindowFromPoint precedentemente dichiarata; le coordinate del puntatore possono essere ottenute tramite una semplice chiamata alla funzione GetCursorPos:

Public Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long 

Dove lpPoint è di tipo POINTAPI ovvero una coppia di valori Long che indicano rispettivamente la coordinata X e Y dello schermo:


Public Type POINTAPI 
X As Long
Y As Long
End Type

Ora che sappiamo come ottnere l'handle desiderato possiamo inviare la richiesta al controllo che ci interessa; per semplicità continueremo a utilizzare l'operazione EM_GETLINE dell'articolo precedente ma servendoci anche di un programma esterno come come il Blocco Note (Start, Esegui, notepad) in cui andranno scritte 4 o 5 righe di prova.
L'evento che viene generato quando si rilascia il mouse dopo aver premuto (senza rilasciare) sul pctFinderTool è pctFinderTool _MouseUp:


Private Sub pctFinderTool_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim ptPosizione As POINTAPI
    GetCursorPos ptPosizione
        
    Dim strRiga As String
    Dim lngLunghezzaRiga As Long
    strRiga = String(255, Chr(1))
    lngLunghezzaRiga = SendMessage(WindowFromPoint(ptPosizione.X, ptPosizione.Y), EM_GETLINE, 2, ByVal strRiga)
    NumRighe.Text = Left(strRiga, lngLunghezzaRiga)
End Sub

Come si può vedere ottenere le coordinate del cursore è molto semplice basta una chiamata a GetCursorPos passando una variabile di tipo POINTAPI in cui verranno memorizzati valori X e Y della posizione del mouse. Anche la funzione SendMessage è stata modificata: al posto di Prova.hWnd abbiamo messo una chiamata alla funzione WinbowFromPoint passando le coordinate X-Y appena ottenute.

A questo punto se si avvia il notepad (e si scrivono alcune righe), si preme sul Finder Tool e si rilascia in centro alla casella di testo del Blocco Note nella casella di testo NumRighe apparirà la terza riga che abbiamo digitato.
 

<< INDIETRO by VeNoM00