Oppure

Loading
16/05/09 6:49
Ralf00
Salve a tutti, ho il seguente problema:

Ho un progetto in C# dove utilizzo prevalentemente la classe WebBrowser per avere una navigazione sul web nel mio programma e "controllarne" un po le operazioni.

Ho la seguente necessità: devo visitare una pagina che dopo 60 secondi genera tramite javascript due MessageBox, la prima è lanciata col comando "confirm()" che mi fa scegliere tra OK e ANNULLA e la seconda è un semplice alert con solo il tasto OK.

Il mio problema è che devo riuscire a rispondere in automatico OK a entrambe senza dover clickare manualmente su di esse ma tramite il mio programma C#.

Ho pensato a 2 possibili soluzioni:

1) Sfruttare l'evento DocumentComplete quando ha finito di caricare il dom della pagina, trovare nel codice html il javascript e rimuovere col controllo sule stringhe i comandi alert(blablabla) e confirm(blablabla).

Bhe ci ho provato il risultato è che quando viene generato l'evento riesco a ottenere tutto il codice html ma quando cerco di rimuovere parte della stringa probabilmente lancia un eccezione che però gestisce già da solo e l'esecuzione continua come se niente avessi fatto, generando quindi le due messagebox dopo 1 minuto circa.

2) Intercettare il lancio dei MessageBox e automaticamente chiuderli con OK.

Allora non essendo molto ferrato ho googlato un po e son arrivato a un codice che mi consigliava di adottare una soluzione tipo questa:


    [DllImport("user32.dll")]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
IntPtr findMessageBox(IntPtr hwndParent) 
{
       IntPtr hwndMB = FindWindowEx(hwndParent, IntPtr.Zero, "#32770", null);
       return hwndMB;
}

Da un altro punto del codice chiamo ogni secondo il metodo findMessageBox fino a che non ottengo un valore != IntPtr.Zero e quindi dovrebbe contere l'handle che cerco (hwndParent è l'handle del mio processo).
Il problema è che non ottengo niente passano i secondi la messagebox si apre e col mettendo un breakpoint nel caso in cui il codice trovasse una messagebox aperta non ho alcuna interruzione perchè non accade mai.

Qualcuno sa aiutarmi a risolvere il problema? Spero che qualcuno mi possa aiutare.

Grazie in anticipo
aaa
16/05/09 14:20
Ralf00
Allora tramite la 2° strada son riuscito a ottenere l'handle della messagebox che mi appare. Ora ho un nuovo problema che non è più di programmazione ma è inerente alle Windows API.

Col metodo PostMessage posso chiudere la mia MessageBox solo che avendo io una messagebox di tipo OK/Cancel se uso PostMessage(handle,WM_Close,null,null) il programma assume che io abbia premuto "Cancel", io invece devo far in modo che si chiuda come se avessi premuto OK.

Qualcuno sa aiutarmi? Ho provato a leggere documentazione sulle api ma non ho trovato ciò che cerco.

Grazie in anticipo
aaa
16/05/09 15:48
Il Totem
Davvero laboriosa come soluzione. Presumo che tu abbia già provato a cercare un WM_OK (io non ho trovato il valore di questa costante). Ma mi domando perchè il primo metodo non abbia funzionato: nel caricare la pagina col nuovo sorgente non avrebbe dovuto eseguirlo...
aaa
16/05/09 16:50
Ralf00
il problema è che quando becca l'evento documentcomplete il browser ha già caricato l'html e se cerco di modificarlo (anche mettendo il breakpoint e farlo passo passo in visual studio) va in eccezione e lascia tutto inalterato. Per caso sai dove posso trovare i valori delle varie costanti? non riesco a trovare un riferimento con i valori delle varie costanti..
aaa
17/05/09 16:25
Il Totem
Di solito sono tutte documentate su msdn, ma non ne ho trovate.

Perchè non provi ad ottenere la pagina senza usare il web browser? In questo modo non c'è alcun problema perchè il codice non viene caricato.
    Public Function GetWebPage(ByVal Query As String) As String
        Try
            Dim Request As Net.WebRequest = Net.WebRequest.Create(Query)
            Dim Response As Net.WebResponse = Request.GetResponse()
            Dim Reader As New IO.StreamReader(Response.GetResponseStream())
            Dim ResultPage As New System.Text.StringBuilder()

            Do While Not Reader.EndOfStream
                ResultPage.AppendLine(Reader.ReadLine)
            Loop
            Reader.Close()

            Return ResultPage.ToString
        Catch Ex As Exception
            Return ""
        End Try
    End Function
aaa
18/05/09 16:04
Ralf00
Ti ringrazio per l'aiuto ma alla fine ho risolto seguendo la seconda strada attraverso le API di windows.

Purtroppo avevo la necessità di usare il browser perchè la pagina html mi serviva mostrarla graficamente e anche il resto del javascript avrebbe dovuto funzionare.

Grazie comunque.
aaa
18/05/09 16:08
Il Totem
Ok, ma il mio suggerimento era di scaricare la pagina, modificarla, e poi caricarla nel webbrowser. Certo che non sarebbe servito a niente ottenerne il codice e basta, forse mi hai frainteso.
aaa