elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  alert WebBrowser bloquea programa, tengo dos posibles soluciones
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: alert WebBrowser bloquea programa, tengo dos posibles soluciones  (Leído 4,397 veces)
dmgdani

Desconectado Desconectado

Mensajes: 29



Ver Perfil
alert WebBrowser bloquea programa, tengo dos posibles soluciones
« en: 31 Julio 2014, 22:26 pm »

Hola a todos
tengo un programa que coge unos datos de un WebBrowser pero este salta una alerta  y deja bloqueado el programa hasta que no se da aceptar.

bien yo desde un programa aparte con el siguiente codigo detecto el Hwnd o de la ventana o del boton y le mando un mensaje para cerrarlo.
como el programa se queda bloqueado pues no se puede ejecutar el código o yo no se como ejecutarlo si se puede ejecutar de alguna manera seria lo mejor.
pense en los hook que detecte cuando se ejecuto el cuadro de dialogo y ejecute el codigo para cerrarle.

Código:
Private Declare Function FindWindow _
    Lib "user32" _
    Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
 
 
Private Declare Function GetClassName _
    Lib "user32" _
    Alias "GetClassNameA" ( _
        ByVal hwnd As Long, _
        ByVal lpClassName As String, _
        ByVal nMaxCount As Long) As Long
 
Private Declare Function GetParent _
    Lib "user32" ( _
        ByVal hwnd As Long) As Long
 
Private Declare Function GetWindowText _
    Lib "user32" _
    Alias "GetWindowTextA" ( _
        ByVal hwnd As Long, _
        ByVal lpString As String, _
        ByVal cch As Long) As Long
 
' Retorna la cantidad de caracteres del caption de la ventana
Private Declare Function GetWindowTextLength _
    Lib "user32" _
    Alias "GetWindowTextLengthA" ( _
        ByVal hwnd As Long) As Long
 
   
 
 
 
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, LParam As Any) As Long

Private Declare Function SendMessage_Long Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef LParam As Long) As Long

'Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Const BM_CLICK = &HF5&

Private Const WM_KEYUP = &H101
Private Const WM_KEYDOWN = &H100
Private Const WM_SYSKEYDOWN = &H104
Private Const WM_CHAR = &H102
Private Const WM_CLOSE = &H10
Private Const WM_QUIT = &H12


Private Const WM_LBUTTONDOWN  As Long = &H201
Private Const WM_LBUTTONUP    As Long = &H202
Private Const VK_SPACE    As Long = &H20
Private Const VK_ESCAPE    As Long = &H1B



Private Sub Command2_Click()
  Dim Ret As Long, Handle As Long, hParent
  Dim Buffer As String
  Dim ClassName As String
  Dim Caption_Ventana As String
  Dim bwnd As Long, ChildRet As Long
  Dim strBuff As String, ButCap As String

 
    Handle = FindWindow("#32770", vbNullString)
    If Handle <> 0 Then
'        SendMessage Handle, WM_CLOSE, 0, 0
   
        hParent = GetParent(Handle)
    '    MsgBox hParent
        ClassName = Space$(128)
        'Recupera el Classname y lo devuelve en el Buffer
        Ret = GetClassName(Handle, ClassName, 128)
         
        'Extraemos el nombre de la clase
        ClassName = LCase(Left$(ClassName, Ret))
         
        ' Cantidad de caracteres del texto
        Caption_Ventana = String(GetWindowTextLength(Handle), Chr$(0))
        'Retorna el caption
        Call GetWindowText(Handle, Caption_Ventana, 100)
   
        ChildRet = FindWindowEx(Handle, ByVal 0&, "Button", vbNullString)
        If ChildRet <> 0 Then
            strBuff = String(GetWindowTextLength(ChildRet) + 1, Chr$(0))
            GetWindowText ChildRet, strBuff, Len(strBuff)
            ButCap = strBuff
            Do While ChildRet <> 0
                '~~> Check if the caption has the word "Open"
                '~~> For "Save" or "Cancel", replace "Open" with
                '~~> "Save" or "Cancel"
    '            MsgBox ButCap
                If InStr(1, ButCap, "Aceptar") Then
                    '~~> If this is the button we are looking for then exit
                    OpenRet = ChildRet
                    Exit Do
                End If
       
                '~~> Get the handle of the next child window
                ChildRet = FindWindowEx(Ret, ChildRet, "Button", vbNullString)
                '~~> Get the caption of the child window
                strBuff = String(GetWindowTextLength(ChildRet) + 1, Chr$(0))
                GetWindowText ChildRet, strBuff, Len(strBuff)
                ButCap = strBuff
            Loop
            If OpenRet <> 0 Then
    '            MsgBox "The Handle of Open Button is : " & OpenRet
                WindowAPI_Click (OpenRet)
            Else
    '            MsgBox "The Handle of Open Button was not found"
            End If
           
           
        Else
    '        MsgBox "Child Window Not Found"
        End If
    End If
    Me.Cls
    Me.Print " Hwnd : " & Handle
    Me.Print " Hwnd Parent : " & hParent
    Me.Print " Nombre de clase : " & ClassName
    Me.Print " Caption de la ventana : " & Caption_Ventana
End Sub
Public Sub WindowAPI_Click(ByVal hwnd As Long)
Dim retVal As Long
retVal = SendMessage_Long(hwnd, WM_LBUTTONDOWN, 0&, ByVal 0&)
retVal = SendMessage_Long(hwnd, WM_LBUTTONDOWN, 0&, ByVal 0&)
retVal = SendMessage_Long(hwnd, WM_KEYUP, VK_SPACE, ByVal 0&)
retVal = SendMessage_Long(hwnd, WM_LBUTTONUP, 0&, ByVal 0&)
End Sub




esto ya es opcional cual es la manera mas optima de detectar los botones ya que no en todas las paginas tienen los mismos nombres ni formato y si esta en otro idioma no lo detecta

un saludo


En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: alert WebBrowser bloquea programa, tengo dos posibles soluciones
« Respuesta #1 en: 1 Agosto 2014, 23:46 pm »

Hola mira este metodo, se trata de escribir funciones con el mismo nombre (alert, confirm, prompt) entonces  javascript en vez de ejectuar las funciones propias ejecutas las que escribimos nosotros y estas no hacen nada.

Código:
Option Explicit

Private Sub Form_Load()
WebBrowser1.Navigate2 "http://www.efectosjavascript.com/alerta.html"
End Sub

Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
    With WebBrowser1.Document.parentWindow
        .execScript "window.alert = function () { };", "JScript"
        .execScript "window.confirm = function () { };", "JScript"
        .execScript "window.prompt = function () { };", "JScript"
    End With
End Sub



En línea

dmgdani

Desconectado Desconectado

Mensajes: 29



Ver Perfil
Re: alert WebBrowser bloquea programa, tengo dos posibles soluciones
« Respuesta #2 en: 2 Agosto 2014, 02:36 am »

Hola leandro
lo siento pero eso no funciona mira te pongo un ejemplo prueba lo en la siguiente web es de prueba para que salga un mensaje en el cuadro de la derecha escribe cualquier cosa rara "asfaads" y dale check deberia salir una alert pero con tu codigo si sale ya lo vi en internet y lo busque de esa manera para poder anular lo por codigo pero no es una pagina de ejemplo eee no se ni de que va ni me pare a mirar.

Código:
como puedes ver probé poniéndolo en distintos sitios
Private Sub Form_Load()
WebBrowser1.Silent = True
WebBrowser1.Navigate ("http://wordswithfriends.net/"), 4
End Sub


Private Sub Timer1_Timer()
WebBrowser1.Silent = True
End Sub

Private Sub WebBrowser1_DownloadComplete()
    With WebBrowser1.Document.parentWindow
        .execScript "window.alert = function () { };", "JScript"
        .execScript "window.confirm = function () { };", "JScript"
        .execScript "window.prompt = function () { };", "JScript"
    End With
End Sub

Private Sub WebBrowser1_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
    With WebBrowser1.Document.parentWindow
        .execScript "window.alert = function () { };", "JScript"
        .execScript "window.confirm = function () { };", "JScript"
        .execScript "window.prompt = function () { };", "JScript"
    End With
End Sub



No habría alguna otra forma como la que comente de algún hook del sistema que lo llame cuando se ejecute
por que la única solución que hasta hora vi fue tener otro exe ejecutando ese código todo el rato y asi cerrarlo pero no es la solución correcta y acumularía mucha basura

por cierto hay alguna otra opción al webbroser ya que muchas veces lo detecta el antivirus vi algo para vb.net pero no me decanto mucho yo soy vb6 a muerte.


muchas gracias por responder y me gusta mucho el foro de tu pagina
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: alert WebBrowser bloquea programa, tengo dos posibles soluciones
« Respuesta #3 en: 2 Agosto 2014, 20:24 pm »

Hola, si tenes razón, eso es porque el código se ejecuta dentro de un iframe, entonces no interfiere en su javascript, y tampoco se puede acceder a su código de fuente, asi si por el momento lo único que se me ocurre es hook, te paso un ejemplo, funcionando, lo unico se escucha el beep, y no encontre alguna mejor forma de filtrar si es un msgbox o no, y digo esto porque cualquier ventana que se llame   "#32770" la va a cerrar, el unico filtro fue pedir que sea una ventana hija al formulario que contiene el webbrowser, cualquier cosa se lo sacas si vas a usar mas de un webbrowser en distintos form.

Modulo bas:
Código
  1. Option Explicit
  2. Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  3. Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
  4. Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  5. Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
  6. Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
  7. Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  8. Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
  9.  
  10. Private Type CWPSTRUCT
  11.    lParam As Long
  12.    wParam As Long
  13.    message As Long
  14.    hwnd As Long
  15. End Type
  16.  
  17. Private Const HC_ACTION As Long = 0
  18. Private Const GWL_HWNDPARENT As Long = -8
  19. Private Const GWL_WNDPROC = (-4)
  20. Private Const WH_CALLWNDPROC = 4
  21. Private Const WM_CREATE = &H1
  22.  
  23. Private hHook As Long
  24. Private m_Parent As Long
  25.  
  26. Public Function HookProc(ByVal uCode As Long, ByVal wParam As Long, lParam As CWPSTRUCT) As Long
  27.  
  28.    HookProc = CallNextHookEx(hHook, uCode, wParam, lParam)
  29.  
  30.    If uCode = HC_ACTION Then
  31.        If lParam.message = WM_CREATE Then
  32.            If GetWinClassName(lParam.hwnd) = "#32770" And GetWindowLong(lParam.hwnd, GWL_HWNDPARENT) = m_Parent Then
  33.               DestroyWindow lParam.hwnd
  34.            End If
  35.        End If
  36.    End If
  37.  
  38. End Function
  39.  
  40. Public Sub EndHooking()
  41.    If hHook <> 0 Then
  42.        UnhookWindowsHookEx hHook
  43.        hHook = 0
  44.    End If
  45. End Sub
  46.  
  47. Public Sub StartHooking(ByVal hwndParent As Long)
  48.    m_Parent = hwndParent
  49.    hHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf HookProc, 0, App.ThreadID)
  50. End Sub
  51.  
  52. Public Function GetWinClassName(hwnd As Long) As String
  53.    Dim sClass As String, ret&
  54.    sClass = Space$(128)
  55.    ret = GetClassName(hwnd, ByVal sClass, 128)
  56.    GetWinClassName = Left$(sClass, ret)
  57. End Function
  58.  

Formulario inicial.
Código
  1. Option Explicit
  2.  
  3. Private Sub Form_Load()
  4.    StartHooking Me.hwnd
  5.    WebBrowser1.Silent = True
  6.    WebBrowser1.Navigate2 ("http://wordswithfriends.net/"), 4
  7. End Sub
  8.  
  9. Private Sub Form_Unload(Cancel As Integer)
  10.    EndHooking
  11. End Sub
  12.  



En línea

dmgdani

Desconectado Desconectado

Mensajes: 29



Ver Perfil
Re: alert WebBrowser bloquea programa, tengo dos posibles soluciones
« Respuesta #4 en: 3 Agosto 2014, 03:01 am »

muchas gracias leandro funciona perfecto
lo que no se es a que te refieres con lo de que podria cerrar otras porque yo echo pruebas y no cierra ninguna solo las del webbroser.
de todos modos e intentado probar para que segun el hwnd me devuelva el exe y asi compararlo mas que nada por seguridad por lo que dijiste pero no se como implementarlo por ahora tengo esto.

Código:
Private Declare Function GetWindowModuleFileName Lib "user32.dll" (ByVal hwnd As Long, ByVal pszFileName As String, ByVal cchFileNameMax As Long) As Long


Public Function GetWinname(hwnd As Long) As String
    Dim sClass As String, ret&
    sClass = Space$(225)
    ret = GetWindowModuleFileName(hwnd, sClass, Len(sClass))
    GetWinname = Left$(sClass, ret)
    Form1.Label.Caption = GetWinname
End Function

sabrías lo del antivirus alguna otra opción probé con control de firefox pero no me va muy bien.


un saludo y muchas gracias eres buenisimo
En línea

LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: alert WebBrowser bloquea programa, tengo dos posibles soluciones
« Respuesta #5 en: 3 Agosto 2014, 06:39 am »

Hola, no no es necesario comprobar lo del ejecutable, porque el hook es solo para la instancia de la aplicación por lo tanto no destruiría una ventana que no cree la aplicacion.
por lo de los filtros no se cual es tu fin de todo esto, pero si hay un par de ventanas llamadas  con el mismo nombre, fijate que si haces click derecho en el webbrowser y selecionas imprimir o propiedades tambien te cierra esas ventanas pero dudo que a vos te importe eso ya que parece que estas haciendo algun tipo de automatizacion.

lo que preguntas del antivirus, mira, yo creo que deve ser otra cosa, seguramente es porque guardas la url en un string y el el AV lo detecta como una amenaza, si ese fuera el caso vastaria con una encriptacion o cocatenacion de la url.

si aun asi el problema sigue podes intentar crear el control webbrowser por codigo, es decir sin poner la referencia de Microsof internet controls.
un ejemplo para que te orientes.

Código
  1. Option Explicit
  2. Private WithEvents WebBrowser1 As VBControlExtender
  3.  
  4. Private Sub Form_Load()
  5.    Set WebBrowser1 = Me.Controls.Add("Shell.Explorer.2", "MiWebBrowser", Me)
  6.    With WebBrowser1
  7.        .Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
  8.        .Visible = True
  9.        'Utilizar ".object" para acceder a las propiedades propias del webbrowser.
  10.        .object.Silent = True
  11.        .object.Navigate2 ("http://wordswithfriends.net/")
  12.    End With
  13. End Sub
  14.  
  15. Private Sub Form_Unload(Cancel As Integer)
  16.    Me.Controls.Remove "MiWebBrowser"
  17. End Sub
  18.  
  19. Private Sub WebBrowser1_ObjectEvent(Info As EventInfo)
  20.  
  21.    Select Case Info.Name
  22.  
  23.        Case "NavigateComplete2"
  24.  
  25.  
  26.        Case "DocumentComplete"
  27.  
  28.  
  29.        Case "TitleChange"
  30.            Debug.Print Info.EventParameters(0)
  31.  
  32.        Case "NewWindow2"
  33.            'Cancela que se abra otra ventana(PopUp).
  34.            'Info.EventParameters(1) = True
  35.  
  36.        Case "NavigateError"
  37.            Debug.Print Info.EventParameters(3)
  38.    End Select
  39. End Sub
  40.  
En línea

dmgdani

Desconectado Desconectado

Mensajes: 29



Ver Perfil
Re: alert WebBrowser bloquea programa, tengo dos posibles soluciones
« Respuesta #6 en: 3 Agosto 2014, 15:12 pm »

muchas gracias
según leí hace mucho algunos antivirus detectan al webbroser por que actualiza automáticamente y entonces la heuristica lo detecta o algo así era.

lo de crear el control lo estoy mirando detenidamente ya que es algo mas complicado manejare pero parece muy buena opción.

lo que me decías del sonido del beep se me ocurrió que se podría silenciar todo el programa ya que no va a usar sonido pero por mas que busco solo e visto que se puede silenciar el volumen general.en la versión de windows 7 o vista creo implementaron lo del mezclador de sonidos en el que puedes elegir que programa silenciar pero parece que no han echo ninguna api para esa función.

un saludo muchas gracias
creo que me ire a tu foro que me gusta mas
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines