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 - [c#] Intercettare MessageBox e simili
Forum - C# / VB.NET - [c#] Intercettare MessageBox e simili

Avatar
Ralf00 (Normal User)
Newbie


Messaggi: 4
Iscritto: 06/03/2009

Segnala al moderatore
Postato alle 8:49
Sabato, 16/05/2009
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:


Codice sorgente - presumibilmente C#

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


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

PM Quote
Avatar
Ralf00 (Normal User)
Newbie


Messaggi: 4
Iscritto: 06/03/2009

Segnala al moderatore
Postato alle 16:20
Sabato, 16/05/2009
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

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 17:48
Sabato, 16/05/2009
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...

PM Quote
Avatar
Ralf00 (Normal User)
Newbie


Messaggi: 4
Iscritto: 06/03/2009

Segnala al moderatore
Postato alle 18:50
Sabato, 16/05/2009
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..

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:25
Domenica, 17/05/2009
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.
Codice sorgente - presumibilmente VB.NET

  1. Public Function GetWebPage(ByVal Query As String) As String
  2.         Try
  3.             Dim Request As Net.WebRequest = Net.WebRequest.Create(Query)
  4.             Dim Response As Net.WebResponse = Request.GetResponse()
  5.             Dim Reader As New IO.StreamReader(Response.GetResponseStream())
  6.             Dim ResultPage As New System.Text.StringBuilder()
  7.  
  8.             Do While Not Reader.EndOfStream
  9.                 ResultPage.AppendLine(Reader.ReadLine)
  10.             Loop
  11.             Reader.Close()
  12.  
  13.             Return ResultPage.ToString
  14.         Catch Ex As Exception
  15.             Return ""
  16.         End Try
  17.     End Function


PM Quote
Avatar
Ralf00 (Normal User)
Newbie


Messaggi: 4
Iscritto: 06/03/2009

Segnala al moderatore
Postato alle 18:04
Lunedý, 18/05/2009
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.

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 18:08
Lunedý, 18/05/2009
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.

PM Quote