Determina si un caracter es diacrítico o si contiene una marca diacrítica (no es 100% efectivo con caracteres demasiado raros de otras culturas)
Convierte un caracter diacritico
Obtiene el keyboardlayout
Obtiene el keycode de un caracter (ojo, no el keycode virtual).
Envio de peticion por el método POST
			Código (vbnet) [Seleccionar] 
    ' Character Is Diacritic?
    ' ( By Elektro )
    '
    ' Usage Examples:
    ' MsgBox(CharacterIsDiacritic("á")) ' Result: True
    '
    ''' <summary>
    ''' Determines whether a character is diacritic or else contains a diacritical mark.
    ''' </summary>
    ''' <param name="Character">Indicates the character.</param>
    ''' <returns><c>true</c> if character is diacritic or contains a diacritical mark, <c>false</c> otherwise.</returns>
    Public Function CharacterIsDiacritic(ByVal Character As Char) As Boolean
        If String.IsNullOrEmpty(CharacterIsDiacritic) Then
            Return False
        Else
            Dim Descomposed As Char() = Character.ToString.Normalize(System.Text.NormalizationForm.FormKD).ToCharArray
            Return (Descomposed.Count <> 1 OrElse String.IsNullOrWhiteSpace(Descomposed))
        End If
    End FunctionConvierte un caracter diacritico
Código (vbnet) [Seleccionar] 
    ' Convert Diacritic Character
    ' ( By Elektro )
    '
    ' Usage Examples:
    ' MsgBox(ConvertDiacritic("á", UnicodeNormalization:=System.Text.NormalizationForm.FormKD)) ' Result: 'a'
    '
    ''' <summary>
    ''' Converts the diacritic characters in a String to an equivalent normalized English characters.
    ''' </summary>
    ''' <param name="Character">
    ''' Indicates the diacritic character.
    ''' </param>
    ''' <param name="UnicodeNormalization">
    ''' Defines the type of Unicode character normalization to perform.
    ''' (Default is 'NormalizationForm.FormKD')
    ''' </param>
    ''' <returns>The converted character.</returns>
    Public Function ConvertDiacritic(ByVal Character As Char,
                                     Optional ByVal UnicodeNormalization As System.Text.NormalizationForm =
                                                                            System.Text.NormalizationForm.FormKD) As String
        Dim Chars As Char() =
            CStr(Character).Normalize(System.Text.NormalizationForm.FormKD).ToCharArray
        For Each c As Char In Chars
            Select Case Globalization.CharUnicodeInfo.GetUnicodeCategory(c)
                Case Globalization.UnicodeCategory.NonSpacingMark,
                     Globalization.UnicodeCategory.SpacingCombiningMark,
                     Globalization.UnicodeCategory.EnclosingMark
                    ' Do nothing.
                    Exit Select
                Case Else
                    Return c
            End Select
        Next c
        Return Character
    End FunctionObtiene el keyboardlayout
Código (vbnet) [Seleccionar] 
    ' Get Keyboard Layout
    ' ( By Elektro )
    '
    ' Usage Examples:
    ' MsgBox(GetKeyboardLayout(IntPtr.Zero)) ' Result: 10
    ' MsgBox(GetKeyboardLayout(Process.GetCurrentProcess.MainWindowHandle)) ' Result: 10
    '
    ''' <summary>
    ''' Retrieves the active input locale identifier (formerly called the keyboard layout).
    ''' </summary>
    ''' <param name="idThread">
    ''' A window handle identifier of the thread to query, or 'IntPtr.Zero' to query the current thread.
    ''' </param>
    ''' <returns>
    ''' The return value is the input locale identifier for the thread.
    ''' </returns>
    Public Shared Function GetKeyboardLayout(Optional ByVal idThread As IntPtr = Nothing) As Short
        Return BitConverter.GetBytes(APIGetKeyboardLayout(idThread)).First
    End Function
    ''' <summary>
    ''' Retrieves the active input locale identifier (formerly called the keyboard layout).
    ''' </summary>
    ''' <param name="idThread">
    ''' A window handle identifier of the thread to query, or 'IntPtr.Zero' to query the current thread.
    ''' </param>
    ''' <returns>
    ''' The return value is the input locale identifier for the thread.
    ''' 
    ''' The low-order byte contains a Language Identifier for the input language,
    ''' and the high-order byte contains a device handle to the physical layout of the keyboard.
    ''' </returns>
    <System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="GetKeyboardLayout",
    CharSet:=System.Runtime.InteropServices.CharSet.Unicode)>
    Private Shared Function APIGetKeyboardLayout(
                            Optional ByVal idThread As IntPtr = Nothing
    ) As UInteger
    End FunctionObtiene el keycode de un caracter (ojo, no el keycode virtual).
Código (vbnet) [Seleccionar] 
    ' Get KeyCode
    ' ( By Elektro )
    '
    ' Usage Examples:
    ' MsgBox(GetKeyCode("a")) ' Result: 65
    ' MsgBox(GetKeyCode("á")) ' Result: 65
    ' MsgBox(GetKeyCode("á", IntPtr.Zero)) ' Result: 65
    ' MsgBox(GetKeyCode("a", Process.GetCurrentProcess.MainWindowHandle)) ' Result: 65
    '
    'Private Sub Test() Handles MyBase.Shown
    '    Dim sb As New System.Text.StringBuilder
    '    Dim Characters As Char() = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ñÑçÇ áéíóú ÁÉÍÓÚ àèìòù ÀÈÌÒÙ äëïÖÜ ÄËÏÖÜ º\'¡`+´-.,ª!·$%&/()=?¿".ToCharArray
    '    For Each c As Char In Characters
    '        sb.AppendFormat("Character: {0}", CStr(c))
    '        sb.AppendLine()
    '        sb.AppendFormat("KeyCode  : {0}", CStr(GetKeyCode(c, IntPtr.Zero)))
    '        MessageBox.Show(sb.ToString)
    '        sb.Clear()
    '    Next c
    'End Sub
    ''' <summary>
    ''' Translates a character to the corresponding keycode. 
    ''' </summary>
    ''' <param name="Character">Indicates the character.</param>
    ''' <param name="KeyboardLayout">Indicates the keyboard layout.</param>
    ''' <returns>
    ''' If the function succeeds, the return value contains the keycode.
    ''' 
    ''' If the function finds no key that translates to the passed character code, 
    ''' the return value contains "-1".
    ''' </returns>
    Public Shared Function GetKeyCode(ByVal Character As Char,
                                      Optional ByVal KeyboardLayout As IntPtr = Nothing) As Short
        ' Get the Keycode of the character.
        Dim Keycode As Short =
            BitConverter.GetBytes(VkKeyScanEx(Character)).First
        Select Case Keycode
            Case Is <> 255S ' Character is found on the current KeyboardLayout.
                Return Keycode
            Case Else ' Character is not found on the current KeyboardLayout.
                ' Descompose the character.
                Dim Descomposed As Char() =
                    Character.ToString.Normalize(System.Text.NormalizationForm.FormKD).ToCharArray
                ' If character is diacritic then...
                If Descomposed.Count <> 1 OrElse String.IsNullOrWhiteSpace(Descomposed) Then
                    For Each c As Char In Descomposed
                        Select Case Globalization.CharUnicodeInfo.GetUnicodeCategory(c)
                            Case Globalization.UnicodeCategory.NonSpacingMark,
                                 Globalization.UnicodeCategory.SpacingCombiningMark,
                                 Globalization.UnicodeCategory.EnclosingMark
                                ' Do nothing.
                                Exit Select
                            Case Else ' Character is diacritic so we convert the diacritic and try to find the Keycode.
                                Return GetKeyCode(c, KeyboardLayout)
                        End Select
                    Next c
                End If ' Chars.Count <> 1
        End Select ' Keycode
        Return -1S ' Character is not diacritic and the keycode is not found.
    End Function
    ''' <summary>
    ''' Translates a character to the corresponding virtual-key code and shift state. 
    ''' The function translates the character using the input language and 
    ''' physical keyboard layout identified by the input locale identifier.
    ''' For more info see here:
    ''' http://msdn.microsoft.com/en-us/library/ms646332%28v=VS.85%29.aspx 
    ''' </summary>
    ''' <param name="c">Indicates the character.</param>
    ''' <param name="KeyboardLayout">Indicates the keyboard layout.</param>
    ''' <returns>
    ''' If the function succeeds, 
    ''' the low-order byte of the return value contains the virtual-key code,
    ''' and the high-order byte contains the shift state.
    ''' 
    ''' If the function finds no key that translates to the passed character code, 
    ''' both the low-order and high-order bytes contain '255'.
    ''' </returns>
    <System.Runtime.InteropServices.DllImport("user32.dll",
    CharSet:=System.Runtime.InteropServices.CharSet.Unicode)>
    Private Shared Function VkKeyScanEx(
                            ByVal c As Char,
                            Optional ByVal KeyboardLayout As IntPtr = Nothing
    ) As Short
    End FunctionEnvio de peticion por el método POST
Código (vbnet) [Seleccionar] 
    ' Send POST
    ' ( By Elektro )
    '
    ' Usage Examples:
    '
    'Dim Response As String =
    '    SendPOST("http://es.wikipedia.org/wiki/Special:Search?",
    '             New Dictionary(Of String, String) From {
    '                 {"search", "Petición+POST"},
    '                 {"sourceid", "Mozilla-search"}
    '             }) ' Formated POST Data: "search=Petición+POST&sourceid=Mozilla-search"
    'Clipboard.SetText(Response) ' Copy the response to Clipboard.
    '
    ''' <summary>
    ''' Sends a POST method petition and returns the server response.
    ''' </summary>
    ''' <param name="URL">Indicates the URL.</param>
    ''' <param name="PostData">Indicates the post data.</param>
    ''' <returns>The response.</returns>
    Public Function SendPOST(ByVal URL As String,
                             ByVal PostData As Dictionary(Of String, String)) As String
        Dim Data As New System.Text.StringBuilder ' PostData to send, formated.
        Dim Request As Net.HttpWebRequest = HttpWebRequest.Create(URL) ' HTTP Request.
        Dim Response As HttpWebResponse ' Server response.
        Dim ResponseContent As String ' Server response result.
        ' Set and format the post data of the query.
        For Each Item As KeyValuePair(Of String, String) In PostData
            Data.AppendFormat("{0}={1}&", Item.Key, Item.Value)
        Next Item
        ' Set the Request properties.
        With Request
            .Method = "POST"
            .ContentType = "application/x-www-form-urlencoded"
            .ContentLength = Data.ToString.Length
            .Proxy = Nothing
            ' .UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"
        End With
        ' Write the POST data bytes into the Stream.
        Using RequestStream As IO.Stream = Request.GetRequestStream()
            RequestStream.Write(System.Text.Encoding.UTF8.GetBytes(Data.ToString), 0, Data.ToString.Length)
            RequestStream.Close()
        End Using
        ' Get the response.
        Response = Request.GetResponse()
        ' Get the response content.
        Using Reader As New IO.StreamReader(Response.GetResponseStream)
            ResponseContent = Reader.ReadToEnd
            Response.Close()
        End Using
        ' Return the response content.
        Return ResponseContent
    End Function
				
.