Keyboard detection

Just starting out? Need help? Post your questions and find answers here.
jak64
Enthusiast
Enthusiast
Posts: 502
Joined: Sat Aug 15, 2020 5:02 pm
Location: Ciboure (France)

Keyboard detection

Post by jak64 »

Hello,
Is it possible to know with Purebasic if the keyboard is QWERTY or AZERTY?

thank you
User avatar
Mijikai
Addict
Addict
Posts: 1360
Joined: Sun Sep 11, 2016 2:17 pm

Re: Keyboard detection

Post by Mijikai »

That funtionality is often not directly provided and is different for every OS.
On Windows u can check the layout manually.

Give this a try (untested):

Code: Select all

EnableExplicit

Procedure.i KeyboardType();0 = error / 1 = azerty / 2 = qwerty
  Protected name.s
  Protected azerty.s
  Protected qwerty.s
  name = Space(#KL_NAMELENGTH)
  If GetKeyboardLayoutName_(@name)
    azerty = "00020401,0001080c,0000080c,0000040c"
    qwerty = "0000041a,00000405,00000407,00010407,"
    qwerty + "0000040e,0000046e,00010415,00000418,"
    qwerty + "0000081a,0000041b,00000424,0001042e,"
    qwerty + "0002042e,0000042e,0000100c,00000807"
    If FindString(azerty,name)
      ProcedureReturn 1
    EndIf
    If FindString(qwerty,name)
      ProcedureReturn 2
    EndIf
  EndIf
  ProcedureReturn #Null
EndProcedure

Debug KeyboardType()

End
Jeromyal
Enthusiast
Enthusiast
Posts: 204
Joined: Wed Jul 17, 2013 8:49 am

Re: Keyboard detection

Post by Jeromyal »

I get a return of 0 on win 11 QWERTY Keyboard of a Surface Go signature type cover keyboard.
jak64
Enthusiast
Enthusiast
Posts: 502
Joined: Sat Aug 15, 2020 5:02 pm
Location: Ciboure (France)

Re: Keyboard detection

Post by jak64 »

Hello Mijikai,
I tested and the procedure returns 0 !
I have Windows 11 on a DELL Latitude 7290 laptop and an AZERTY keyboard (I'm French)
User avatar
Mijikai
Addict
Addict
Posts: 1360
Joined: Sun Sep 11, 2016 2:17 pm

Re: Keyboard detection

Post by Mijikai »

Most likely codes are just missing.
You need a list of all language identifiers that are not QWERTY (which is the default)
aka. AZERTY, QWERTZ, QZERTY, DVORAK, ... and compare them.
https://docs.microsoft.com/en-us/window ... windows-11

Anyway i made a mistake in the example code, the identifiers provided are qwertz not qwerty:

Code: Select all

EnableExplicit

Procedure.i KeyboardType();0 = error / 1 = azerty / 2 = qwertz / 3 = rest (mostly qwerty)
  Protected name.s
  Protected azerty.s
  Protected qwertz.s
  name = Space(#KL_NAMELENGTH)
  If GetKeyboardLayoutName_(@name)
    azerty = "00020401,0001080c,0000080c,0000040c"
    qwertz = "0000041a,00000405,00000407,00010407,"
    qwertz + "0000040e,0000046e,00010415,00000418,"
    qwertz + "0000081a,0000041b,00000424,0001042e,"
    qwertz + "0002042e,0000042e,0000100c,00000807"
    If FindString(azerty,name)
      ProcedureReturn 1
    EndIf
    If FindString(qwertz,name)
      ProcedureReturn 2
    EndIf
    ProcedureReturn 3
  EndIf
  ProcedureReturn #Null
EndProcedure

Debug KeyboardType()

End
jak64
Enthusiast
Enthusiast
Posts: 502
Joined: Sat Aug 15, 2020 5:02 pm
Location: Ciboure (France)

Re: Keyboard detection

Post by jak64 »

My keyboard is AZERTY and it gives me 3!
User avatar
Mijikai
Addict
Addict
Posts: 1360
Joined: Sun Sep 11, 2016 2:17 pm

Re: Keyboard detection

Post by Mijikai »

Im sure u can make it work :)
There might be a better solution out there but thats what i found.
jak64
Enthusiast
Enthusiast
Posts: 502
Joined: Sat Aug 15, 2020 5:02 pm
Location: Ciboure (France)

Re: Keyboard detection

Post by jak64 »

Perfect, I looked on the site and I wrote this little test

Code: Select all

Global Langue.s
Procedure ChercherClavier()
  Protected name.s
  name = Space(#KL_NAMELENGTH)
  GetKeyboardLayoutName_(@name)
  Select name
    Case "0000040C"
      Langue="Français.txt"
    Case "00000809","00000452","00010409","00020409","00040409","00000409"
      Langue="English.txt"
    Default
      Langue="English.txt"
  EndSelect
EndProcedure

ChercherClavier()
Debug Langue
infratec
Always Here
Always Here
Posts: 6817
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: Keyboard detection

Post by infratec »

To be complete:

Code: Select all


Procedure.s GetKbdLayoutName()
  
  Protected Name$
  
  
  Name$ = Space(#KL_NAMELENGTH)
  GetKeyboardLayoutName_(@Name$)
  
  Select Name$
    Case "0000041c" : Name$ = "Albanian"
    Case "00000401" : Name$ = "Arabic (101)"
    Case "00010401" : Name$ = "Arabic (102)"
    Case "00020401" : Name$ = "Arabic (102) AZERTY"
    Case "0000042b" : Name$ = "Armenian Eastern"
    Case "0002042b" : Name$ = "Armenian Phonetic"
    Case "0003042b" : Name$ = "Armenian Typewriter"
    Case "0001042b" : Name$ = "Armenian Western"
    Case "0000044d" : Name$ = "Assamese - Inscript"
    Case "0001042c" : Name$ = "Azerbaijani (Standard)"
    Case "0000082c" : Name$ = "Azerbaijani Cyrillic"
    Case "0000042c" : Name$ = "Azerbaijani Latin"
    Case "0000046d" : Name$ = "Bashkir"
    Case "00000423" : Name$ = "Belarusian"
    Case "0001080c" : Name$ = "Belgian (Comma)"
    Case "00000813" : Name$ = "Belgian (Period)"
    Case "0000080c" : Name$ = "Belgian French"
    Case "00000445" : Name$ = "Bangla (Bangladesh)"
    Case "00020445" : Name$ = "Bangla (India)"
    Case "00010445" : Name$ = "Bangla (India - Legacy)"
    Case "0000201a" : Name$ = "Bosnian (Cyrillic)"
    Case "000b0c00" : Name$ = "Buginese"
    Case "00030402" : Name$ = "Bulgarian"
    Case "00010402" : Name$ = "Bulgarian (Latin)"
    Case "00020402" : Name$ = "Bulgarian (phonetic layout)"
    Case "00040402" : Name$ = "Bulgarian (phonetic traditional)"
    Case "00000402" : Name$ = "Bulgarian (Typewriter)"
    Case "00001009" : Name$ = "Canadian French"
    Case "00000c0c" : Name$ = "Canadian French (Legacy)"
    Case "00011009" : Name$ = "Canadian Multilingual Standard"
    Case "0000085f" : Name$ = "Central Atlas Tamazight"
    Case "00000429" : Name$ = "Central Kurdish"
    Case "0000045c" : Name$ = "Cherokee Nation"
    Case "0001045c" : Name$ = "Cherokee Nation Phonetic"
    Case "00000804" : Name$ = "Chinese (Simplified) - US Keyboard"
    Case "00000404" : Name$ = "Chinese (Traditional) - US Keyboard"
    Case "00000c04" : Name$ = "Chinese (Traditional, Hong Kong S.A.R.)"
    Case "00001404" : Name$ = "Chinese (Traditional Macao S.A.R.) US Keyboard"
    Case "00001004" : Name$ = "Chinese (Simplified, Singapore) - US keyboard"
    Case "0000041a" : Name$ = "Croatian"
    Case "00000405" : Name$ = "Czech"
    Case "00010405" : Name$ = "Czech (QWERTY)"
    Case "00020405" : Name$ = "Czech Programmers"
    Case "00000406" : Name$ = "Danish"
    Case "00000439" : Name$ = "Devanagari-INSCRIPT"
    Case "00000465" : Name$ = "Divehi Phonetic"
    Case "00010465" : Name$ = "Divehi Typewriter"
    Case "00000413" : Name$ = "Dutch"
    Case "00000C51" : Name$ = "Dzongkha"
    Case "00000425" : Name$ = "Estonian"
    Case "00000438" : Name$ = "Faeroese"
    Case "0000040b" : Name$ = "Finnish"
    Case "0001083b" : Name$ = "Finnish With Sami"
    Case "0000040c" : Name$ = "French"
    Case "00120c00" : Name$ = "Futhark"
    Case "00000437" : Name$ = "Georgian"
    Case "00020437" : Name$ = "Georgian (Ergonomic)"
    Case "00010437" : Name$ = "Georgian (QWERTY)"
    Case "00030437" : Name$ = "Georgian Ministry of Education And Science Schools"
    Case "00040437" : Name$ = "Georgian (Old Alphabets)"
    Case "00000407" : Name$ = "German"
    Case "00010407" : Name$ = "German (IBM)"
    Case "000c0c00" : Name$ = "Gothic"
    Case "00000408" : Name$ = "Greek"
    Case "00010408" : Name$ = "Greek (220)"
    Case "00030408" : Name$ = "Greek (220) Latin"
    Case "00020408" : Name$ = "Greek (319)"
    Case "00040408" : Name$ = "Greek (319) Latin"
    Case "00050408" : Name$ = "Greek Latin"
    Case "00060408" : Name$ = "Greek Polytonic"
    Case "0000046f" : Name$ = "Greenlandic"
    Case "00000474" : Name$ = "Guarani"
    Case "00000447" : Name$ = "Gujarati"
    Case "00000468" : Name$ = "Hausa"
    Case "0000040d" : Name$ = "Hebrew"
    Case "00010439" : Name$ = "Hindi Traditional"
    Case "0000040e" : Name$ = "Hungarian"
    Case "0001040e" : Name$ = "Hungarian 101-key"
    Case "0000040f" : Name$ = "Icelandic"
    Case "00000470" : Name$ = "Igbo"
    Case "00004009" : Name$ = "India"
    Case "0000085d" : Name$ = "Inuktitut - Latin"
    Case "0001045d" : Name$ = "Inuktitut - Naqittaut"
    Case "00001809" : Name$ = "Irish"
    Case "00000410" : Name$ = "Italian"
    Case "00010410" : Name$ = "Italian (142)"
    Case "00000411" : Name$ = "Japanese"
    Case "00110c00" : Name$ = "Javanese"
    Case "0000044b" : Name$ = "Kannada"
    Case "0000043f" : Name$ = "Kazakh"
    Case "00000453" : Name$ = "Khmer"
    Case "00010453" : Name$ = "Khmer (NIDA)"
    Case "00000412" : Name$ = "Korean"
    Case "00000440" : Name$ = "Kyrgyz Cyrillic"
    Case "00000454" : Name$ = "Lao"
    Case "0000080a" : Name$ = "Latin American"
    Case "00020426" : Name$ = "Latvian (Standard)"
    Case "00010426" : Name$ = "Latvian (Legacy)"
    Case "00070c00" : Name$ = "Lisu (Basic)"
    Case "00080c00" : Name$ = "Lisu (Standard)"
    Case "00010427" : Name$ = "Lithuanian"
    Case "00000427" : Name$ = "Lithuanian IBM"
    Case "00020427" : Name$ = "Lithuanian Standard"
    Case "0000046e" : Name$ = "Luxembourgish"
    Case "0000042f" : Name$ = "Macedonia (FYROM)"
    Case "0001042f" : Name$ = "Macedonia (FYROM) - Standard"
    Case "0000044c" : Name$ = "Malayalam"
    Case "0000043a" : Name$ = "Maltese 47-Key"
    Case "0001043a" : Name$ = "Maltese 48-key"
    Case "00000481" : Name$ = "Maori"
    Case "0000044e" : Name$ = "Marathi"
    Case "00000850" : Name$ = "Mongolian (Mongolian Script - Legacy)"
    Case "00020850" : Name$ = "Mongolian (Mongolian Script - Standard)"
    Case "00000450" : Name$ = "Mongolian Cyrillic"
    Case "00010c00" : Name$ = "Myanmar"
    Case "00090c00" : Name$ = "N'ko"
    Case "00000461" : Name$ = "Nepali"
    Case "00020c00" : Name$ = "New Tai Lue"
    Case "00000414" : Name$ = "Norwegian"
    Case "0000043b" : Name$ = "Norwegian With Sami"
    Case "00000448" : Name$ = "Odia"
    Case "000d0c00" : Name$ = "Ol Chiki"
    Case "000f0c00" : Name$ = "Old Italic"
    Case "000e0c00" : Name$ = "Osmanya"
    Case "00000463" : Name$ = "Pashto (Afghanistan)"
    Case "00000429" : Name$ = "Persian"
    Case "00050429" : Name$ = "Persian (Standard)"
    Case "000a0c00" : Name$ = "Phags-pa"
    Case "00010415" : Name$ = "Polish (214)"
    Case "00000415" : Name$ = "Polish (Programmers)"
    Case "00000816" : Name$ = "Portuguese"
    Case "00000416" : Name$ = "Portuguese (Brazilian ABNT)"
    Case "00010416" : Name$ = "Portuguese (Brazilian ABNT2)"
    Case "00000446" : Name$ = "Punjabi"
    Case "00000418" : Name$ = "Romanian (Legacy)"
    Case "00020418" : Name$ = "Romanian (Programmers)"
    Case "00010418" : Name$ = "Romanian (Standard)"
    Case "00000419" : Name$ = "Russian"
    Case "00020419" : Name$ = "Russian - Mnemonic"
    Case "00010419" : Name$ = "Russian (Typewriter)"
    Case "00000485" : Name$ = "Sakha"
    Case "0002083b" : Name$ = "Sami Extended Finland-Sweden"
    Case "0001043b" : Name$ = "Sami Extended Norway"
    Case "00011809" : Name$ = "Scottish Gaelic"
    Case "00000c1a" : Name$ = "Serbian (Cyrillic)"
    Case "0000081a" : Name$ = "Serbian (Latin)"
    Case "0000046c" : Name$ = "Sesotho sa Leboa"
    Case "00000432" : Name$ = "Setswana"
    Case "0000045b" : Name$ = "Sinhala"
    Case "0001045b" : Name$ = "Sinhala - wij 9"
    Case "0000041b" : Name$ = "Slovak"
    Case "0001041b" : Name$ = "Slovak (QWERTY)"
    Case "00000424" : Name$ = "Slovenian"
    Case "00100c00" : Name$ = "Sora"
    Case "0001042e" : Name$ = "Sorbian Extended"
    Case "0002042e" : Name$ = "Sorbian Standard"
    Case "0000042e" : Name$ = "Sorbian Standard (Legacy)"
    Case "0000040a" : Name$ = "Spanish"
    Case "0001040a" : Name$ = "Spanish Variation"
    Case "0000041d" : Name$ = "Swedish"
    Case "0000083b" : Name$ = "Swedish With Sami"
    Case "0000100c" : Name$ = "Swiss French"
    Case "00000807" : Name$ = "Swiss German"
    Case "0000045a" : Name$ = "Syriac"
    Case "0001045a" : Name$ = "Syriac Phonetic"
    Case "00030c00" : Name$ = "Tai Le"
    Case "00000428" : Name$ = "Tajik"
    Case "00000449" : Name$ = "Tamil"
    Case "00010444" : Name$ = "Tatar"
    Case "00000444" : Name$ = "Tatar (Legacy)"
    Case "0000044a" : Name$ = "Telugu"
    Case "0000041e" : Name$ = "Thai Kedmanee"
    Case "0002041e" : Name$ = "Thai Kedmanee (non-ShiftLock)"
    Case "0001041e" : Name$ = "Thai Pattachote"
    Case "0003041e" : Name$ = "Thai Pattachote (non-ShiftLock)"
    Case "00010451" : Name$ = "Tibetan (PRC - Standard)"
    Case "00000451" : Name$ = "Tibetan (PRC - Legacy)"
    Case "00050c00" : Name$ = "Tifinagh (Basic)"
    Case "00060c00" : Name$ = "Tifinagh (Full)"
    Case "0001041f" : Name$ = "Turkish F"
    Case "0000041f" : Name$ = "Turkish Q"
    Case "00000442" : Name$ = "Turkmen"
    Case "00010408" : Name$ = "Uyghur"
    Case "00000480" : Name$ = "Uyghur (Legacy)"
    Case "00000422" : Name$ = "Ukrainian"
    Case "00020422" : Name$ = "Ukrainian (Enhanced)"
    Case "00000809" : Name$ = "United Kingdom"
    Case "00000452" : Name$ = "United Kingdom Extended"
    Case "00010409" : Name$ = "United States - Dvorak"
    Case "00020409" : Name$ = "United States - International"
    Case "00030409" : Name$ = "United States - Dvorak For left hand"
    Case "00040409" : Name$ = "United States - Dvorak For right hand"
    Case "00000409" : Name$ = "United States - English"
    Case "00000420" : Name$ = "Urdu"
    Case "00010480" : Name$ = "Uyghur"
    Case "00000843" : Name$ = "Uzbek Cyrillic"
    Case "0000042a" : Name$ = "Vietnamese"
    Case "00000488" : Name$ = "Wolof"
    Case "00000485" : Name$ = "Yakut"
    Case "0000046a" : Name$ = "Yoruba"
  EndSelect
  
  ProcedureReturn Name$
  
EndProcedure

Debug GetKbdLayoutName()
jak64
Enthusiast
Enthusiast
Posts: 502
Joined: Sat Aug 15, 2020 5:02 pm
Location: Ciboure (France)

Re: Keyboard detection

Post by jak64 »

Thank you infratec
Mesa
Enthusiast
Enthusiast
Posts: 345
Joined: Fri Feb 24, 2012 10:19 am

Re: Keyboard detection

Post by Mesa »

My computer need to add

Code: Select all

"Name$ = LCase(Name$)"
before

Code: Select all

  "Select Name$"
M.
Post Reply