GetKeyboardLayout / GetKeyboardLayoutList

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

GetKeyboardLayout / GetKeyboardLayoutList

Beitrag von AUGE_OHR »

hi,

ich habe doch von Günter mal eine Funktion bekommen, aber ich finde die nicht hier im Forum :(

Code: Alles auswählen

FUNCTION GetKeyboardLanguage()
LOCAL nLayout := DllCall( "user32.dll", DLL_STDCALL, "GetKeyboardLayout", 0 )
RETURN bAnd( nLayout, 0xFFFF )
das gibt mir auf einem "german" OS() 1031 (was heisst 1031 ?) zurück.
auf dem Notebook mit chinesischem OS() hat er 2025, also bekommt der User eine Warnung !

aber warum "nur" eine Warnung ... nun habe ich sowas gefunden:

Code: Alles auswählen

Function GetKeyboardList()
local cBuffer:=Space(4), nEntries, i, aRetArray:={}

  nEntries:=DllCall("User32.dll",DLL_STDCALL,"GetKeyboardLayoutList", 1,@cBuffer)
  cBuffer:=Replicate(Chr(32), nEntries*4)
  DllCall("User32.dll",DLL_STDCALL,"GetKeyboardLayoutList", 1, @cBuffer)
  For i:=1 to nEntries
     AAdd(aRetArray,     Bin2L(SubStr(cBuffer,((i-1)*4)+1,4)))
*
*    mein Versuch es "lesbarer" zu machen für eine Combobox 
*    AAdd(aRetArray,STR( bAnd(Bin2L(SubStr(cBuffer,((i-1)*4)+1,4)), 0xFFFF )))
  next i
return aRetArray

// Then you can pass any of the keyboard IDs returned in the array to:

Function ActivateKeyboardLayout(nLayout)
RETURN If(DllCall("User32.dll",DLL_STDCALL,"ActivateKeyboardLayout",nLayout)==0,.f.,.t.)
aber irgendwie bekomme ich bei der "GetKeyboardLayoutList" immer nur LEN() = 1 raus ?

auch scheint mir die Frage zu sein "wo" ich es abfragen soll d.h. wenn ich aus der CMD Box
(Codepage OEM) die Xbase++ GUI Application starte schaltet er immer auf "default" chinesisch.

Auch aus der Desktop Verknüpfung gestartet, wobei DE aktive ist, wird beim Start der Application das Keyboard immer auf "default" gestellt.
Das passiert auch mit dem Explorer und Notepad und so ... hat jemand eine Lösung für sowas ?



Frage : kann man auch "pro SLE" das Keyboard Layout "umschalten" ?
> I try to use win api function ActivateKeyboardLayout in Preblock of SLE
> (GetClass) to switch from one language to another. The function works
> perfectly in VB or C++, but don't nothing in Xbase++.

This does not work on Windows < Win2000/XP because ActivateKeyboarLayout
always only works for the current thread. The SLE object is created in
a different thread, though.

Please check whether you can use the message WM_INPUTLANGCHANGEREQUEST:

Code: Alles auswählen

#define WM_INPUTLANGCHANGEREQUEST       0x0050
DllCall( "user32.dll", DLL_STDCALL, "SendMessageA", ;
         oSle:GetHWND(), WM_INPUTLANGCHANGEREQUEST, 0, hYourKeyboardLayout )
hm ... und was kommt nun bei "hYourKeyboardLayout" für ein Wert rein (1031/2025) ?
gruss by OHR
Jimmy
Antworten