Newsgroup: it.comp.lang.delphi
Titolo: Handle esadecimale

Ciao, a tutti
sto creando un'applicazione che deve leggere del testo selezionato di
un'altra applicazione non scritta da me; ho deciso di usare le api; ora con
winsight ho tutto dell'applicazione, il nome della classe applicazione,  dei
suoi child ed i rispettivi handle però in esadecimale. In pratica in questa
applicazione c'è una specie di dbgrid e conosco l'handle in esadecimale ma
non so come inserirlo nel getwindowtext
ad esempio con getwindowtext("valore esadecimale child",testo,100)
quindi ho optato per l'uso di Findwindow e findwindowex usandoli in questo
modo
.....
var h : HWND, testo : array[0..99] of Char ;
begin
h := findwindowex(findwindow('NOME DELLA CLASSE APPLICAZIONE',NIL),
findwindow('NOME DELLA CLASSE CHILD',NIL), 'NOME DELLA CLASSE CHILD', nil);
getWindowText(h, Testo, 100);
Memo1.text := strpas(testo);
......
Ma non funziona, in pratica non mi legge il testo del child. C'è un modo per
convertire l'handle esadecimale per inserirlo nelle varie API?
Ci sono altre soluzioni?
Grazie in anticipo a quanti mi aiuteranno!

 ha scritto nel messaggio 
news:o4U2e.718193$b5.32...@news3.tin.it...

Dovrebbe essere qualcosa del tipo:
 h := findwindow('NOME DELLA CLASSE APPLICAZIONE',NIL);
h:= findwindowex(h,nil,'NOME DELLA CLASSE CHILD',NIL);
 getWindowText(h, Testo, 100);
dividendo il codice puoi controllare a che livello non trova la finestra 
guardando se h è > 0
ciao 

  getWindowText(h, Testo, 100);
Ciao, facendo così mi da l'errore di incompatibilità del tipo "puntatore"
con "HWND" quindi ho fatto un'altra prova facendo così:
.....
 h := findwindow('NOME DELLA CLASSE APPLICAZIONE',NIL);
 j :=  findwindow('NOME DELLA CLASSE CHILD',NIL);
 h:= findwindowex(h, j, 'NOME DELLA CLASSE CHILD', NIL);
getWindowText(h, Testo, 100);
...........
(in pratica come facevo prima ma rilasciando il valore di Findwindow in 2
variabili separate)
Funziona, ma il testo che mi riporta è diverso da quello riportato da
Winsight come è possibile?
Poi una cosa stranissima che non mi spiego è che se rifaccio come avevo
fatto prima e cioè
..........
h := findwindowex(findwindow('NOME DELLA CLASSE
APPLICAZIONE',NIL),findwindow('NOME DELLA CLASSE CHILD',NIL), 'NOME DELLA
CLASSE CHILD', nil);
getWindowText(h, Testo, 100);
...........
mi rilascia una stringa incomprensibile (caratteri ASCII casuali mi sembra)
mentre prima non mi riportava niente. Cosa succede? Non è uguale?
Non vorrei che alla fine facessi un'applicazione instabile...
Uso delphi 6 su Win 98.
Grazie per l'aiuto!

 
Dall'SDK risulta che GetWindowText legge il testo della barra del
titolo
di una window, se c'č; quindi non rileva sicuramente il contenuto
evidenziato di una griglia. Mi sa che non puoi accedere a tale
contenuto, se non facendo
Ctrl+C sull'altra applicazione e andando poi a leggere la Clipboard
dalla tua.
Inoltre potrebbero esserci piů oggetti appartenenti alla stessa
classe; quale
di essi la FindWindowEx ti rileva?
Ciao.

 di essi la FindWindowEx ti rileva?
Ciao, è vero, in pratica non sapendo come fare e dato che dall'aplicazione
il testo della cella selezionata è riportato anche nella status bar, ho
preferito prendere come classe quest'ultima, pensando fosse più semplice ma
il testo riportato da winsight(che in pratica è quello che seleziono nella
grid) è diverso da quello che prelevo con Getwindowtext (adesso so
perchè...).
Quale api mi permette di recuperare il testo della statusbar come fa
winsight o dalla grid (che forse sarebbe piu ovvio)?
Non ho ben capito come usare il CTRL+C, devo simularlo sull'applicazione con
un postmessage? e cosa ottengo?
Ringraziando per l'aiuto attendo risposte

 Ciao, a tutti
Scusa, devo postare con Google che non riporta ancora il 3° 
e il 4° step del thread, quindi rispondo dal 1°.
Lascia perdere il Ctrl+C (che doveva essere fatto dall'altra
applicazione e poi dalla tua leggere la Clipboard tramite opportuna API...)
Cercando di aiutarti, ho imparato qualcosa anch'io...
Se vai sull'SDK di Windows e cerchi Status Windows, trovi 
la trattazione per le Status Bar...
In pratica, tramite una
SendMessage(StatusBarHandle,SB_GETPARTS,1,0{o nil}) ti fai restituire
in quanti pannelli è suddivisa la Barra di Stato.
 Quindi
SendMessage(StatusBarHandle,SB_GETTEXT,n,buffer) 
ti restituisce in buffer il testo che vedi nel pannello che vuoi leggere
e il cui numero è n (i pannelli sono numerati a partire da 0).
Non l'ho provato, ma dovrebbe funzionare...
Ciao, e buona continuazione di Pasqua.

 Ciao, e buona continuazione di Pasqua.
Grazie, anche a te!
E grazie ancora per la tua pazienza!

Funziona!!! Avevo dimenticato di inserire la unit "commctrl"...
Ciao e grazie!!