Advertisement

05.02.2005 at 06:11AM PDT, ID: 21409380
[x]
Attachment Details
[x]
The Solution Rating System

With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.

  • The Grade of the Solution
  • The Zone Rank of the Expert Providing the Solution
  • The Number of Author and Expert Comments
  • The Number of Experts Contributing
  • The Feedback of the Community

Your Input Matters
Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.

If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.

Thank you!

How to determine whether other languages have been installed in "Regional Options"

Zone: VB Controls
My application is in VB6 and has the ability to dynamically change the entire program to one of 15 languages. Many of these languages such as French, Danish, Estonian, German, etc. can utilize the US English System Language under the Regional Options. Others such as Korean, Japanese, Russian, Farsi need the system language option changed to their respective lanugage in order to have the menus in the language. This works fine as long as the correct input Text Service keyboard is chosen.
I find that I can keep the VB6 menus in English, as an option, when choosing, for example Russian, but still input Russian into a RTF control if the Russian input system keyboard has been loaded beforehand.

Finally, my question is: how can I ascertain what Regional Options | Text Service keyboards have been installed in the system so that I can alert the user what keyboards are available? Also what other foreign language  codepages have been installed.
Gary
Start your free trial to view this solution
Question Stats
Zone: Programming
Question Asked By: garyLittle
Solution Provided By: danaseaman
Participating Experts: 2
Solution Grade: A
Views: 9
Translate:
Loading Advertisement...
05.02.2005 at 07:48AM PDT, ID: 13909445

Rank: Master

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.02.2005 at 07:51AM PDT, ID: 13909479

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.02.2005 at 08:04AM PDT, ID: 13909609

Rank: Master

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.02.2005 at 08:15AM PDT, ID: 13909723

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.02.2005 at 08:47AM PDT, ID: 13910035

Rank: Master

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.02.2005 at 01:19PM PDT, ID: 13912471

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.02.2005 at 01:59PM PDT, ID: 13912856

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.02.2005 at 04:25PM PDT, ID: 13913783

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.02.2005 at 06:16PM PDT, ID: 13914298

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.02.2005 at 07:40PM PDT, ID: 13914645

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.02.2005 at 11:48PM PDT, ID: 13915572

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.03.2005 at 07:34AM PDT, ID: 13918267

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
05.03.2005 at 08:11AM PDT, ID: 13918620

Rank: Guru

All comments and solutions are available to Premium Service Members only.

Start your 7 day free trial and see for yourself why Experts Exchange is the easiest and most proven technology resource in the world. Get Started

Already a member? Login to view this solution.

 
 
Loading Advertisement...
Microsoft
  • Internet Protocols
  • Applications
  • Development
  • OS
  • Hardware
  • Windows Security
Apple
  • Operating Systems
  • Hardware
  • Programming
  • Networking
  • Software
Internet
  • Search Engines
  • File Sharing
  • WebTrends / Stats
  • Spy / Ad Blockers
  • Web Browsers
  • New Net Users
  • Web Development
  • Chat / IM
  • Anti Spam
  • Web Servers
  • Anti-Virus
  • Email Clients
Gamers
  • Tips
  • Online / MMORPG
  • Puzzle
  • Emulators
  • Action / Adventure
  • Role Playing
  • Consoles
  • Game Programming
  • Strategy
  • Sports
  • Misc
  • Computer Games
Digital Living
  • Hardware
  • New Net Users
  • New Users
  • Software
  • Digital Music
  • Gaming World
  • Home Security
  • Apple
  • Networking Hardware
Virus & Spyware
  • Vulnerabilities
  • IDS
  • Encryption
  • Anti-Virus
  • Operating Systems Security
  • Software Firewalls
  • WebApplications
  • Cell Phones
  • Operating Systems
  • Internet
  • Hardware Firewalls
Hardware
  • Handhelds / PDAs
  • Displays / Monitors
  • Components
  • Networking Hardware
  • Peripherals
  • Laptops/Notebooks
  • Storage
  • Servers
  • Desktops
  • New Users
  • Misc
  • Apple
Software
  • System Utilities
  • Industry Specific
  • Network Management
  • Photos / Graphics
  • Page Layout
  • VMWare
  • Misc
  • Web Development
  • OS
  • CYGWIN
  • Voice Recognition
  • Message Queue
  • Quality Assurance
  • Security
  • Firewalls
  • MultiMedia Applications
  • Development
  • Database
  • Office / Productivity
  • Business Management
  • OS/2 Apps
  • Server Software
  • Internet / Email
ITPro
  • OS
  • Storage
  • Encryption
  • Operating Systems Security
  • Apple Hardware
  • Laptops & Notebooks
  • Servers
  • Networking Hardware
  • Peripherals
  • Devices
  • Displays / Monitors
  • WebTrends / Stats
  • Search Engines
  • Firewalls
  • WebApplications
  • IDS
  • Vulnerabilities
  • Email Clients
  • File Sharing
  • Spy / Ad Blockers
  • Web Browsers
  • Web Servers
  • Networking
  • Anti-Virus
  • Chat / IM
  • Anti Spam
Developer
  • Web Servers
  • Web Browsers
  • Game Programming
  • Dev Tools
  • Industry Specific
  • Office / Productivity
  • Database
  • CYGWIN
  • Web Development
  • Search Engines
  • File Sharing
  • WebTrends / Stats
  • Programming
  • Content Management
  • Application Servers
  • Protocols
Storage
  • Removable Backup Media
  • Storage Technology
  • Servers
  • Grid
  • Remote Access
  • Backup / Restore
  • Misc
  • Hard Drives
OS
  • Miscellaneous
  • Security
  • Development
  • Linux
  • VMWare
  • MainFrame OS
  • Unix
  • Apple
  • OS / 2
  • AS / 400
  • BeOS
  • Microsoft
  • VMS / OpenVMS
Database
  • Oracle
  • Miscellaneous
  • MySQL
  • Software
  • Sybase
  • Contact Management
  • PostgreSQL
  • Data Manipulation
  • Clarion
  • InterSystems Cache
  • Siebel
  • MUMPS
  • OLAP
  • SQLBase
  • SAS
  • GIS & GPS
  • 4GL
  • Berkeley DB
  • DB2
  • Informix
  • Interbase / Firebird
  • FoxPro
  • Reporting
  • LDAP
  • Filemaker Pro
  • MS SQL Server
  • dBase
  • MS Access
Security
  • Misc
  • Web Browsers
  • Software Firewalls
  • Operating Systems Security
  • File Sharing
  • Spy / Ad Blockers
  • Vulnerabilities
  • WebApplications
  • IDS
  • Anti-Virus
  • Encryption
  • Anti Spam
  • Email Clients
  • VPN
  • Chat / IM
Programming
  • Editors IDEs
  • Installation
  • Handhelds / PDAs
  • Multimedia Programming
  • System / Kernel
  • Algorithms
  • Game
  • Signal Processing
  • Project Management
  • Open Source
  • Database
  • Misc
  • Languages
  • Processor Platforms
  • Theory
Web Development
  • Scripting
  • Blogs
  • Web Servers
  • Software
  • Search Engines
  • Web Graphics
  • Images
  • Internet Marketing
  • Images and Photos
  • Components
  • Document Imaging
  • Web Languages/Standards
  • Illustration
  • WebApplications
  • Fonts
  • WebTrends / Stats
  • Authoring
  • Digital Camera Software
  • Miscellaneous
Networking
  • Protocols
  • Apple Networking
  • Network Management
  • Message Queue
  • Application Servers
  • Content Management
  • File Servers
  • Email Servers
  • Misc
  • Java Editors & IDEs
  • Wireless
  • Networking Hardware
  • Backup / Restore
  • System Utilities
  • ISPs & Hosting
  • Web Servers
  • Storage Technology
  • Removable Backup Media
  • Servers
  • Broadband
  • Grid
  • OS / 2
  • Novell Netware
  • Unix Networking
  • Windows Networking
  • Security
  • Telecommunications
  • Operating Systems
  • Linux Networking
Other
  • Community Advisor
  • Lounge
  • Community Support
  • New Net Users
  • Philosophy / Religion
  • Math / Science
  • Miscellaneous
  • URLs
  • Expert Lounge
  • Politics
  • Puzzles / Riddles
Community Support
  • Suggestions
  • New to EE
  • New Topics
  • Community Advisor
  • CleanUp
  • Announcements
  • General
  • Feedback
  • Input
  • EE Bugs
 
05.02.2005 at 07:48AM PDT, ID: 13909445

Rank: Master

Hi, garyLittle.

Please see the following EE link regarding determining a PC's Regional Options settings:

http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/VB_Controls/Q_21208243.html?query=Regional+Options&topics=94
 
05.02.2005 at 07:51AM PDT, ID: 13909479
Edwardiii,
I did see that but I am interested in what language keyboards have been installed. I don't think the above link addresses that. Maybe I am wrong.
 
05.02.2005 at 08:04AM PDT, ID: 13909609

Rank: Master

This MSDN page breaks down the various language choices:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_9l2r.asp

For example, German (Standard) has an identifier of "0x0407".  You can input the "0407" in Windows' Scientific Calculator with it set to "Hex", then click "Dec" and the result is: 1031.
 
05.02.2005 at 08:15AM PDT, ID: 13909723
Thank you. This is an excellent resource.
But I think I have not correctly identified the problem I am having.
I need to query the operating system to see if the Farsi or Korean or Japanese keyboard handlers have been installed. These do not normally come already installed in WinXP system. You have to go to the Regional Options and install these keyboards. I need to know if the user has done this on their system.
 
05.02.2005 at 08:47AM PDT, ID: 13910035

Rank: Master

Take a look at this link:http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_20387081.html

You can modify it slightly as follows:

Command button to list available language layouts on system:

Dim lOriginalLayout As Long
    Dim lRet As Long
    Dim i As Integer

    ReDim lLayouts(50) As Long

    'Save current configuration
    lOriginalLayout = GetKeyboardLayout(0)

    'Get the first 50 supported keyboard layouts (50 is max supported for now)
    lRet = GetKeyboardLayoutList(50, lLayouts(0))
    'Loop through all the keyboard layouts
    For i = 0 To UBound(lLayouts)
        If lLayouts(i) = 0 Then
            Exit For
        End If
        'Activate the keyboard layout and get its name
        lRet = ActivateKeyboardLayout(lLayouts(i), 0)
        'you can populate a listbox/multiline textbox, etc. here based on lRet's value
    Next i
   
    'Restore current configuration
    lRet = ActivateKeyboardLayout(lOriginalLayout, 0)
 
05.02.2005 at 01:19PM PDT, ID: 13912471

Rank: Guru

' Form Code:
Option Explicit
Private Sub Form_Load()
   Dim i As Long
   Dim vLayouts As Variant
   vLayouts = GetKybdLayouts
   For i = 0 To UBound(vLayouts)
      Debug.Print vLayouts(i)
   Next
End Sub

'Module Code
Option Explicit

Private Declare Function GetKeyboardLayout& Lib "user32" (ByVal dwLayout As Long)
Private Declare Function GetKeyboardLayoutList& Lib "user32" (ByVal nBuff As Long, lpList As Long)
Private Declare Function ActivateKeyboardLayout& Lib "user32" (ByVal hkl As Long, ByVal flags As Long)
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Private Declare Function GetLocaleInfoA Lib "KERNEL32" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Const KL_NAMELENGTH As Long = 9
Const LOCALE_SENGCOUNTRY As Long = &H1002 '// English name of country
Private buf As String * KL_NAMELENGTH

Public Function GetKybdLayouts() As Variant
   Dim lOriginalLayout  As Long
   Dim lRet             As Long
   Dim i                As Integer

   ReDim lLayouts(50) As Long
   Dim sLayouts() As String

   'Save current configuration
   lOriginalLayout = GetKeyboardLayout(0)

   'Get the first 50 supported keyboard layouts (50 is max supported for now)
   lRet = GetKeyboardLayoutList(50, lLayouts(0))
   'Loop through all the keyboard layouts
   For i = 0 To UBound(lLayouts)
      If lLayouts(i) = 0 Then
         Exit For
      End If
      'Activate the keyboard layout and get its name
      lRet = ActivateKeyboardLayout(lLayouts(i), 0)
      'you can populate a listbox/multiline textbox, etc. here based on lRet's value
      lRet = GetKeyboardLayoutName(buf)
      'Debug.Print "KeyboardLayoutName=", buf, pfGLI(("&H" & Right$(buf, 3)), LOCALE_SENGCOUNTRY)
      ReDim Preserve sLayouts(i)
      sLayouts(i) = pfGLI(("&H" & Right$(buf, 3)), LOCALE_SENGCOUNTRY)
     
   Next i
   GetKybdLayouts = sLayouts
   'Restore current configuration
   lRet = ActivateKeyboardLayout(lOriginalLayout, 0)

End Function

Private Function pfGLI(ByVal m_LocaleLCID As Long, ByVal reqInfo As Long) As String
   Dim Buffer          As String * 255
   GetLocaleInfoA m_LocaleLCID, reqInfo, Buffer, 255
   pfGLI = StripNull(Buffer)
End Function

Public Function StripNull(ByVal StrIn As String) As String
   Dim nul              As Long
   nul = InStr(StrIn, vbNullChar)
   Select Case nul
      Case Is > 1
         StripNull = Left$(StrIn, nul - 1)
      Case 1
         StripNull = ""
      Case 0
         StripNull = Trim$(StrIn)
   End Select
End Function
 
05.02.2005 at 01:59PM PDT, ID: 13912856

Rank: Guru

'This codewill enumerate what languages are installed(LCID)

'Form Code
Option Explicit

Dim WithEvents cEnumLCID As clsEnumLCID

Private Sub cEnumLCID_EnumLocales(ByVal LCID As Long)
   List1.AddItem Hex$(LCID) & vbTab & LCID & vbTab & _
                 pfGLI(LCID, LOCALE_SABBREVLANGNAME) & vbTab & _
                 pfGLI(LCID, LOCALE_SLANGUAGE)
End Sub

Private Sub cmdLoadLocales_Click()

   Dim LCID             As Long
   Set cEnumLCID = New clsEnumLCID
   'get the user's current default ID
   LCID = GetSystemDefaultLCID()

   'show the current localized name of language
   Text1.Text = pfGLI(LCID, LOCALE_SLANGUAGE) & vbTab & _
      pfGLI(LCID, LOCALE_SABBREVLANGNAME)

   LocaleCount = 0
   List1.Clear
   List1.AddItem "Installed Locales:"
   List1.AddItem "Hex" & vbTab & "Dec" & vbTab & "Abv" & vbTab & "Language"
   List1.AddItem "---" & vbTab & "---" & vbTab & "---" & vbTab & "--------"
   cEnumLCID.EnumInstalledLocales
   lblInstalled.Caption = LocaleCount & " Installed"
   Set cEnumLCID = Nothing
End Sub

Private Sub Form_Unload(Cancel As Integer)
   Set cEnumLCID = Nothing
End Sub

'Module Code (modEnumLCID)
Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copyright ©1996-2004 VBnet, Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Distribution: You can freely use this code in your own
'               applications, but you may not reproduce
'               or publish this code on any web site,
'               online service, or distribute as source
'               on any media without express permission.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Const LOCALE_SLANGUAGE       As Long = &H2  'localized name of language
Public Const LOCALE_SABBREVLANGNAME As Long = &H3  'abbreviated language name
Public Const LCID_INSTALLED         As Long = &H1  'installed locale ids
Public Const LCID_SUPPORTED         As Long = &H2  'supported locale ids
Public Const LCID_ALTERNATE_SORTS   As Long = &H4  'alternate sort locale ids
Public Const VER_PLATFORM_WIN32_NT  As Long = 2

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Public Declare Function GetLocaleInfoA Lib "kernel32" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Public Declare Function GetLocaleInfoW Lib "kernel32" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long
Public Declare Function GetUserDefaultLCID Lib "kernel32" () As Long

Public Declare Function EnumSystemLocales Lib "kernel32" Alias "EnumSystemLocalesA" (ByVal lpLocaleEnumProc As Long, ByVal dwFlags As Long) As Long

Public Type OSVERSIONINFO
   dwOSVersionInfoSize  As Long
   dwMajorVersion       As Long
   dwMinorVersion       As Long
   dwBuildNumber        As Long
   dwPlatformId         As Long
   szCSDVersion         As String * 128 ' Maintenance string
End Type

Private Buffer       As String * 255
Private m_lObj       As Long
Public LocaleCount   As Long

Public Function EnumSystemLocalesProc(lpLocaleString As Long) As Long

  'application-defined callback function for EnumSystemLocales

   Dim pos As Integer
   Dim dwLocaleDec As Long
   Dim dwLocaleHex As String
   Dim sLocaleName As String
   Dim sLocaleAbbrev As String
     
  'pad a string to hold the format
   dwLocaleHex = Space$(32)
   
  'copy the string pointed to by the return value
   CopyMemory ByVal dwLocaleHex, lpLocaleString, ByVal Len(dwLocaleHex)
   
   dwLocaleHex = Right$(StripNull(dwLocaleHex), 4)
   dwLocaleDec = CLng("&H" & dwLocaleHex)
   'sLocaleName = pfGLI(dwLocaleDec, LOCALE_SLANGUAGE)
   'sLocaleAbbrev = pfGLI(dwLocaleDec, LOCALE_SABBREVLANGNAME)
   LocaleCount = LocaleCount + 1
   theCtrl.fReturnLocale dwLocaleDec
   'frmEnumLCID.List1.AddItem "   " & dwLocaleHex & vbTab & _
                               dwLocaleDec & vbTab & _
                               sLocaleAbbrev & vbTab & _
                               sLocaleName
   
  'and return 1 to continue enumeration
   EnumSystemLocalesProc = 1
   
End Function

Public Property Let theCtrl(ByVal nCtrl As clsEnumLCID)
   m_lObj = ObjPtr(nCtrl)
End Property

Public Property Get theCtrl() As clsEnumLCID
   Dim ct As clsEnumLCID
   If (m_lObj <> 0) Then
      CopyMemory ct, m_lObj, 4
      Set theCtrl = ct
      CopyMemory ct, 0&, 4
   End If
End Property

Public Function pfGLI(ByVal m_LocaleLCID As Long, ByVal reqInfo As Long) As String
   If IsNT Then
      GetLocaleInfoW m_LocaleLCID, reqInfo, Buffer, 255
      pfGLI = StripNull(StrConv(Buffer, vbFromUnicode))
   Else
      GetLocaleInfoA m_LocaleLCID, reqInfo, Buffer, 255
      pfGLI = StripNull(Buffer)
   End If
End Function

Public Function IsNT() As Boolean
   Dim udtVer           As OSVERSIONINFO

   On Error Resume Next
   udtVer.dwOSVersionInfoSize = Len(udtVer)
   If GetVersionEx(udtVer) Then
      If udtVer.dwPlatformId = VER_PLATFORM_WIN32_NT Then
         IsNT = True
      End If
   End If
End Function

Public Function StripNull(ByVal StrIn As String) As String
   Dim nul              As Long
   nul = InStr(StrIn, vbNullChar)
   Select Case nul
      Case Is > 1
         StripNull = Left$(StrIn, nul - 1)
      Case 1
         StripNull = ""
      Case 0
         StripNull = Trim$(StrIn)
   End Select
End Function


Public Function pfMAKELCID(PLang As Long, SLang As Long) As Long
   Dim tX               As Long
   tX = SLang * 2 ^ 10
   tX = tX Or PLang
   pfMAKELCID = tX
End Function

Public Function pfPrimaryLang(ByVal LCID As Long) As Long
   pfPrimaryLang = LCID Mod 1024
End Function

Public Function pfSecondaryLang(ByVal LCID As Long) As Long
   pfSecondaryLang = LCID \ 2 ^ 10
End Function

'Class code (clsEnumLCID)
Option Explicit

Public Event EnumLocales(ByVal LCID As Long)

Public Sub EnumInstalledLocales()
   EnumSystemLocales AddressOf EnumSystemLocalesProc, LCID_INSTALLED
End Sub

Public Sub EnumSupportedLocales()
   EnumSystemLocales AddressOf EnumSystemLocalesProc, LCID_SUPPORTED
End Sub

Public Function fReturnLocale(ByVal LCID As Long)
   RaiseEvent EnumLocales(LCID)
End Function

Private Sub Class_Initialize()
   theCtrl = Me
End Sub

Accepted Solution
 
05.02.2005 at 04:25PM PDT, ID: 13913783
Thanks to you  danaseaman. Both your last two were perfect!!
Thanks for sticking with me. This is everything I need.
Gary
 
05.02.2005 at 06:16PM PDT, ID: 13914298

Rank: Guru

One unresolved issue is separating the Primary Language ID and Secondary Language ID from data returned by GetKeyboardLayoutName. On my box I should get Primary "Portuguese" and Secondary "Brazilian". The current code I posted only returns Portuguese which would lead one to believe it is "Iberian".  I'll post results as soon as I get this coded.
 
05.02.2005 at 07:40PM PDT, ID: 13914645

Rank: Guru

Updated code (encapsulated in a class) returns LCID for each Keyboard installed. Example output on my box:
LCID - LOCALE_SLANGUAGE
-----------------------
416 - Português (Brasil)
401 - Árabe (Arábia Saudita)
804 - Chinês (República Popular da China)
404 - Chinês (Taiwan)
412 - Coreano
409 - Inglês (Estados Unidos)
816 - Português (Portugal)
412 - Coreano

'Form code
Option Explicit

Const LOCALE_SENGCOUNTRY   As Long = &H1002 '// English name of country
Const LOCALE_SLANGUAGE     As Long = &H2   '// localized name of language
Const LOCALE_SENGLANGUAGE  As Long = &H1001   '// English name of language

Dim WithEvents KL As clsKeyboardLayout

Private Sub Form_Load()
   Set KL = New clsKeyboardLayout
   Debug.Print "LCID - LOCALE_SLANGUAGE"
   Debug.Print "-----------------------"
   KL.EnumKybdLayouts
   Unload Me
End Sub

Private Sub KL_EnumKybdLayouts(ByVal LCID As Long)
   Debug.Print Hex(LCID) & " - " & KL.pfGLI(LCID, LOCALE_SLANGUAGE)
End Sub

'Class code - clsKeyboardLayout
Option Explicit

Public Event EnumKybdLayouts(ByVal LCID As Long)

Private Declare Function GetKeyboardLayout& Lib "user32" (ByVal dwLayout As Long)
Private Declare Function GetKeyboardLayoutList& Lib "user32" (ByVal nBuff As Long, lpList As Long)
Private Declare Function ActivateKeyboardLayout& Lib "user32" (ByVal hkl As Long, ByVal flags As Long)
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Private Declare Function GetLocaleInfoA Lib "KERNEL32" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Const KL_NAMELENGTH        As Long = 9
Const LOCALE_SENGCOUNTRY   As Long = &H1002 '// English name of country
Const LOCALE_SLANGUAGE     As Long = &H2   '// localized name of language
Private buf As String * KL_NAMELENGTH

Public Sub EnumKybdLayouts()
   Dim lOriginalLayout  As Long
   Dim lRet             As Long
   Dim i                As Integer

   ReDim lLayouts(50) As Long
   Dim LCID             As Long

   'Save current configuration
   lOriginalLayout = GetKeyboardLayout(0)

   'Get the first 50 supported keyboard layouts (50 is max supported for now)
   lRet = GetKeyboardLayoutList(50, lLayouts(0))
   'Loop through all the keyboard layouts
   For i = 0 To UBound(lLayouts)
      If lLayouts(i) = 0 Then
         Exit For
      End If
      'Activate the keyboard layout and get its name
      lRet = ActivateKeyboardLayout(lLayouts(i), 0)
      lRet = GetKeyboardLayout(0&)
      LCID = LoWord(lRet)
      RaiseEvent EnumKybdLayouts(LCID)
   Next i

   'Restore current configuration
   lRet = ActivateKeyboardLayout(lOriginalLayout, 0)

End Sub

Public Function pfGLI(ByVal m_LocaleLCID As Long, ByVal reqInfo As Long) As String
   Dim Buffer          As String * 255
   GetLocaleInfoA m_LocaleLCID, reqInfo, Buffer, 255
   pfGLI = StripNull(Buffer)
End Function

Private Function LoWord(wParam As Long) As Integer
   If wParam And &H8000& Then
      LoWord = &H8000& Or (wParam And &H7FFF&)
   Else
      LoWord = wParam And &HFFFF&
   End If
End Function

Private Function StripNull(ByVal StrIn As String) As String
   Dim nul              As Long
   nul = InStr(StrIn, vbNullChar)
   Select Case nul
      Case Is > 1
         StripNull = Left$(StrIn, nul - 1)
      Case 1
         StripNull = ""
      Case 0
         StripNull = Trim$(StrIn)
   End Select
End Function
 
05.02.2005 at 11:48PM PDT, ID: 13915572
Thanks again. I will try it today.
One other issue is:
Can I change the keyboard layout from the program. for example, change from USenglish to Russian?
Gary
 
05.03.2005 at 07:34AM PDT, ID: 13918267

Rank: Guru

The code as is remembers the current Keyboard and as it steps thru the list activates the keyboard with with list item to retrieve LCID and finally restores the current keyboard at the end. Should be a simple code modification to implement this. I'll post it later today.
 
05.03.2005 at 08:11AM PDT, ID: 13918620

Rank: Guru

Modified code to set kybd layout to specified LCID. LCID should be supplied as long. Example English= 1033 or you could supply English= &H409 which is the Hex equivalent. It will set new Keyboard Layout if it is available(installed) otherwise it will retain the current keyboard layout.

'Form code
Option Explicit

Const LOCALE_SENGCOUNTRY   As Long = &H1002 '// English name of country
Const LOCALE_SLANGUAGE     As Long = &H2   '// localized name of language
Const LOCALE_SENGLANGUAGE  As Long = &H1001   '// English name of language

Dim WithEvents KL As clsKeyboardLayout

Private Sub Form_Load()
   Set KL = New clsKeyboardLayout
   Debug.Print "LCID - LOCALE_SLANGUAGE"
   Debug.Print "-----------------------"
   KL.EnumKybdLayouts &H409
   Unload Me
End Sub

Private Sub KL_EnumKybdLayouts(ByVal LCID As Long)
   Debug.Print Hex(LCID) & " - " & KL.pfGLI(LCID, LOCALE_SLANGUAGE)
End Sub

'Class code - clsKeyboardLayout
Option Explicit

Public Event EnumKybdLayouts(ByVal LCID As Long)

Private Declare Function GetKeyboardLayout& Lib "user32" (ByVal dwLayout As Long)
Private Declare Function GetKeyboardLayoutList& Lib "user32" (ByVal nBuff As Long, lpList As Long)
Private Declare Function ActivateKeyboardLayout& Lib "user32" (ByVal hkl As Long, ByVal flags As Long)
Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Private Declare Function GetLocaleInfoA Lib "KERNEL32" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Const KL_NAMELENGTH        As Long = 9
Const LOCALE_SENGCOUNTRY   As Long = &H1002 '// English name of country
Const LOCALE_SLANGUAGE     As Long = &H2   '// localized name of language
Private buf As String * KL_NAMELENGTH

Public Sub EnumKybdLayouts(Optional ByVal NewLayoutLCID As Long = 0)
   Dim lOriginalLayout  As Long
   Dim lRet             As Long
   Dim i                As Integer

   ReDim lLayouts(50) As Long
   Dim LCID             As Long

   'Save current configuration
   lOriginalLayout = GetKeyboardLayout(0)

   'Get the first 50 supported keyboard layouts (50 is max supported for now)
   lRet = GetKeyboardLayoutList(50, lLayouts(0))
   'Loop through all the keyboard layouts
   For i = 0 To UBound(lLayouts)
      If lLayouts(i) = 0 Then
         Exit For
      End If
      'Activate the keyboard layout and get its name
      lRet = ActivateKeyboardLayout(lLayouts(i), 0)
      lRet = GetKeyboardLayout(0&)
      LCID = LoWord(lRet)
      If NewLayoutLCID = LCID Then
         lOriginalLayout = lRet
      End If
     
      RaiseEvent EnumKybdLayouts(LCID)
   Next i

   'Restore current (or requested if available) configuration
   lRet = ActivateKeyboardLayout(lOriginalLayout, 0)

End Sub

Public Function pfGLI(ByVal m_LocaleLCID As Long, ByVal reqInfo As Long) As String
   Dim Buffer          As String * 255
   GetLocaleInfoA m_LocaleLCID, reqInfo, Buffer, 255
   pfGLI = StripNull(Buffer)
End Function

Private Function LoWord(wParam As Long) As Integer
   If wParam And &H8000& Then
      LoWord = &H8000& Or (wParam And &H7FFF&)
   Else
      LoWord = wParam And &HFFFF&
   End If
End Function

Private Function StripNull(ByVal StrIn As String) As String
   Dim nul              As Long
   nul = InStr(StrIn, vbNullChar)
   Select Case nul
      Case Is > 1
         StripNull = Left$(StrIn, nul - 1)
      Case 1
         StripNull = ""
      Case 0
         StripNull = Trim$(StrIn)
   End Select
End Function
 
 
20080236-EE-VQP-29