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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Temas
Páginas: 1 2 3 4 5 [6] 7
51  Programación / .NET (C#, VB.NET, ASP) / Snippet para obtener handle de procesos en: 21 Noviembre 2015, 06:18 am
Hola

Iré al grano, utilizando la función Process.GetProcesses() puedo obtener información del los procesos del sistema así como el Handle o el MainWindowHandle de la ventana principal de un proceso.

El problema es que en algunos casos  MainWindowHandle  devuelve 0

Recordé un viejo código de VB que tenía por ahí. Y tras un buen rato probando lo conseguí pasar a VB.NET, ya que usa APIs y si no se usa bien devuelve error o valores nulos.

Se necesita el ID de un proceso para obtener el handle principal, y dado que la clase  Process no devuelve valor nulo con los IDs obtengo todos los Handles en la lista.


Ahí va el code  ;):

////OBTENER HANDLE PROCESO////

Código
  1. #Region "Obtener Handle Proceso"
  2. Public Module modProcessHandle
  3.    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
  4.    Private Function FindWindow(ByVal lpClassName As String, _
  5.    ByVal lpWindowName As String) As IntPtr
  6.    End Function
  7.    <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
  8.    Public Function GetParent(ByVal hWnd As IntPtr) As IntPtr
  9.    End Function
  10.    <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
  11.    Private Function GetWindow(ByVal hWnd As IntPtr, _
  12.    ByVal wCmd As Integer) As IntPtr
  13.    End Function
  14.    <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
  15.    Private Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, _
  16.    ByRef lpdwProcessId As Integer) As IntPtr
  17.    End Function
  18.  
  19.  
  20.    Public Function GetProcessHandle(ByVal ProcessId As Integer) As IntPtr
  21.        Dim HwndTemporal As IntPtr
  22.        Dim idProc As Integer = 0
  23.        Dim HWND As IntPtr = IntPtr.Zero
  24.        Const GW_HWNDNEXT = 2
  25.        HwndTemporal = FindWindow(Nothing, Nothing)
  26.        ' Loop hasta que encuentra una coincidencia o no hay más identificadores de ventana:
  27.        Do Until HwndTemporal = IntPtr.Zero
  28.            ' Comprueba que no tenga ninguna ventana 'Parent'
  29.            If GetParent(HwndTemporal) = IntPtr.Zero Then
  30.                GetWindowThreadProcessId(HwndTemporal, idProc)
  31.                If ProcessId.Equals(idProc) Then
  32.                    HWND = HwndTemporal 'Devuelve el handle encontrado
  33.                    Return HWND
  34.                    Exit Do ' Salir de bucle
  35.                End If
  36.            End If
  37.            idProc = 0
  38.            'Siguiente identificador de ventana
  39.            HwndTemporal = GetWindow(HwndTemporal, GW_HWNDNEXT)
  40.        Loop
  41.        Return HWND
  42.    End Function
  43.  
  44. End Module
  45. #End Region


Aquí un ejemplo de como usarlo para obtener una lista con los procesos en ejecución sus handles y su Class Name.


Código
  1. Option Strict On
  2. Option Explicit On
  3. Imports System.Runtime.InteropServices
  4. Imports System.Text
  5.  
  6. Public Class Form1
  7.    <DllImport("user32.dll", CharSet:=CharSet.Auto)>
  8.    Private Shared Function GetClassName(ByVal hWnd As IntPtr, _
  9.   ByVal lpClassName As System.Text.StringBuilder, _
  10.   ByVal nMaxCount As Integer) As Integer
  11.    End Function
  12.    Dim ClassName As StringBuilder = New StringBuilder(256)
  13.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  14.        ListView1.Columns.Add("Name", 100)
  15.        ListView1.Columns.Add("MainHandle", 100)
  16.        ListView1.Columns.Add("ClassName", 200)
  17.        ListView1.Columns.Add("MainHandle", 100)
  18.        ListView1.Columns.Add("ClassName", 200)
  19.        ListView1.View = View.Details
  20.        ListView1.FullRowSelect = True
  21.        'Recorre los procesos y agrega la información al ListView
  22.        For Each Proceso In Process.GetProcesses()
  23.            Dim Handle As IntPtr = modProcessHandle.GetProcessHandle(Proceso.Id)
  24.            If Handle <> IntPtr.Zero Then
  25.                'Nombre Proceso
  26.                ListView1.Items.Add(Proceso.ProcessName)
  27.  
  28.                'MainWindowHandle
  29.                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add _
  30.                    (Conversion.Hex(Proceso.MainWindowHandle.ToInt32))
  31.                'ClassName
  32.                ClassName.Clear()
  33.                GetClassName(CType(Proceso.MainWindowHandle.ToInt32, IntPtr), ClassName, ClassName.Capacity)
  34.                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(ClassName.ToString)
  35.  
  36.                'MainWindowHandle
  37.                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(Conversion.Hex(CInt(Handle)))
  38.                'ClassName
  39.                ClassName.Clear()
  40.                GetClassName(Handle, ClassName, ClassName.Capacity)
  41.                ListView1.Items(ListView1.Items.Count - 1).SubItems.Add(ClassName.ToString)
  42.  
  43.            End If
  44.        Next
  45.    End Sub
  46.  
  47.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  48.  
  49.    End Sub
  50. End Class
  51. #Region "Obtener Handle Proceso"
  52. Public Module modProcessHandle
  53.    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
  54.    Private Function FindWindow(ByVal lpClassName As String, _
  55.    ByVal lpWindowName As String) As IntPtr
  56.    End Function
  57.    <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
  58.    Public Function GetParent(ByVal hWnd As IntPtr) As IntPtr
  59.    End Function
  60.    <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
  61.    Private Function GetWindow(ByVal hWnd As IntPtr, _
  62.    ByVal wCmd As Integer) As IntPtr
  63.    End Function
  64.    <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
  65.    Private Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, _
  66.    ByRef lpdwProcessId As Integer) As IntPtr
  67.    End Function
  68.  
  69.  
  70.    Public Function GetProcessHandle(ByVal ProcessId As Integer) As IntPtr
  71.        Dim HwndTemporal As IntPtr
  72.        Dim idProc As Integer = 0
  73.        Dim HWND As IntPtr = IntPtr.Zero
  74.        Const GW_HWNDNEXT = 2
  75.        HwndTemporal = FindWindow(Nothing, Nothing)
  76.        ' Loop hasta que encuentra una coincidencia o no hay más identificadores de ventana:
  77.        Do Until HwndTemporal = IntPtr.Zero
  78.            ' Comprueba que no tenga ninguna ventana 'Parent'
  79.            If GetParent(HwndTemporal) = IntPtr.Zero Then
  80.                GetWindowThreadProcessId(HwndTemporal, idProc)
  81.                If ProcessId.Equals(idProc) Then
  82.                    HWND = HwndTemporal 'Devuelve el handle encontrado
  83.                    Return HWND
  84.                    Exit Do ' Salir de bucle
  85.                End If
  86.            End If
  87.            idProc = 0
  88.            'Siguiente identificador de ventana
  89.            HwndTemporal = GetWindow(HwndTemporal, GW_HWNDNEXT)
  90.        Loop
  91.        Return HWND
  92.    End Function
  93.  
  94. End Module
  95. #End Region


Como demostración he hecho que se muestre en una columna los handles obtenidos con la clase Process y otra columna con los handles obtenidos con el snippet. Se puede ver que con algunos procesos ocultos, es decir no son visibles, se devuelve valor 0, pero con el snippet se obtiene el handle sin problemas. Además se obtienen los nombres de clase (ClassName) que sin los Handles de las ventanas no es posible obtenerlos. Por lo menos que yo sepa.

La primera columna ClassName se obtiene con MainWindowHandle del Procces. La segunda columna ClassName se obtiene con los handles obtenidos con el snippet.


Si hay otra forma más sencilla, decídmelo  :-*


El código original VB6 está en el siguiente enlace:
CodeVB

Espero que os sirva...

Saludos
52  Programación / .NET (C#, VB.NET, ASP) / Virus heurístico en: 18 Noviembre 2015, 17:58 pm
Hola
Los antivirus borran mis programas. ¿Cómo evitarlo?

sl2
53  Programación / .NET (C#, VB.NET, ASP) / El código html extraido de una web no muestra acentos 'á,é,ó' en: 12 Noviembre 2015, 11:15 am
Hola

Pues el asunto ya lo explica todo. Extraigo el código de una página web y no aparecen caracteres especiales como los acentos y creo que la 'ñ' tampoco.

Mi código es el siguiente:

Código
  1.         Dim UrlCode As String = Nothing
  2.        Dim myHttpWebRequest As System.Net.HttpWebRequest = _
  3.            CType(System.Net.WebRequest.Create("https://foro.elhacker.net/net/el_codigo_html_extraido_de_una_web_no_muestra_acentos_aeo-t444215.0.html;msg2046878#msg2046878"),  _
  4.                System.Net.HttpWebRequest)
  5.        myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)" '".NET Framework Test Client"
  6.        ' The response object of 'HttpWebRequest' is assigned to a 'HttpWebResponse' variable.
  7.        Dim myHttpWebResponse As System.Net.HttpWebResponse = CType(myHttpWebRequest.GetResponse(), System.Net.HttpWebResponse)
  8.        ' Display the contents of the page to the console.
  9.        Dim streamResponse As System.IO.Stream = myHttpWebResponse.GetResponseStream()
  10.        Dim streamRead As New System.IO.StreamReader(streamResponse)
  11.  
  12.        UrlCode = streamRead.ReadToEnd
  13.  
  14.        streamRead.Close()
  15.        streamResponse.Close()
  16.        myHttpWebResponse.Close()

En lugar del acento aparece un cuadrito 'cami[]n'

Gracias


Ya lo solucioné, añadiendo System.Text.Encoding.

Código
  1.  Dim streamRead As New System.IO.StreamReader(streamResponse, System.Text.Encoding.GetEncoding(1252))

También me ha servido poner System.Text.Encoding.Default

Código
  1. Dim streamRead As New System.IO.StreamReader(streamResponse, System.Text.Encoding.Default)

Parece ser que es debido a la conversión de la Web a Unicode  que hace Net.
54  Foros Generales / Dudas Generales / Ver series retro en: 10 Noviembre 2015, 15:21 pm
Hola
Estoy buscando donde ver online la serie 'Los ángeles de Charlie (1976)'. Busco en Google y me sale seriesyonkies por ejemplo pero a la hora de verlo no hay manera, me dice o que actualice Flash que ya lo he actualizado oy firefox que también lo tengo actualizado, pero desde el propio firefox no desde el enlace que te proponen ¿lógico no?.

¿Dónde puedo verla?

Gracias


Bueno, he vuelto a probar y ahora me lleva a una página en blanco.
55  Sistemas Operativos / Windows / Servicio de transferencia inteligente en segundo plano en: 4 Noviembre 2015, 13:28 pm
Hola

El otro día me conecté a la red usando el móvil como modem. Mi movil  tiene límite de datos, y pasado 1 GB, me cobran 1 € cada 100 mb. En fin, un timo. Es para uso mínimo

El caso es que me conecté desde XP y afortunadamente tengo un programa que hice yo mismo para controlar subida y la bajada.  Se que hay herramientas para verlo pero se muestra en bytes y no suma la bajada y la subida, lo cual lo que cuenta es todo en este caso.

Por suerte me percaté pronto de que había algo descargando sin parar y desconecté la conexión. Hice lo siguiente:
- Mediante el Firewall de mi antivirus bloquee la conexión de programas que tratan de utilizar a la red.
-Desconecté Windows Update. Además ya lo tenía en avisarme y no descargar.
-Mediante un programa What's Running, compruebo que se conecta a la red. También desde consola.

Veo que sea lo que sea usa svchost.exe

Por mucho que haga no conseguía averiguar qué es lo que se estaba descargando y qué programa lo hacía. Hasta que  me puse con los servicios. Al final resulta que era: Servicio de transferencia inteligente en segundo plano

Lo deshabilité y listo ya no descargaba nada en absoluto. Sólo cuando navegaba ya que al hacerlo se descargan y envían datos.

Si tengo deshabilitado Windows Update ¿Qué programa usaba o qué se descargaba a través de este servicio?

Gracias








56  Programación / .NET (C#, VB.NET, ASP) / los bytes de datos enviados y recibidos de la red mediante VB.NET no cuadran. en: 4 Noviembre 2015, 12:40 pm
Hola

Mediante este código obtengo los bytes enviados y recibidos por la red.

Código
  1.  Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) _
  2.    Handles Timer1.Tick
  3.        Dim nics As System.Net.NetworkInformation.NetworkInterface()
  4.        nics = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
  5.  
  6.        For Each nic As NetworkInterface In nics
  7.            Dim S As Integer = nic.NetworkInterfaceType
  8.  
  9.            If nic.OperationalStatus = 1 Then
  10.                If S = NetworkInterfaceType.Wireless80211 Or S = NetworkInterfaceType.Ethernet Then
  11.                    Dim ipv4Stats As System.Net.NetworkInformation.IPv4InterfaceStatistics
  12.                    ipv4Stats = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces.First.GetIPv4Statistics
  13.                    Label1.Text = String.Format("Enviado: {0} bytes", ipv4Stats.BytesSent.ToString("##,##"))
  14.                    Label2.Text = String.Format("Recibido: {0} bytes", ipv4Stats.BytesReceived.ToString("##,##"))
  15.  
  16.                End If
  17.                If S = NetworkInterfaceType.Ppp Then
  18.                    Dim ipv4Stats As System.Net.NetworkInformation.IPv4InterfaceStatistics
  19.                    ipv4Stats = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces(1).GetIPv4Statistics
  20.                    Label1.Text = String.Format("Enviado: {0} bytes", ipv4Stats.BytesSent.ToString("##,##"))
  21.                    Label2.Text = String.Format("Recibido: {0} bytes", ipv4Stats.BytesReceived.ToString("##,##"))
  22.                End If
  23.            End If
  24.        Next
  25.    End Sub



 Pero no cuadra con los mostrados por Windows a través del cuadro "Estado de Conexión de red inalámbrica":





Gracias

57  Programación / .NET (C#, VB.NET, ASP) / Cargar imagen en un botón WPF en: 28 Octubre 2015, 20:11 pm
Hola

Estoy intentando cargar una imagen que tengo en la carpeta Recursos del proyecto en
un  botón. pero no lo consigo porque no se poner la dirección de imagen

He probado esto:
Código
  1.  <Button>
  2. <Image Height="18" Source="/WpfApplication1;component/Resources/Ir.png" Stretch="Fill" Width="18"/>
  3. </Button>

y esto:
Código
  1.  <Button>
  2. <Image Height="18" Source="/Resources/Ir.png" Stretch="Fill" Width="18"/>
  3. </Button>

y esto:
Código
  1.  <Button>
  2. <Image Height="18" Source="Res/Ir.png" Stretch="Fill" Width="18"/>
  3. </Button>


Pero nada no se carga

Gracias


Ya lo he conseguido  :laugh:

Código
  1. <Application x:Class="Application"
  2.    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.    StartupUri="MainWindow.xaml">
  5.    <Application.Resources>
  6.        <ImageBrush x:Key="OpenImage">
  7.            <ImageBrush.ImageSource>
  8.                         <BitmapImage UriSource="/Resources/open.png" />
  9.            </ImageBrush.ImageSource>
  10.        </ImageBrush>
  11.  
  12.        <Style TargetType="Button">
  13.            <Setter Property="Background" Value="{StaticResource OpenImage}"/>
  14.        </Style>
  15.  
  16.    </Application.Resources>
  17. </Application>

Una cosa importante. Por defecto la imagen colocada en Resources tiene la propiedad 'Acción de compilación' establecidad en 'Ninguno'. Hay que establecerlo como' Resource'
58  Programación / .NET (C#, VB.NET, ASP) / ComboBox que no despliegue la lista al hacer click sobre el cuadro de text (WPF) en: 28 Octubre 2015, 19:33 pm
Hola

Pues eso, ayer estuve más de una hora cambiando esto y aquello para evitar que al hacer clic sobre el ComboBox NO despliegue la lista pero SI que lo haga la pulsar el botón.

Si el ComboBox no está personalizado, es decir, que no le hemos aplicado ningún estilo, basta con cambiar la propiedad IsEditable a True

Código
  1. <ComboBox Name="ComboBox1" IsEditable="True"  Height="25" Width="150" Margin="0,20,0,0"> </ComboBox>

Pero cuando se le aplica un estilo no hay forma de conseguir que no despliegue la lista al hacer clic sobre él.

Aquí dejo un enlace con un ejemplo de estilo para el ComboBox
ComboBox ControlTemplate Example

Si establezco IsEditable= "True" se puede editar pero al hacer clic sobre el cuadro de texto para editarlo se despliega la lista.

Gracias

59  Sistemas Operativos / Windows / ¿Qué tiene que ver Windows Update, Windows Live Mail, Intel y disco de 500GB? en: 28 Octubre 2015, 16:50 pm
Hola

Mi portátil (con Windows Vista) tenía un disco de 250 GB y al cambiarlo por uno de 500 GB los drivers originales de Intel no eran compatibles con el disco de 250 y no me funcionaba Widnows Update. Tras mucho navegar vi en un foro que alguien había encontrado esa relación y lo solucionó. Me bajé una versión actualizada 'Intel Rapid Storage Technology Driver v9.5.6.1001 REV. SoftPaq NUMBER:  SP47845'. Y problema solucionado.

Estas son las especificaciones del dispositivo:
Código:
DEVICES SUPPORTED:  
PCI\VEN_8086&DEV_3B29="Intel(R) 5 Series 4 Port SATA AHCI Controller"

y mi CPU:
Intel(R) Core(TM)2 Duo CPU     P8400  @ 2.26GHz, 2267 Mhz, 2 procesadores principales, 2 procesadores lógicos

Parece ser que tiene que ver con el AHCI (Advanced Host Controller Interface) o RAID.

Pero esto no acaba aquí, ayer tras instalar Windows 7 en un PC (no le meto Linux porque no tiene conexión a Internet). Pues vi que el disco del PC tenía un programa para controlar el CPU mostrando los vatios que consumía. Busqué lo mismo en el disco del portátil y por error instalé los drivers antiguos de Intel. El resultado un mensaje de error de Windows Live Mail:"Error 0x8E5E0247". El cual no relacioné para nada con el tema de los drivers, y busqué incesantemente una solución en Google, hasta que me acordé de haber instalado los programas 'Intel® Matrix Storage Manager' y Intel Turbo Memmory (que también te instala los drivers antiguos NO compatible con disco de 500GB ). Entonces intenté iniciar Windows Update y como esperaba tampoco funcionaba.

Desinstalé los programas de Intel y luego al reiniciar PANTALLAZO AZUL. Tuve que iniciar el modo reparación y restaurar el sistema a un punto anterior.

Dicho todo esto, no entiendo qué tiene que ver windows Live Mail y Windows Update con el CPU y el disco de 500GB. No entiendo esa dependéncia de Windows Update y  Windows Live Mail con Intel y sus drivers, la verdad.

Espero que alguien pueda explicarme la relación.

Aquí otro usuario se encontró con el mismo problema y lo solución del mismo modo:
http://programacion-vision-digital.bligoo.com.mx/resuelto-windows-update-error-0x8e5e0247-en-windows-7


60  Programación / .NET (C#, VB.NET, ASP) / Cerrar aplicación mientras ser reproduce un bucle Do/Loop en: 19 Octubre 2015, 01:13 am
Hola

Hola me gustaría saber como salir de la aplicación cuando todavía no se a salido de DO/LOOP

Mi método clásico siempre ha sido poner END en el evento Unload en VB y también en Dispose en Net. No se si habrá otra manera también sencilla.

Por ejemplo he creado un Bucle Do/Loop en el que creo un reloj en el cual si han pasado 10 segundos se sale de del bucle. La razón es porque quiero que el bucle dure un mínimo de 10 segundos a espera que se cumpla una condición y si pasados los 10 segundos no se cumple sale del bucle.

Aquí va el supercódigo de ejemplo :P
Código
  1. Option Strict On
  2. Option Explicit On
  3. Public Class Form1
  4.  
  5.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  6.        Dim SecA As TimeSpan, SecB As TimeSpan
  7.        SecA = TimeSpan.FromTicks(Date.Now.Ticks)
  8.        Do
  9.            SecB = TimeSpan.FromTicks(Date.Now.Ticks).Subtract(SecA)
  10.            Me.Text = CStr(SecB.Seconds)
  11.            If CInt(SecB.Seconds) = 10 Then Exit Do
  12.            My.Application.DoEvents()
  13.        Loop 'While (podría poner condición y si se cumple sale antes de los 10 segundos)
  14.    End Sub
  15.  
  16.    Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
  17.        End
  18.    End Sub
  19. End Class

El problema está en que si quito
 
Código
  1.    Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
  2.        End
  3.    End Sub
  4.  

No se puede cerrar la apliación hasta que no pasen los 10 segundos
Páginas: 1 2 3 4 5 [6] 7
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines