|
Mostrar Temas
|
Páginas: 1 2 3 4 [5] 6 7
|
42
|
Programación / .NET (C#, VB.NET, ASP) / Normalizar URL (pasar Url de UTF8 a Unicoce)
|
en: 23 Febrero 2016, 16:26 pm
|
Hola He conseguido normalizar una URL de esas con símbolos % y códigos hexadecimales. Por ejemplo: "https%3A%2F%2Fes.noticias.locas.com%2Fdescubren-un-jupitiano-en-j%C3%BApiter-666999.html" (no te molestes en ir que no existe, es inventado) Agradezco la ayuda al foro y en especial a Elektro que me ha resuelto el tema de pasar un código UTF8 a Unicode. Option Strict Off Imports System.Text.RegularExpressions Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim strUrl As String = ("https%3A%2F%2Fes.noticias.locas.com%2Fdescubren-un-ni%C3%B1o-jupitiano-en-j%C3%BApiter-666999.html") 'Enlace MsgBox(NormalizarURL(strUrl)) End Sub Public Function NormalizarURL(ByVal strUrl as String) As String 'strUrl = strUrl.Replace("%3A%2F%2F", "://") Dim PatternUTF8_1 As String = "(%..%..?)" 'Expresiones regular Dim PatternUTF8_2 As String = "(%..?)" 'Expresiones regulares Dim MyRegexUTF8_1 As New Regex(PatternUTF8_1, RegexOptions.IgnoreCase) 'Regex para doble PatternUTF8_1 Dim MyRegexUTF8_2 As New Regex(PatternUTF8_2, RegexOptions.IgnoreCase) 'Regex para doble PatternUTF8_2 Dim MyMatchUTF8_1 As Match = MyRegexUTF8_1.Match(CStr(strUrl)) Dim MyMatchUTF8_2 As Match = MyRegexUTF8_2.Match(CStr(strUrl)) While MyMatchUTF8_1.Success Dim UTFChar As String = MyMatchUTF8_1.Groups(0).Value 'Obtiene el primer valor de cada coincidencia Dim HexChar1 As Byte = CType(Convert.ToInt32(UTFChar.Substring(1, 2), 16), Byte) 'Obtiene el valor entero del primer valor hexadecimal obtenido del código utf-8 Dim HexChar2 As Byte = CType(Convert.ToInt32(UTFChar.Substring(4, 2), 16), Byte) 'Obtiene el valor entero del segundo valor hexadecimal obtenido del código utf-8 '//Convierte carácter hexadecimal UTF-8 a UNICODE por ejemplo "C3 BA" a "ú" Dim CharUnicode As String = System.Text.Encoding.UTF8.GetString(New Byte() {HexChar1, HexChar2}) strUrl = strUrl.Replace(UTFChar, CharUnicode) 'Reemplaza el carácter hexadecimal UTF-8 por Unicode MyMatchUTF8_1 = MyMatchUTF8_1.NextMatch() 'Continúe el bucle hasta la siguiente coincidencia. End While While MyMatchUTF8_2.Success Dim UTFChar As String = MyMatchUTF8_2.Groups(0).Value '//Convierte y remplaza un carácter hexadecimal a Unicode por ejemplo "2F" a "/" strUrl = strUrl.Replace(UTFChar, Convert.ToChar(Convert.ToInt32(UTFChar.Substring(1, 2), 16))) MyMatchUTF8_2 = MyMatchUTF8_2.NextMatch() 'Continúe el bucle hasta la siguiente coincidencia. End While Return CStr(strUrl) End Function End Class
Saludos
|
|
|
44
|
Programación / .NET (C#, VB.NET, ASP) / Normalizar un enlace de búsqueda de google
|
en: 23 Enero 2016, 01:05 am
|
Hola No consigo obtener el enlace a los que redirecciona google por ejemplo: https://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiK3Ii9zr7KAhXD0RQKHekoC9kQFggcMAA&url=http%3A%2F%2Fwww.recursosvisualbasic.com.ar%2Fhtm%2Fvb-net%2F54-obtener-links-de-una-pagina-web.htm&usg=AFQjCNGMpwVIQ7z-vWEq6Urag9Vf_UAKGg&bvm=bv.112454388,d.d24 Redirecciona a...:http://www.recursosvisualbasic.com.ar/htm/vb-net/54-obtener-links-de-una-pagina-web.htm Yo utilizo el siguiente código para obtener el enlace al que redirecciona una determianda URL #Region "Normalizar URL" Public Function ResolverURL(ByVal strUrl As String) As String Dim RedirectUrl As String = Nothing strUrl = DecodeUrl(strUrl) Try Dim WebRequest As System.Net.HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(strUrl), System.Net.HttpWebRequest) With WebRequest .UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1" 'WebRequest.MaximumAutomaticRedirections = 1 .AllowAutoRedirect = True '<==importante '.ProtocolVersion = System.Net.HttpVersion.Version11 .Method = "GET" '.Timeout = 1000 End With Using webResponse As System.Net.HttpWebResponse = DirectCast(WebRequest.GetResponse, Net.HttpWebResponse) RedirectUrl = webResponse.ResponseUri.AbsoluteUri webResponse.Close() '<===importante End Using Catch ex As System.Net.WebException If ex.Status = Net.WebExceptionStatus.NameResolutionFailure Then MessageBox.Show("El Sitio no existe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If End Try Return RedirectUrl End Function Public Function DecodeUrl(ByVal strUrl As String) As String Dim HexCaracter As String() HexCaracter = strUrl.Split(CChar("%")) For I As Integer = 1 To HexCaracter.Length - 1 Dim Cr As String = HexCaracter(I).Substring(0, 2) Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16)) strUrl = strUrl.Replace("%" & Cr, newCr) Next Return strUrl End Function #End Region
Este código se usa del modo siguiente: Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = ResolverURL(URL) End Sub
Sin embargo no me funciona con los enlaces que ofrece Google en el listado de búsqueda. S2s
Una forma que he ideado es esta: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim strUrl as String = "https://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwidgYbs98HKAhUJLhoKHRwBBzYQFggcMAA&url=https%3A%2F%2Fes.wikipedia.org%2Fwiki%2FAlbert_Einstein&usg=AFQjCNEpx7ZvmsTJayPwnY-RF0W1AbWLGw&bvm=bv.112454388,d.d2s" strUrl = DecodeUrl(strUrl) Dim uri As New Uri(strUrl) Dim dirs As String = uri.GetComponents(UriComponents.AbsoluteUri, UriFormat.UriEscaped) Try Dim dirArray As String() = dirs.Split(CChar("=")) For I As Integer = 1 To dirArray.Length - 1 If dirArray(I).Length > 4 Then If dirArray(I).Substring(0, 4) = "http" Then strUrl = dirArray(I).Replace("&usg", "") Exit For End If End If Next Catch ex As Exception End Try TextBox1.Text = strUrl End Sub Public Function DecodeUrl(ByVal strUrl As String) As String Dim HexCaracter As String() HexCaracter = strUrl.Split(CChar("%")) For I As Integer = 1 To HexCaracter.Length - 1 Dim Cr As String = HexCaracter(I).Substring(0, 2) Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16)) strUrl = strUrl.Replace("%" & Cr, newCr) Next Return strUrl End Function
Pero mi intención es que conseguir un método general que sirva para cualquier URL sin afectar a URLs que no redireccionen. De otro modo tengo que hacer que el programa determine si es redireccionable y si lo es, si éste es de Google para aplicar el código que acabo de mostrar... Esto no me convence.
Bueno, lo he resuelto de la siguiente manera. Que como dije obtiene la URL a la que redirecciona de forma selectiva. Si es de Google aplica un método y si no lo es aplica el otro. #Region "Normalizar URL" Public Function NormalizarUrl(ByVal strUrl As String) As String strUrl = DecodeUrl(strUrl) Task.Factory.StartNew(Sub() If strUrl.Contains("www.google.es/url?") = True Then '//Obtiene la Url a la que redirecciona strUrl = ResolverUrlGoogle(strUrl) Else '//Si el Url redireciona a otra Url obtiene la Url a la que redirecciona strUrl = ResolverURL(strUrl) End If ComboBox1.Invoke(DirectCast(Sub() ComboBox1.Text = strUrl, MethodInvoker)) End Sub) Return strUrl End Function Public Function DecodeUrl(ByVal strUrl As String) As String Dim HexCaracter As String() HexCaracter = strUrl.Split(CChar("%")) For I As Integer = 1 To HexCaracter.Length - 1 Dim Cr As String = HexCaracter(I).Substring(0, 2) Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16)) strUrl = strUrl.Replace("%" & Cr, newCr) Next Return strUrl End Function Public Function ResolverUrlGoogle(ByVal strUrl As String) As String Dim uri As New Uri(strUrl) Dim dirs As String = uri.GetComponents(UriComponents.AbsoluteUri, UriFormat.UriEscaped) Try Dim dirArray As String() = dirs.Split(CChar("=")) For I As Integer = 1 To dirArray.Length - 1 If dirArray(I).Length > 4 Then If dirArray(I).Substring(0, 4) = "http" Then strUrl = dirArray(I).Replace("&usg", "") Exit For End If End If Next Catch ex As Exception End Try Return strUrl End Function Public Function ResolverURL(ByVal strUrl As String) As String Dim RedirectUrl As String = Nothing strUrl = DecodeUrl(strUrl) Try Dim WebRequest As System.Net.HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(strUrl), System.Net.HttpWebRequest) With WebRequest WebRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1" 'WebRequest.MaximumAutomaticRedirections = 1 WebRequest.AllowAutoRedirect = True '<==importante End With Using webResponse As System.Net.HttpWebResponse = DirectCast(WebRequest.GetResponse, Net.HttpWebResponse) RedirectUrl = webResponse.ResponseUri.AbsoluteUri webResponse.Close() '<===importante End Using Catch ex As System.Net.WebException If ex.Status = Net.WebExceptionStatus.NameResolutionFailure Then MessageBox.Show("El Sitio no existe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If End Try Return RedirectUrl End Function #End Region
Sirve para evitar errores al usar System.Net.HttpWebRequest o System.Net.WebClient con URLs que redireccionan. NOTA: He hecho algunas correcciones y modificaciones respecto al código que expuse ayer. Disculpen las molestiasHe añadido por ejemplo esta función: Public Function DecodeUrl(ByVal strUrl As String) As String Dim HexCaracter As String() HexCaracter = strUrl.Split(CChar("%")) For I As Integer = 1 To HexCaracter.Length - 1 Dim Cr As String = HexCaracter(I).Substring(0, 2) Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16)) strUrl = strUrl.Replace("%" & Cr, newCr) Next Return strUrl End Function
Ya que yo creía que sólo había que sustituir "%3A" por ":" y "%2F" por "/". Entonces he visto otro enlace con "%3F" y comprendí que se trata de número de un carácter convertido a hexadecimal. Es decir 3A = 58 que equivale a ":" y 2F = 47 que equivale a "/". He hecho esa función para sustituir cualquier código hexadecimal por su carácter correspondiente. Por otro lado la función ResolverUrlGoogle tampoco estaba bien del todo . No todos los enlaces, pasados por split se encuentran el la posición 10 del array. Así que hago que busque la url dentro del array. De todos modos aún no está perfecto porque hay enlaces, aunque poco comunes, que se devuelven incompletos o con algún carácter demás. Sl2s
|
|
|
45
|
Programación / .NET (C#, VB.NET, ASP) / Problema con Expresiones regulares
|
en: 19 Diciembre 2015, 19:12 pm
|
Hola La verdad no comprendo como funcionan las expresiones regulares, pese a que hay ejemplos en la ayuda msdn. Estoy intentando obtener la Url de las imágenes de una página html junto con los valores Width, height y alt. El problema está en que no siempre está en el mismo orden. Es decir primero puede establecerse src después height, width y luego alt: <img src="..." height="128" width="128" alt"..."/>También: <img src="..." width"128" height="128" alt"..."/>O por el contrario, establecerse el width o el heigth antes que el src: <img width"128" height="128" src="..." alt"..."/> <img height"128" width="128" src="..." alt"..."/>Utilizando el sistema de las expresiones regulares con Regex ocurre que sólo obtiene los valores siempre y cuando estén el orden establecido en el pattern: Dim Pattern As String = "<img[^>]+(src)\s*=\s*""?([^ "">]+)""?(?:[^>]+(width|height)\s*=\s*""?([^ "">]+)""?\s+(height|width)\s*=\s*""?([^ "">]+)""?)?(?:[^>]+(alt)\s*=\s*""?([^"">]+)""?)?" Dim re As New Regex(Pattern, RegexOptions.IgnoreCase) Dim m As Match = re.Match(code) While m.Success For I As Integer = 0 To m.Groups.Count - 1 ListBox1.Items.Add(m.Groups(I).Value) Next End While
'¿Como puedo obtener los valores independientemente del orden en que se encuentren? Necesito encontrar los valores Width, height independientemente de si están antes que el src o después Gracias
|
|
|
46
|
Foros Generales / Dudas Generales / Pedidos de almacén con carácteres extraños
|
en: 13 Diciembre 2015, 18:44 pm
|
Hola
En la empresa donde trabajo los pedidos aparecen con símbolos extraños en sustitución de á,è,ó,...,ñ y ç, que son del tipo á, Ã-, etc Creo que podría ser que el sistema tiene como configuración regional la alfabetización inglesa, pero no estoy seguro de si es por eso o del programa que imprime los pedidos.
¿Alguna idea?
Gracias
|
|
|
47
|
Foros Generales / Foro Libre / Convenio de Prácticas el nuevo timoempleo
|
en: 2 Diciembre 2015, 12:34 pm
|
Hola España es el país de los pillos, los tramposos, los estafadores, y los listillos... Los/as empresarios/as españoles/as, se han sacado de la manga una forma de conseguir trabajadores/as GRATIS y se llama ' Convenio de Prácticas (becarios)'. Vale no es nuevo pero enseguida entenderás porqué lo digo. Ya no les basta con contratar a trabajadores con 'mínima discapacidad' (si estás en silla de ruedas no les vales), para beneficiarse de ayudas y bonificaciones. Con trabajadores que lo mismo tienen una quemadura con secuelas o un poco de sordera. En fin buscan trabajadores que puedan cumplir y que tengan alguna 'tara' los suficientemente importante como para que disponga de un certificado de discapacidad, pero que sea la más mínima posible y así poder beneficiarse de su contratación. Ahora la moda es el Convenio de Prácticas. Durante hace un mes, más o menos, me estoy encontrando ofertas de empleo bastante a menudo demandando trabajadores dispuestos a trabajar por convenio, es decir SIN CONTRATO. Existe el Convenio de Prácticas y Contrato de Prácticas. El primero es sin contrato y el segundo es con contrato y sueldo. Curiosamente se está demandando mucho para trabajos de baja cualificación. Por favor, ¿becario para mozo de almacén? No se si reír o llorar. Así que yo voy a la universidad y estudio por ejemplo...periodismo, y me contratan de becario para preparar pedidos en un almacén, o descargar y cargar camiones. Alucino en colores Pues a esto hemos llegado. NO ACEPTÉIS ESTOS TRABAJOS sin no cumplís los requisitos que ahora mencionaré, pues si no es así, te están tomando el pelo. Requisitos para poder realizar un convenio de prácticas- Estar matriculado en una Universidad o un centro de formación autorizado para la firma de convenios de prácticas con empresas. - Que la actividad de las prácticas esté relacionada con la formación del estudiante. - Haber superado el 50% de los créditos necesarios para obtener la titulación. - Si se trata de prácticas curriculares (incluidas en el plan de estudios), el estudiante debe estar matriculado en la asignatura vinculada a esas prácticas. - No tener relación contractual alguna con la empresa o institución en la que se vayan a realizar las prácticas. OJO Que la actividad de las prácticas esté relacionada con la formación del estudiante.Fuente: primerempleoEn definitiva, ¿Tienes más de cuarenta? Pues se pasan por el forro de los huevos toda tu experiencia, tus títulos (mira que me dieron la vara con lo de la ESO y el Bachillerato, lo tengo ¿y para qué?) . Se pasan por el forro todo, lo que quieren es ahorrarse dinerito y se les ocurre la brillante idea de contratar a estudiantes de Universidad, sin contrato y puede que sin pagar, porque aunque deban puede que no lo hagan. Luego importan el black friday para incentivar el consumo, porque quieren que compremos pero no que cobremos. Si no cobramos, no compramos, si cobramos poco, compramos poco, así de simple. ¡Que no te tomen el pelo! Se nota que estoy enfadado ¿no? pues sí , y mucho.
|
|
|
48
|
Programación / .NET (C#, VB.NET, ASP) / Clase y propiedades con Webbrowser
|
en: 29 Noviembre 2015, 14:25 pm
|
Hi Lo que intento es lo siguiente: -Obtengo código fuente de una página y lo cargo en A -Cargo la página en el Webbrowser: WB.DocumentText= A -Cuando cargue la página llama al evento ReadWeb -ReadWeb obtiene datos en modo lista y lo Carga en una variable List -Desde Button_Click llamo a la clase e intento obtener dicha lista. Problema: No puedo obtener dicha lista. Class clsGetDataWeb Dim Lista As New List(Of String) Dim WB As New WebBrowser Dim strUrl As String = "http://www...." Dim WebSource As String = Nothing Public Sub GetDataWeb() '//OBTIENE EL CÓDIGO FUENTE DE LA PÁGINA Try WebSource = GetWebSource(strUrl) 'Obtiene el código de la página Catch ex As Exception MessageBox.Show(ex.Message) Exit Sub End Try 'LLama al evento DocumentCompletes AddHandler WB.DocumentCompleted, AddressOf WB_DocumentCompleted 'Carga el código html en WB WB.ScriptErrorsSuppressed = True WB.DocumentText = WebSource End Sub Private Sub WB_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) ReadWeb(WB) End Sub Private Sub ReadWeb(ByVal WBrowser As WebBrowser) Dim document As System.Windows.Forms.HtmlDocument = WBrowser.Document Dim doc As HtmlDocument = WBrowser.Document Dim divs As HtmlElementCollection = doc.GetElementsByTagName("td") Lista.Clear() For Each div As HtmlElement In divs If div.GetAttribute("classname") = "Canción" Then Lista.Add(div.InnerText) Next Lista= Lista.Distinct.ToList End Sub Private Function GetWebSource(ByVal strUrl As String) As String ...AQUÍ CÓDIGO PARA OBTENER EL CÓDIGO FUENTE DE LA PÁGINA WEB Return CódigoFuente End Function Public ReadOnly Property ParameterNames() As IEnumerable(Of String) Get Return New List(Of String)(Lista) End Get End Property End Class #End Region
Y desde el un evento click: '//Llamo a Dim ClassDW As New clsGetDataWeb ClassDW.GetDataWeb() For Each N As String In ClassDW.ParameterNames ListBox1.Items.Add(n) Next
He constatado por puntos de interrupción que el código de la página lo obtiene y la lista también. Creo que el problema tiene relación con Evento DocumentCompleted y la propiedad Get parace como si se estableciese la propiedad antes de que se obtenga la lista Gracias [ SOLUCIONADO] Era lo que yo pensaba Se carga la propiedad antes de que se obtenga la lista. Para solucionarlo he añadido un simple código de espera Public ReadOnly Property ParameterNames() As System.Collections.Generic.ICollection(Of String) Get While [LISTA].Count = 0 My.Application.DoEvents() End While Return New List(Of String)([LISTA]) End Get End Property
|
|
|
49
|
Programación / .NET (C#, VB.NET, ASP) / Cambiar estilo de las ventanas (invertir, quitar botones, bloquear, etc)
|
en: 27 Noviembre 2015, 19:07 pm
|
Hola He creado este código para cambiar el estilo de las ventanas, se puede invertir la barra de título sin alterar el resto del form, bloquear el form, quitar los botones, desactivar botones de la barra, cambiar la posición de título de la barra de título, quitar los bordes, mostrar el form como un popup menú, etc. Los cambios son combinables en algunos casos. CAMBIAR EL ESTILO DE LAS VENTANAS#Region "Cambiar estilo de la ventana" Public Module modChangeStyleWindow Const GWL_ID = (-12) Const GWL_STYLE = (-16) Const HWND_NOTOPMOST = -2 Const SWP_NOZORDER = &H4 Const SWP_NOSIZE = &H1 Const SWP_NOMOVE = &H2 Const SWP_FRAMECHANGED = &H20 Const SWP_DRAWFRAME = SWP_FRAMECHANGED Enum WindowsStyle WS_SIZABLE = &H0 'Con todos los botones y la barra de título WS_SIZABLE_DISABLEMAXB = &HFFFFFFFFFFFFFFFF 'Desactiva el botón maximizar WS_SIZABLE_DISABLEMINB = &HFFFFFFFFFFFE5E08 'Desactiva el botón minimizar WS_DLGFRAME_DISABLE = &H5FD8220 'Cuadro diálogo desactivado (no permite ninguna interacción con el form) WS_DLGFRAME_FIXEDSINGLE = &HFFFFFFFFFFF9CA28 'Cuadro diálogo no redimensionable WS_DLGFRAME_SIZABLE = &HFFFFFFFFFFFDC5B0 'Cuadro diálogo redimensionable WS_DISABLED = &H8000000 'Desactivado (no permite ninguna interacción con el form) WS_SYSMENU_DISABLE = &H5F5E100 'Desactiva el menú y desactivado WS_SYSMENU_SIZABLE = &HFFFFFFFFFFF8F350 'Desactiva el menú y redimensionable WS_SYSMENU_FIXEDSINGLE = &HFFFFFFFFFFF4EC10 'Desactiva el menú y no es redimensionable WS_FIXEDSINGLE = &HFFFFFFFFFFFCEAF0 'No redimensionable WS_FIXEDSINGLE_DISABLEMAXB = &HFFFFFFFFFFFBBA40 'No redimensionable y desactiva el botón maximizar WS_FIXEDSINGLE_DISABLEMINB = &HFFFFFFFFFFFAEF20 'No redimensionable y desactvia el botón minimizar WS_NOBORDER = &H325AA0 'Sin bordes WS_FLAT3D = &HB1FE68 'Sin bordes con línea exterior WS_POPUP = &H712CA8 'Menú Popup End Enum <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _ Private Function SetWindowLong(ByVal hwnd As IntPtr, _ ByVal nIndex As Integer, _ ByVal dwNewLong As Integer) As Integer End Function <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=False)> _ Private Function SetWindowPos(ByVal hwnd As IntPtr, _ ByVal hWndInsertAfter As IntPtr, _ ByVal X As Integer, _ ByVal y As Integer, _ ByVal cx As Integer, _ ByVal cy As Integer, _ ByVal wFlags As Integer) As Integer End Function <System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="GetWindowLongA", SetLastError:=True)> _ Private Function GetWindowLong(ByVal hWnd As IntPtr, _ <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.I4)> ByVal nIndex As Integer) As Integer End Function Public Sub ChangeStyleWindow(ByVal hwnd As IntPtr, ByVal StyleForm As Integer, ByVal SetStyle As Boolean) 'mantiene el tamaño de la ventana Dim stl As Integer = GetWindowLong(hwnd, GWL_STYLE) Select Case SetStyle '//Solo Ventana 'Sizable' 'Case True : If stl = &H16CF0000 Then stl += StyleForm 'Case False : If stl = &H16CF0000 + StyleForm Then stl -= StyleForm '//Cualquier tipo de ventana u objeto con handle Case True : stl += StyleForm Case False : stl -= StyleForm End Select SetWindowLong(hwnd, GWL_STYLE, stl) Call SetWindowPos(hwnd, HWND_NOTOPMOST, Nothing, Nothing, Nothing, Nothing, _ SWP_NOZORDER + SWP_NOSIZE + SWP_NOMOVE + SWP_DRAWFRAME) End Sub End Module #End Region
CAMBIAR EL ESTILO DE LA BARRARegion "Cambiar estilo de la Barra de Título" Module modChangeStyleBar Const GWL_ID = (-12) Const GWL_STYLE = (-16) Const GWL_EXSTYLE = (-20) Const HWND_NOTOPMOST = -2 Const SWP_NOZORDER = &H4 Const SWP_NOSIZE = &H1 Const SWP_NOMOVE = &H2 Const SWP_FRAMECHANGED = &H20 Const SWP_DRAWFRAME = SWP_FRAMECHANGED Enum WStyleBarTitle WStB_NORMAL_THICKBORDER = &H200 'Normal con borde ancho WStB_NORMALCAPTIONLEFT = &H0 'Título a la izquierda WStB_NORMAL_CAPTIONRIGHT = &H1000 'Título a la derecha WStB_INVERT_CAPTIONLEFT = &H405000 'Invertido con título a la izquierda WStB_INVERT_CAPTIONRIGHT = &H400000 'Invertido con título a la derecha WStB_TOOLWINDOW_CAPTIONLEFT = &H6590 'Tool window con título a la izquierda y borde fino WStB_TOOLWINDOW_CAPTIONRIGHT = &H5580 'Tool window con título a la derecha y borde fino WStB_TOOLWINDOW_THICKBORDER_CAPTONLEFT = &H68F 'Tool window con título a la izquierda y borde grueso WStB_TOOLWINDOW_THICKBORDER_CAPTONRIGHT = &H5A80 'Tool window con título a la derecha y borde grueso WStB_TOOLWINDOWS_INVERT_CAPTIONLEFT = &H401080 'Tool window Invertido con título a la izquierda y borde fino WStB_TOOLWINDOWS_INVERT_CAPTIONRIGHT = &H400180 'Tool window invertido con título a la derecha y borde fino WStB_TOOLWINDOWS_INVERT_THICKBORDER_TITLELEFT = &H403390 'Tool window Invertido con título a la izquierda y borde grueso WStB_TOOLWINDOWS_INVERT_THICKBORDER_TITLERIGHT = &H400290 'Tool window invertido con título a la derecha y borde grueso WS_EX_DLGMODALFRAME = &H1 WS_EX_NOPARENTNOTIFY = &H4 WS_EX_TOPMOST = &H8 WS_EX_ACCEPTFILES = &H10 'Cambia el cursor cuando se arrastr un archivo a la ventana WS_EX_TRANSPARENT = &H20 WS_EX_MDICHILD = &H40 WS_EX_TOOLWINDOW = &H80 WS_EX_WINDOWEDGE = &H100 WS_EX_CLIENTEDGE = &H200 WS_EX_CONTEXTHELP = &H400 WS_EX_RIGHT = &H1000 WS_EX_LEFT = &H0 WS_EX_RTLREADING = &H2000 WS_EX_LTRREADING = &H0 WS_EX_LEFTSCROLLBAR = &H4000 WS_EX_RIGHTSCROLLBAR = &H0 WS_EX_CONTROLPARENT = &H10000 WS_EX_STATICEDGE = &H20000 WS_EX_APPWINDOW = &H40000 WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE) WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST) WS_EX_LAYERED = &H80000 WS_EX_NOINHERITLAYOUT = &H100000 ' Disable inheritence of mirroring by children WS_EX_LAYOUTRTL = &H400000 ' Right to left mirroring WS_EX_COMPOSITED = &H2000000 WS_EX_NOACTIVATE = &H8000000 End Enum <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=True)> _ Private Function SetWindowLong(ByVal hwnd As IntPtr, _ ByVal nIndex As Integer, _ ByVal dwNewLong As Integer) As Integer End Function <System.Runtime.InteropServices.DllImport("user32.dll", SetLastError:=False)> _ Private Function SetWindowPos(ByVal hwnd As IntPtr, _ ByVal hWndInsertAfter As IntPtr, _ ByVal X As Integer, _ ByVal y As Integer, _ ByVal cx As Integer, _ ByVal cy As Integer, _ ByVal wFlags As Integer) As Integer End Function <System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="GetWindowLongA", SetLastError:=True)> _ Private Function GetWindowLong(ByVal hWnd As IntPtr, _ <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.I4)> ByVal nIndex As Integer) As Integer End Function 'Estilo de la barra de título Public Sub ChangeStyleBarWindow(ByVal hwnd As IntPtr, ByVal StyleBar As Integer) SetWindowLong(hwnd, GWL_EXSTYLE, StyleBar) Call SetWindowPos(hwnd, HWND_NOTOPMOST, Nothing, Nothing, Nothing, Nothing, _ SWP_NOZORDER Or SWP_NOSIZE Or SWP_NOMOVE Or SWP_DRAWFRAME) End Sub End Module #End Region
EJEMPLO DE USOSi se aplican varias veces el mismo estilo se pueden obtener estilos curiosos. Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click For i As Integer = 0 To 5 modChangeStyleWindow.ChangeStyleWindow(Me.Handle, WindowsStyle.WS_SYSMENU_FIXEDSINGLE, True) Next i End Sub
para modo popup: modChangeStyleWindow.ChangeStyleWindow(Me.Handle, WindowsStyle.WS_POPUP, True)
Para invertir la barra de título: Call modChangeStyleBar.ChangeStyleBarWindow(Me.Handle, modChangeStyleBar.WStyleBarTitle.WStB_INVERT_CAPTIONRIGHT)
Invertido y desactivado: Call modChangeStyleWindow.ChangeStyleWindow(Me.Handle, modChangeStyleWindow.WindowsStyle.WS_DISABLED, True) Call modChangeStyleBar.ChangeStyleBarWindow(Me.Handle, modChangeStyleBar.WStyleBarTitle.WStB_INVERT_CAPTIONRIGHT)
Espero os sirva Sl2s
Se me olvidaba, para restaurar la ventana establecer 'False' 'Activa el cambio Call modChangeStyleWindow.ChangeStyleWindow(Me.Handle, modChangeStyleWindow.WindowsStyle.WS_DISABLED, True)
'Desactiva el cambio (en este caso se tendría que hacer con un timer o similar ya que WS_DISABLE no permite la interacción con el form ni con los controles que contiene) Call modChangeStyleWindow.ChangeStyleWindow(Me.Handle, modChangeStyleWindow.WindowsStyle.WS_DISABLED, False)
sl2s
|
|
|
50
|
Programación / .NET (C#, VB.NET, ASP) / Importar APIs
|
en: 24 Noviembre 2015, 00:45 am
|
Hola ///IMPORTAR APIs/// Quiero compartir esta código curioso para importar APIs de librerías DLL y de aplicaciones. Es muy útil. Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim DialogoAbrir As New System.Windows.Forms.OpenFileDialog DialogoAbrir.Title = "Abrir..." DialogoAbrir.FilterIndex = 1 DialogoAbrir.Filter = "*.dll|*.dll|*.exe|*.exe" DialogoAbrir.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System) If DialogoAbrir.ShowDialog() = DialogResult.OK Then ImportAPI(DialogoAbrir.FileName) End If End Sub Sub ImportAPI(ByVal Path_Dll As String) '//VB6 'Dim Path_Link As String = DirProgramFiles & "\Microsoft Visual Studio\VB98\link.exe" '****IMPORTANTE****: '//VB2010 'link.exe se encuentra en: 'C:\Archivos de programa\Microsoft Visual Studio 10.0\VC\bin\ 'Tiene dependencia con 'mspdb100.dll' que se encuentra en: 'C:\Archivos de programa\Microsoft Visual Studio 10.0\Common7\IDE 'Haz una copia de link.exe en ...\Common7\IDE de lo contrario dará error al no encontrar 'mspdb100.dll' '//VS2012 64bits 'link.exe se encuentra en: 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin 'mspdb100.dll' se encuentra en: 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE Dim DirProgramFiles As String If Environment.Is64BitOperatingSystem Then DirProgramFiles = (Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)) Else DirProgramFiles = (Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)) End If Dim Path_Link As String = (DirProgramFiles & "\Microsoft Visual Studio 10.0\Common7\IDE\link.exe") Dim FileTemp As String = System.IO.Path.GetTempFileName 'Crea un archivo temporal Dim C34 As String = Convert.ToChar(34) 'Linea de comandos para link.exe Dim StartLink As String = String.Format("{0}{1}{2} /dump /exports {3}{4}{5} /out:{6}{7}{8}", _ C34, Path_Link, C34, _ C34, Path_Dll, C34, _ C34, FileTemp, C34) Try 'Ejecuta link.exe Dim myProcess As New Process() myProcess.StartInfo.UseShellExecute = False myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden myProcess.StartInfo.FileName = StartLink myProcess.StartInfo.CreateNoWindow = True myProcess.Start() Catch ex As Exception MessageBox.Show("No se encuentra link.exe") End Try Me.Cursor = Cursors.WaitCursor System.Threading.Thread.Sleep(2000) Me.Cursor = Cursors.Default Dim strBuffer As New System.IO.StreamReader(FileTemp) TextBox1.Text = strBuffer.ReadToEnd strBuffer.Close() FileIO.FileSystem.DeleteFile(FileTemp) End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub End Class
Sl2
El método también se puede usar para obtener información a través de aplicaciones que usen comandos Este ejemplo obtiene es el resultado de hacer: ping www.google.es Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim sCommand As String = String.Format("""{0}"" /r ping {1} >", "cmd.exe", "www.elhacker.net") TextBox1.Text = GetResultCommand(sCommand) End Sub #Region "GetResultCommand" Public Function GetResultCommand(ByVal sCommandLine As String) As String Dim FileTemp As String = System.IO.Path.GetTempFileName 'Crea un archivo temporal Dim C34 As String = Convert.ToChar(34) Dim Result As String = Nothing sCommandLine = String.Format(sCommandLine & "{0}{1}{2}", C34, FileTemp, C34) Try Dim myProcess As New Process() With myProcess .StartInfo.UseShellExecute = False .StartInfo.WindowStyle = ProcessWindowStyle.Hidden .StartInfo.FileName = sCommandLine .StartInfo.CreateNoWindow = True .Start() End With Catch ex As Exception MessageBox.Show(ex.Message) End Try Me.Cursor = Cursors.WaitCursor System.Threading.Thread.Sleep(2000) Dim FileAccesible As Boolean = False While FileAccesible = False Try Dim strBuffer As New System.IO.StreamReader(FileTemp, System.Text.Encoding.GetEncoding("ibm850")) Result = strBuffer.ReadToEnd() FileAccesible = True strBuffer.Close() Catch ex As Exception FileAccesible = False End Try My.Application.DoEvents() End While Me.Cursor = Cursors.Default FileIO.FileSystem.DeleteFile(FileTemp) Return Result End Function #End Region End Class
Mediante este...snippet, supongo. Se obtendría el resultado de una línea de comandos que usáramos en la consola de windows: GetResultCommand(LÍNA DE COMANDO)
Es importante poner entre comillas la aplicación a la que llamamos: ""cmd.exe"" Dim sCommand As String = String.Format("""cmd.exe"" /r ping {0} ", "www.elhacker.net")
para menos lío también se puede llamar así: Dim sCommand As String = String.Format("""{0}"" /r ping {1} ", "cmd.exe", "www.elhacker.net")
el caso es que la aplicación quede entre comillas. [MODIFICACADO]Bueno, he hecho una pequeña modificación porque me he dado cuenta que claro, no todas las aplicaciones con comandos tienen el mismo comando de salida. Por ejemplo link.exe tiene /out: y cmd.exe tiene ' >'. Así que esto es mejor aplicarlo cuando establecemos el comando y no desde el snippet Con lo cual quedaría así con link.exe: Dim sCommand As String = String.Format("""{0}"" /dump /exports {1} /out:", _ "C:\Archivos de programa\Microsoft Visual Studio 10.0\Common7\IDE\link.exe", _ "c:\windows\system32\shell32.dll") TextBox1.Text = GetResultCommand(sCommand)
o así en con cmd.exe: Dim sCommand As String = String.Format("""{0}"" /r ping {1} >", "cmd.exe", "www.elhacker.net") TextBox1.Text = GetResultCommand(sCommand)
Y he modificado esta línea quitando '>': sCommandLine = String.Format(sCommandLine & "{0}{1}{2}", C34, FileTemp, C34)
También he añadido: System.Text.Encoding.GetEncoding("ibm850")
Que no se en otra compu, pero en la mía si no establezco esta codificación para leer el archivo no se ven correctamente las vocales con acento. ------------------------------------------------------- ALGUNOS COMANDOS INTERESANTES PARA OBTENER INFORMACIÓN Dim sCommand As String = String.Format("""{0}"" /r dir C: >", "cmd.exe") Dim sCommand As String = String.Format("""{0}"" /r ping {1} >", "cmd.exe", "www.elhacker.net") Para mostrar todo el contenido de la tabla de rutas IP Dim sCommand As String = String.Format("""{0}"" /r route print >", "cmd.exe") Muestra la configuración de TCP/IP completa de todos los adaptadores Dim sCommand As String = String.Format("""{0}"" /r ipconfig /all >", "cmd.exe") Muestra una lista de todos los controladores de dispositivo instalados y sus propiedades. [modo tabla] Dim sCommand As String = String.Format("""{0}"" /r driverquery >", "cmd.exe") [modo csv] Dim sCommand As String = String.Format("""{0}"" /r driverquery /fo csv >", "cmd.exe") Muestra los archivos en lista donde se ejecuta esta apliación Dim sCommand As String = String.Format("""{0}"" /r tree /f >", "cmd.exe") Muestra todos los archivos del directorio C: (puede tardar un poco según el disco) Dim sCommand As String = String.Format("""{0}"" /r tree c:\ /f >", "cmd.exe") [Este es muy buen comando] Muestra información de configuración detallada acerca de un equipo y su sistema operativo (puedes usar 'csv' o 'list' en lugar de 'table' Dim sCommand As String = String.Format("""{0}"" /r systeminfo /fo table >", "cmd.exe") Para obtener información de un determinado host (sistema) comando= 'systeminfo /s HOST /fo table' Para(obtener) 'HOST' escribe hostname en la consola y luego lo incorporas en el siguente comando, en este caso es 'mypc' Dim sCommand As String = String.Format("""{0}"" /r systeminfo /s mypc /fo table >", "cmd.exe") Muestra una lista de los servicios que se están ejecutando Dim sCommand As String = String.Format("""{0}"" /r Net start >", "cmd.exe") Muestra las conexiones activas Dim sCommand As String = String.Format("""{0}"" /r netstat >", "cmd.exe") Muestra todas las conexiones y puertos de escucha ' Dim sCommand As String = String.Format("""{0}"" /r netstat -a >", "cmd.exe") Muestra el ejecutable que crea cada conexión o puerto de(escucha) Dim sCommand As String = String.Format("""{0}"" /r netstat -b >", "cmd.exe") Muestra las estadísticas Ethernet. Se puede combinar con la opción()-s Dim sCommand As String = String.Format("""{0}"" /r netstat -e >", "cmd.exe") Muestra estadísticas por protocolo. De forma predeterminada, se muestran para IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP y UDPv; se puede utilizar la opción -p para especificar un subconjunto de los valores predeterminados Dim sCommand As String = String.Format("""{0}"" /r netstat -s >", "cmd.exe") CONSEJO: 'ALGUNOS COMANDOS PERMITEN USAR TRES TIPOS DE LISTA [LIST|CSV|TABLE] usando CSV puedes acceder fácilmente a la información usando SPLIT MODO CSV: "infoA","InfoB","infoC","InfoD" Ejemplo: Devuelve la dirección de control de acceso a medios (MAC, media access control) y lista de los protocolos de red asociados con cada la dirección de todas las tarjetas de red de cada equipo Dim sCommand As String = String.Format("""{0}"" /r getmac /fo csv /nh /v >", "cmd.exe") Dim sCommand As String = String.Format("""{0}"" /r getmac /s mypc /fo csv >", "cmd.exe") Espero que os sirva sl2
[ condejo] Para un TextBox u otro control de texto usa la fuente Courier New para que las tablas se muestren de forma ordenada.
|
|
|
|
|
|
|