Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#3961
Windows / Re: encontrar ie8 para w7 de 32bit
27 Enero 2016, 00:35 AM
Si no pudieras hacer lo que se menciona en el artículo enlazado por el compañero @Simorg, se supone que desde aquí lo podrías descargar directamente:

( no puedo comprobarlo por mi versión superior de Windows, aunque de todas formas entre las opciones de descarga no parece que sea posible descargarlo para Windows 7... )

saludos
#3963
Si esos valores son decimales, ¿por qué intentas utilizar un datatype para números enteros?.

Utiliza Single o Double según la capacidad que necesites.


PD: La capacidad que has mencionado hace referencia al datatype Long de VB.Net, no al de VB6.

Saludos!
#3964
Cita de: Yaldabaot en 26 Enero 2016, 22:53 PMtiene varios try catch cuando no se realiza algún paso y si a la hora de realizarse ese paso no se efectuó porque no saltó el try catch?.

¿Tal vez no estés controlando la excepción correcta?, asegurate de estar controlando la clase base (System.Exception) para todas las excepciones.

De todas formas, que exista un error en un algoritmo propio o en un miembro built-in de .Net Framework no significa que dicho error deba generar una excepción (a menos que así esté controlado en el código fuente del miembro en cuestión), sea como fuere si no muestras el código relevante entonces no se como esperas que te podamos ofrecer ayuda, si no puedes mostrar un código por que desconoces donde podría estar el error entonces aparte de que lo intentes depurar por ti mismo no creo que se te pueda ofrecer mejor ayuda en este caso, pero te sugiero que implementes un sistema de reporte de bugs en tu aplicación para que cuando al cliente le salte una excepción, se te notifique de los detalles del error via email (por ejemplo) obteniendo la info de dicha excepción y los valores actuales del programa en ese momento, para que eso te pueda ayudar, en la medida de lo posible, a depurar el problema de forma remota.

Saludos!
#3965
¿Sería algo válido representar el segundo webbrowser o "reflejo" como una simple imagen estática o captura del primer webbroser?, o por lo contrario ambos webbrowsers tienen que ser "utilizables"?

Lo primero te ahorraría muchos comecocos de cerebro:



Para dicha metodología puedes tomar como referencia para analizar el código y llevarlo a cabo con las fucniones TakeScreenshotFromRegion o TakeScreenshotFromObject, preferiblemente esta última, ya que la captura mediante regíon pues... es eso, una región del escritorio, donde si superpones ventanas encima del webbrowser éstas se capturarán.

Las funciones las puedes encontrar en el código fuente de mi API ElektroKit:


Código (vbnet) [Seleccionar]
       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Takes a screenshot of a screen region.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <example> This is a code example.
       ''' <code>
       ''' Dim jpgCodec As ImageCodecInfo =
       '''     (From codec As ImageCodecInfo In ImageCodecInfo.GetImageDecoders
       '''      Where codec.FormatID = ImageFormat.Jpeg.Guid).SingleOrDefault
       '''
       ''' Dim encoderParams As New EncoderParameters(1)
       ''' Dim qualityEncoder As Imaging.Encoder = Imaging.Encoder.Quality
       ''' Dim qualityParameter As New EncoderParameter(qualityEncoder, 80)
       ''' encoderParams.Param(0) = qualityParameter
       '''
       ''' Dim screenShot As Image = TakeScreenshotFromRegion(New Point(0, 0), New Size(256, 256), includeMouse:=True)
       ''' screenShot.Save("C:\Screenshot.jpg", jpgCodec, encoderParams)
       ''' Process.Start("C:\Screenshot.jpg")
       ''' </code>
       ''' </example>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="location">
       ''' The X-coordinate is the point at the upper-left corner of the region.
       ''' The Y-coordinate is the point at the upper-left corner of the region.
       ''' </param>
       '''
       ''' <param name="size">
       ''' The size of the area to be transferred.
       ''' </param>
       '''
       ''' <param name="includeMouse">
       ''' If set to <see langword="True"/>, the mouse is drawn in the resulting image.
       ''' </param>
       '''
       ''' <param name="pixelFormat">
       ''' The image pixel format.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <returns>
       ''' The resulting image.
       ''' </returns>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerStepThrough>
       Public Shared Function TakeScreenshotFromRegion(ByVal location As Drawing.Point,
                                                       ByVal size As System.Drawing.Size,
                                                       Optional ByVal includeMouse As Boolean = False,
                                                       Optional ByVal pixelFormat As PixelFormat = PixelFormat.Format24bppRgb) As Image

           Dim bmp As New Bitmap(size.Width, size.Height, pixelFormat)

           Using g As Graphics = Graphics.FromImage(bmp)

               g.InterpolationMode = InterpolationMode.Default
               g.PixelOffsetMode = PixelOffsetMode.Default
               g.CopyFromScreen(location, Drawing.Point.Empty, bmp.Size)

               ' Draw the cursor in the image.
               If includeMouse Then
                   Dim mousePoint As Drawing.Point = Control.MousePosition
                   mousePoint.X -= location.X
                   mousePoint.Y -= location.Y

                   Cursors.Arrow.Draw(g, New Rectangle(mousePoint.X, mousePoint.Y, Cursors.Arrow.Size.Width, Cursors.Arrow.Size.Height))
               End If

           End Using

           Return bmp

       End Function


Código (vbnet) [Seleccionar]
       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Takes a screenshot of an object in the screen.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <example> This is a code example.
       ''' <code>
       ''' Dim jpgCodec As ImageCodecInfo =
       '''     (From codec As ImageCodecInfo In ImageCodecInfo.GetImageDecoders
       '''      Where codec.FormatID = ImageFormat.Jpeg.Guid).SingleOrDefault
       '''
       ''' Dim encoderParams As New EncoderParameters(1)
       ''' Dim qualityEncoder As Imaging.Encoder = Imaging.Encoder.Quality
       ''' Dim qualityParameter As New EncoderParameter(qualityEncoder, 80)
       ''' encoderParams.Param(0) = qualityParameter
       '''
       ''' Dim hwnd As IntPtr = Process.GetProcessesByName("notepad").FirstOrDefault.MainWindowHandle
       '''
       ''' Dim screenShot As Image = TakeScreenshotFromObject(hwnd, includeMouse:=True)
       ''' screenShot.Save("C:\Screenshot.jpg", jpgCodec, encoderParams)
       ''' Process.Start("C:\Screenshot.jpg")
       ''' </code>
       ''' </example>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="hwnd">
       ''' The <see cref="IntPtr"/> window handle to the object.
       ''' </param>
       '''
       ''' <param name="includeMouse">
       ''' If set to <see langword="True"/>, the mouse is drawn in the resulting image.
       ''' </param>
       '''
       ''' <param name="pixelFormat">
       ''' The image pixel format.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <returns>
       ''' The resulting image.
       ''' </returns>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <exception cref="System.ComponentModel.Win32Exception">
       ''' </exception>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerStepThrough>
       Public Shared Function TakeScreenshotFromObject(ByVal hwnd As IntPtr,
                                                       Optional ByVal includeMouse As Boolean = False,
                                                       Optional ByVal pixelFormat As PixelFormat = PixelFormat.Format24bppRgb) As Image

           ' Activate the object window. Don't care about Win32 error code.
           NativeMethods.SetForegroundWindow(hwnd)
           NativeMethods.ShowWindow(hwnd, WindowState.Normal)

           Dim result As Boolean
           Dim win32Err As Integer
           Dim win32rect As Rect
           result = NativeMethods.GetWindowRect(hwnd, win32rect)
           win32Err = Marshal.GetLastWin32Error

           If Not (result) Then
               Throw New Win32Exception([error]:=win32Err)

           Else
               Dim rect As Rectangle = win32rect
               Dim bmp As New Bitmap(rect.Size.Width, rect.Size.Height, pixelFormat)

               Using g As Graphics = Graphics.FromImage(bmp)

                   g.InterpolationMode = InterpolationMode.Default
                   g.PixelOffsetMode = PixelOffsetMode.Default
                   g.CopyFromScreen(rect.Location, New Drawing.Point(0, 0), bmp.Size)

                   ' Draw the cursor in the image.
                   If includeMouse Then
                       Dim mousePoint As Drawing.Point = Control.MousePosition
                       mousePoint.X -= rect.Location.X
                       mousePoint.Y -= rect.Location.Y

                       Cursors.Arrow.Draw(g, New Rectangle(mousePoint.X, mousePoint.Y, Cursors.Arrow.Size.Width, Cursors.Arrow.Size.Height))
                   End If

               End Using

               Return bmp

           End If

       End Function


( los P/Invokes referenciados en el bloque de la función TakeScreenshotFromObject los puedes encontrar en la class NativeMethods del Namespace ElektroKit.Interop.Win32 )

Ejemplo de uso que utilicé para la imagen GIF de arriba:

Código (vbnet) [Seleccionar]
Imports System.Drawing.Drawing2D
Imports System.Drawing.Imaging

Public NotInheritable Class Form1 : Inherits Form

   Dim img As Image

   Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Shown

       Timer1.Interval = 30
       Timer1.Enabled = True

   End Sub

   Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

       If (img IsNot Nothing) Then
           img.Dispose()
       End If

       img = TakeScreenshotFromRegion(Me.PointToScreen(WebBrowser1.Location), WebBrowser1.Size, CheckBox1.Checked)
       PictureBox1.BackgroundImage = img

   End Sub

   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

       WebBrowser1.Navigate(TextBox1.Text)

   End Sub

   Public Shared Function TakeScreenshotFromRegion(ByVal location As Drawing.Point,
                                                   ByVal size As System.Drawing.Size,
                                                   Optional ByVal includeMouse As Boolean = False,
                                                   Optional ByVal pixelFormat As PixelFormat = PixelFormat.Format24bppRgb) As Image

       Dim bmp As New Bitmap(size.Width, size.Height, pixelFormat)

       Using g As Graphics = Graphics.FromImage(bmp)

           g.InterpolationMode = InterpolationMode.Default
           g.PixelOffsetMode = PixelOffsetMode.Default
           g.CopyFromScreen(location, Drawing.Point.Empty, bmp.Size)

           If includeMouse Then
               Dim mousePoint As Drawing.Point = Control.MousePosition
               mousePoint.X -= location.X
               mousePoint.Y -= location.Y

               Cursors.Arrow.Draw(g, New Rectangle(mousePoint.X, mousePoint.Y, Cursors.Arrow.Size.Width, Cursors.Arrow.Size.Height))
           End If

       End Using

       Return bmp

   End Function

End Class


...Pero como ya mencioné, deberías utilziar la otra función, TakeScreenshotFromObject, no es plan de darte hasta el código funcional todo hecho, jeje, así que te animo a hacerlo con la otra función tomando como base ese ejemplo.




Si por lo contrario quieres hacer que ambos webbrowsers sean manejables pues... vas a tener que esforzarte mucho, mucho más.

Se me ocurre que una posible manera sería heredar la Class del WebBrowser y en lugar de instanciar uno, instanciar dos, y empezar a sustituir y overridear todos los métodos base posibles para hacer las mismas llamadas al segundo control instanciado al mismo tiempo que se hace al primero (por ejemplo, sustituir el método Navigate y sus overloads para llamar al método base "Navigate" de ambos webbrowsers a la vez), pero no se muy bien cuan buenos o malos resultados tendría esta metodología sin haberla puesto en práctica, ya que resulta un coñazo hacer eso.

Saludos
#3967
Para evitar la suspensión/bloqueo del equipo puedes utilizar la función SetThreadExecutionState de la WinAPI con la que debes enviar una señal cada cierto tiempo para mentenerlo "despierto".


No puedo ayudarte mucho mostrándote código en Vb6, pero de todas formas creo que estos ejemplos en VB.Net te ayudarán, con lo que encuentres por ti mismo en Google sobre el uso de dicha función en VB6...

P/Invokes:
Código (vbnet) [Seleccionar]
       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Enables an application to inform the system that it is in use,
       ''' thereby preventing the system from entering sleep or turning off the display while the application is running.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <remarks>
       ''' <see href="http://msdn.microsoft.com/es-es/library/windows/desktop/aa373208%28v=vs.85%29.aspx"/>
       ''' </remarks>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="esFlags">
       ''' The thread's execution requirements.
       ''' <para></para>
       ''' This parameter can be one or more of the <see cref="ExecutionState"/> values.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <returns>
       ''' If the function succeeds, the return value is the previous thread's <see cref="ExecutionState"/> value.
       ''' <para></para>
       ''' If the function fails, the return value is <see langword="Nothing"/>.
       ''' </returns>
       ''' ----------------------------------------------------------------------------------------------------
       <DllImport("kernel32.dll", SetLastError:=True)>
       Public Shared Function SetThreadExecutionState(ByVal esFlags As ExecutionState
       ) As ExecutionState
       End Function


Enumeraciones:
Código (vbnet) [Seleccionar]
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Enables an application to inform the system that it is in use,
   ''' thereby preventing the system from entering sleep or turning off the display while the application is running.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' <see href="http://msdn.microsoft.com/es-es/library/windows/desktop/aa373208%28v=vs.85%29.aspx"/>
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   <Flags>
   Public Enum ExecutionState As UInteger

       ''' <summary>
       ''' Any state.
       ''' <para></para>
       ''' Don't use this value.
       ''' This value is used to detect a <see cref="ExecutionState"/> function fail.
       ''' </summary>
       None = &H0UI

       ''' <summary>
       ''' Enables away mode.
       ''' This value must be specified with <see cref="ExecutionState.Continuous"/>.
       ''' <para></para>
       ''' Away mode should be used only by media-recording and media-distribution applications that must
       ''' perform critical background processing on desktop computers while the computer appears to be sleeping.
       ''' <para></para>
       ''' Windows Server 2003: <see cref="ExecutionState.AwaymodeRequired"/> is not supported.
       ''' </summary>
       AwaymodeRequired = &H40UI

       ''' <summary>
       ''' Informs the system that the state being set should remain in effect until the
       ''' next call that uses <see cref="ExecutionState.Continuous"/> and one of the other <see cref="ExecutionState"/> flags is cleared.
       ''' </summary>
       Continuous = &H80000000UI

       ''' <summary>
       ''' Forces the display to be on by resetting the display idle timer.
       ''' <para></para>
       ''' Windows 8: This flag can only keep a display turned on, it can't turn on a display that's currently off.
       ''' </summary>
       DisplayRequired = &H2UI

       ''' <summary>
       ''' Forces the system to be in the working state by resetting the system idle timer.
       ''' </summary>
       SystemRequired = &H1UI

       ''' <summary>
       ''' This value is not supported.
       ''' <para></para>
       ''' If <see cref="ExecutionState.UserPresent"/> is combined with other <see cref="ExecutionState"/> values,
       ''' the call will fail and none of the specified states will be set.
       ''' </summary>
       UserPresent = &H4UI

   End Enum


A la función deberías pasarle los siguientes flags como te muestro en este ejemplo que escribí para Visual Basic.Net:
Código (vbnet) [Seleccionar]
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Sends an Awake signal to prevent the system from turning off the display and entering into Sleep or Hibernation modes.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <remarks>
''' The Awake signal should be sent periodically.
''' </remarks>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' <see langword="True"/> if operation succeeds, <see langword="False"/>  otherwise.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
''' <exception cref="Win32Exception">
''' </exception>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
Public Shared Function SendAwakeSignal() As Boolean

   Dim result As ExecutionState = ExecutionState.None
   Dim win32Err As Integer

   result = NativeMethods.SetThreadExecutionState(ExecutionState.Continuous Or
                                                  ExecutionState.SystemRequired Or
                                                  ExecutionState.DisplayRequired Or
                                                  ExecutionState.AwaymodeRequired)

   win32Err = Marshal.GetLastWin32Error

   If (result = ExecutionState.None) Then
       Throw New Win32Exception([error]:=win32Err)

   Else
       Return True

   End If

End Function


Ten en cuenta que volver a permitir la suspensión es responsabilidad tuya, y lo harías llamando a la misma función Win32.
Ejemplo, en Vb.Net:
Código (vbnet) [Seleccionar]
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Removes any previouslly sent Awake signal.
''' <para></para>
''' Call this function to return to previous state when the caller thread has finished.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' <see langword="True"/> if operation succeeds, <see langword="False"/>  otherwise.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
''' <exception cref="Win32Exception">
''' </exception>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
Public Shared Function RemoveAwakeSignal() As Boolean

   Dim result As ExecutionState = ExecutionState.None
   Dim win32Err As Integer

   result = NativeMethods.SetThreadExecutionState(ExecutionState.Continuous)
   win32Err = Marshal.GetLastWin32Error

   If (result = ExecutionState.None) Then
       Throw New Win32Exception([error]:=win32Err)

   Else
       Return True

   End If

End Function


Un ejemplo de uso de ambas funciones, en Vb.Net:
Código (vbnet) [Seleccionar]
Public Class Form1 : Inherits Form

    Private WithEvents awakeTimer As Threading.Timer
    Private ReadOnly awakeInterval As Integer = 30000 'ms

    Public Sub New()

        Me.InitializeComponent()
        Me.awakeTimer = New Threading.Timer(AddressOf Me.AwakeTimer_Callback, Nothing, Me.awakeInterval, 0)

    End Sub

    Private Sub AwakeTimer_Callback(ByVal stateInfo As Object)

        ' Send periodically an Awake signal to avoid the system entering into Sleep or Hibernation mode.
        Power.SendAwakeSignal()

        If (Me.awakeTimer IsNot Nothing) Then
            Me.awakeTimer.Change(Me.awakeInterval, 0)
        End If

    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) _
    Handles MyBase.FormClosing

        Me.awakeTimer.Dispose()
        Me.awakeTimer = Nothing
        Power.RemovedAwakeSignal()

    End Sub

End Class


Los códigos los saqué de mi API ElektroKit:



Saludos
#3968
¿Visual Basic, o Visual Basic.Net?, sinceramente creo que a lo que realmente te quieres referir es VB.Net, por que VB6 a estas alturas para desarrollar aplicaciones comerciales como que no, sería mucho más aconsejable que utilizases C/C++ o Python como hasta ahora antes de introducirte en un lenguaje como VB6.

Aparte, ¿qué quieres saber exactamente que no puedas encontrar en en los artículos descriptivos de las páginas de la documentación de MSDN (tanto para VB6 o VB.Net) y/o Wikipedia o tablas de comparaciones aleatorias en Gogole?.

Saludos!
#3969
Una opción sería utilizar la versión de WinRAR por linea de comandos (rar.exe/unrar.exe) o 7zip, de esta manera no tendrías problemas de ese tipo.

Saludos
#3970
La configuración Any CPU es el modo "Neutro" de compatibilidad para equipos de 32 y 64 Bits, esto quiere decir que un executable compilado en modo Any CPU se iniciará como un proceso de 64 bits en Windows de 64 Bits, y viceversa en Windows de 32 bits, sin embargo, si se utiliza el modo Any CPU y se tiene referenciado algún ensamblado compilado unicamente en modo de 64 Bits entonces ocurriría un problema en un Windows de 32 Bits al intentar iniciar el executable (mejor dicho al momento de intentar cargar el ensamblado, que no tiene por que ser al inicio).

Pero ese no parece ser tu caso ya que dices haber programado la solución de Visual Studio y haberla testeado en un Windows x86 (o eso entendí), por ende, perfectamente puedes cambiar a modo de compilación para 32 Bits y el executable resultante se iniciará como un proceso de 32 Bits en Windows de 32 Bits y lo mismo en Windows de 64 Bits (modo WOW64).

Aparte, si no se hace nada "extraño" en tiempo de ejecución entonces generalmente el programa directamente no se podría iniciar por incompatibildiad de hardware (me refiero a intentar iniciar una app x64 bajo x86), y también puedes descartar que la congelación sea un problema de arquitectura, sino más bien de "saturación" del thread de la UI y/o un bug por parte del programador o de algún control y/o librerías de terceros tal vez, algo que esté causando un colapso de datos como por ejemplo una asignación excesiva de RAM que ralentice la app, o un mal funcionamiento en general.

En mi opinión el problema que sufres no tiene nada que ver con el modo de arquitectura seleccionado, de todas formas elige el modo de 32 Bits para comprobarlo, pero intenta hallar otra causa al problema depurando los controladores de eventos en donde crees que se cierra o se congela la app en ese otro Windows. Tampoco has especificado si se mostró algún mensaje de error específico cuando intentaste iniciar la app, ni diste información relevante sobre el código.

Ten en cuenta también que hay ciertas "metodologías" en el uso de los miembros de la librería de classes de .Net Framework las cuales podrían generar excepciones al intentar usarlos desde un executable compilado en 32 Bits, como sería por ejemplo la utilización de varias de las propiedades de la class System.Diagnostics.Process para acceder a información específica de executables de 64 Bits bajo tu ensamblado de 32 Bits, ten cuidado con pequeñas cosas como la que acabo de mencionar.

Saludos!