Newsgroup: it.comp.programmare.win32
Titolo: Leggere il contenuto di un message box

Salve a tutti.
Avrei la necessità di rilevare le finestrelle con gli errori di runtime
di processi che non hanno finestre (girano in background).
Ho fatto delle prove con FindWindow(NULL,"Nome"),
col quale riesco a vedere se esiste una finestra con quel nome,
anche se dipende dal tipod i finstra.
ad esempio non riesco a rilevare iun messaggio mandato con net send.
Inoltre non ho la possibilità di generare errori di runtime
(meglio: non so come si fa, xkè controllo processi in vb, non scritti da me,
con un programma scritto, da me, in C).
In definitiva a me servirebbe:
Trovare le finestrelle con gli errori di run time,
leggerne il contenuto per poterlo scrivere su un file,
e poi chiudere il processo (per questo non ho problemi).
Spero di essere stato chiaro.
Grazie.
    bye ;-)

 con un programma scritto, da me, in C).
Mi correggo...
Mi sono fatto fare un programma che crea un errore di runtime da un mio
amico...
Ora con findwindow riesco a trovare quella finestrella,
ma come faccio a leggerne il contenuto?
Grazie ancora

 ha scritto nel messaggio
news:c97a5p$i9r$1...@lacerta.tiscalinet.it...

Vediamo...
Una volta che hai l'handle alla finestra con la FindWindow
CWnd hCapturedWnd;
hCapturedWnd.m_hWnd = ::FindWindow(NULL, _T("Titolo Finestra"));
puoi utilizzare la funzione EnumChildWindows.
Questa funzione accetta tre parametri:
l'handle della finestra di cui devi enumerare i controlli, un puntatore a
funzione (e questa funzione verrà richiamata una volta per ogni controllo
presente sulla finestra), e un valore LPARAM che (ma su questo veramente non
sono sicuro) può utilizzare per passare informazioni alla funzione (ma che
secondo me invece non serve a un c... :-)
Comunque:
LPARAM mylParam = 0;
:.EnumChildWindows(hWndMain.m_hWnd, EnumChildProc, mylParam);
dove EnumChildProc è il puntatore a funzione; questa è una funzione definita
dal programmatore, con il prototipo seguente.
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam);
Il primo parametro è l'handle del controllo contenuto nella finestra che in
questo momento è trattato. Verranno ciclati tutti. Il secondo parametro è
quello famoso di prima.
Lo sviluppo di tale funzione, nel tuo caso, potrebbe esser qualcosa del
genere:
BOOL CALLBACK EnumChildProcToolbar(HWND hwnd, LPARAM lParam)
{
    CString strStringa;
     TCHAR szClass[MAX_PATH] = { 0 };  // Conterrà il nome della classe
della finestra presa in considerazione
     GetClassName(hwnd, szClass, MAX_PATH);  // Ottiene il nome della classe
della finestra correntemente analizzata
     if(!lstrcmpi(szClass, __TEXT("Static"))) {  // Credo che il testo che a
te interessa sia in un controllo Static (comunque puoi fare delle prove, al
limite prova Edit)
        // A questo punto puoi ottenere il tuo testo
        ::GetWindowText(hwnd, strStringa, 1024);
  return FALSE;  // Se restuituisce FALSE l'enumerazione delle finestre
figlio termina
 }
 return TRUE;  // Se restuituisce TRUE l'enumerazione delle finestre figlio
continua
}
Ciao ciao

 ha scritto nel messaggio
news:c97a5p$i9r$1...@lacerta.tiscalinet.it...

Puoi provare a prendere l'handle della static con GetDlgItem(handleMsgBox,
0xFFFF)
0xFFFF è l'id control della static.
Ciao.

 ha scritto nel messaggio
news:c97a5p$i9r$1...@lacerta.tiscalinet.it...



Newsgroups: it.comp.programmare.win32
Sent: Friday, May 28, 2004 9:18 PM
Subject: Re: Leggere il contenuto di un message box
[cut]
ecco il codice:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
{
    int len=2048;//GetWindowTextLength(hWnd);
    TCHAR szClass[MAX_PATH] = { 0 };  // Conterrà il nome della classe della
finestra presa in considerazione
     GetClassName(hwnd, szClass, MAX_PATH);  // Ottiene il nome della classe
della finestra correntemente analizzata
     printf("classe: %s \n",szClass);
     //trovo due classi: Button e Static
     if(!lstrcmpi(szClass, __TEXT("Static"))) {
       char *testo = (char *)calloc(len+2,sizeof(char));
       GetWindowText(
          hwnd,
          testo,
          len
        );
        printf("Classe Static: %s \n",testo); //NON SCRIVE NULLA
        free (testo);
  return FALSE;
  // Se restuituisce FALSE l'enumerazione delle finestre figlio termina
 }
 return TRUE;  // Se restuituisce TRUE l'enumerazione delle finestre figlio
continua
}
int main(int argc, char *argv[])
{
  HWND hWnd;
  char *testo;
  int len=0;
  BOOL pop;
  LRESULT result;
  PDWORD_PTR lpdwResult;
  LPARAM mylParam = 0;
  hWnd = FindWindow(NULL,"prova2conn");
  if (hWnd == 0)
   printf("Cannot find window!\r\n");
  else {
   printf("Window found.\r\n");
   len=2048;//GetWindowTextLength(hWnd);
   testo = (char *)calloc(len+2,sizeof(char));
   GetWindowText(
      hWnd,
      testo,
      len
    );
    printf("testo: %s \n",testo); //riscrive il titolo della finestra
    EnumChildWindows(hWnd, EnumChildProc, mylParam);
  }
  free(testo);
  system("PAUSE");
  return 0;
}
Il problema è che non stampa nulla per la classe Static.
Come posso fare? dove sbaglio?
Grazie ancora...

"svetj" <sve...@SPAMtiscali.it> ha scritto nel messaggio
news:haiuc.367576$rM4.15...@news4.tin.it...

Io ho fatto una prova. Sembra funzionare tutto, però ho visto che a volte
gli static su una finestra di messaggio possono esser più di quanti
sembrano. Nel senso che alcuni possono non esser visibili.
Nella EnumChildProc (quella definita da te) prova a togliere il return FALSE
dopo aver trovato la prima Static. In questo modo l'enumerazione va avanti.
Seguendo poi l'enumerazione in debug dovresti trovare la tua static.
Ciao ciao

 ha scritto nel messaggio
news:FQsuc.371363$rM4.15...@news4.tin.it...

è proprio come hai detto tu: proseguendo ho trovato la classe col messggio
che mi interessa.
a questo punto per scegliere è sufficiente fare un controllo con
GetWindowTextLength:
se è maggiore di 0 la prendo...
Molte grazie Etrusco: mi hai aiutato tantissimo!!!
bye ;-)

 
<stracut>
E magari se tu riuscissi a fare qualche cut ai messaggi quando rispondi...
-- 
"- in Italia cosa rischia uno che tortura?
- ..Se è una tortura e via, poco.. Se ha anche scaricato musica da 
Internet, quattro anni"
Sergio Staino (Bobo e figlia, maggio 2004)

[cut]
visto che ho già tagliato altri messaggi, è evidente che mi son
dimenticato..
veramente scarsa flessibilità...
comunque lo terrò presente.
ciao.

 se è maggiore di 0 la prendo...
in effetti è rimasto un problema, di cui non mi viene in mente la suluzione:
dovrei restituire il testo della finestra alla funzione main, ma come
faccio?
purtroppo ho visto che non posso cambiare i parametri di EnumChildWindows.
Forse l'unica soluzione è scrivere il testo in un file temporaneo e
prenderselo poi col main..
Se poi arrivano altre idee...
bye ;-)

 testo in un file temporaneo e prenderselo poi col main..
Qualcosa del genere:
BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam)
{
    ...
    /// read the text in a buffer pointed to by lpBuf
    *(LPTSTR *)lParam = lpBuf;
    ...
}
...
LPTSTR lpText;
EnumChildWindows(hWnd,MyEnumChildProc,(LPARAM)&lpText);
/// free lpText if necessary
...
-- 
/**
 * Alessandro Angeli
 *
 * MVP :: Digital Media
 */

 ha scritto nel messaggio
news:c9fbv3$c27$1...@lacerta.tiscalinet.it...

Bhe, per questo "problema" credo che puoi cavartela molto semplicemente
dichiaramdo l'array per il testo a livello globale. Certo, è meglio evitare
dichiarazioni globali, ma visto che la possibilità c'è, non vedo perché devi
appesantire il programma con una scrittura/lettura su disco.
Ciao