Я пытаюсь создать многоязычную виртуальную клавиатуру.Я использую ToUnicodeEx для преобразования virtualKeyCode в соответствующий символ Unicode.По некоторым причинам это не работает для всех языков, т.е. амхарский.Независимо от того, что я делаю, он возвращает английский Unicode вместо амхарского.Кто-нибудь может подсказать, почему это так работает?Что я могу сделать, чтобы обойти это?
Заранее спасибо.
Вот фрагмент из моего кода:
[DllImport("user32.dll")] static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")] static extern uint GetWindowThreadProcessId(IntPtr hwnd, IntPtr proccess);
[DllImport("user32.dll")] static extern IntPtr GetKeyboardLayout(uint thread);
public IntPtr GetCurrentKeyboardLayout()
{
try
{
IntPtr foregroundWindow = GetForegroundWindow();
uint foregroundProcess = GetWindowThreadProcessId(foregroundWindow, IntPtr.Zero);
IntPtr keyboardLayout = GetKeyboardLayout(foregroundProcess);
if (keyboardLayout == IntPtr.Zero)
throw new Exception();
return keyboardLayout;
}
catch (Exception)
{
// if something goes wrong - just assume English
return IntPtr.Zero;
}
}
[DllImport("user32.dll")]
static extern int ToUnicodeEx(uint virtualKeyCode, uint scanCode, byte[] keyboardState, [Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)] StringBuilder receivingBuffer, int bufferSize, uint flags, IntPtr keyboardLayout);
[DllImport("user32.dll")] static extern short VkKeyScanExW(char ch, IntPtr keyboardLayout);
private void CheckKeyboardLayout(object sender)
{
IntPtr layout = GetCurrentKeyboardLayout();
int changedLayout = layout == IntPtr.Zero ? 0 : layout.ToInt32() & 0xFFFF;
if (_currentLayout != changedLayout && KeyboardLayoutChanged != null)
{
char[] chars = new char[_keys.Length];
char[] charsShift = new char[_keys.Length];
for (int i = 0; i < _keys.Length; i++)
{
foreach (int shiftValue in new[] { 0, 0xff })
{
StringBuilder buf = new StringBuilder(256);
byte[] keyboardState = new byte[256];
switch (shiftValue)
{
case 0:
ToUnicodeEx((uint)_keys[i], 0, keyboardState, buf, 256, 0, layout);
try
{
chars[i] = buf[0];
}
catch (Exception)
{
chars[i] = _keys[i].ToString()[0];
}
break;
case 0xff:
keyboardState[(int)System.Windows.Forms.Keys.ShiftKey] = 0xff;
ToUnicodeEx((uint)_keys[i], 0, keyboardState, buf, 256, 0, layout);
try
{
charsShift[i] = buf[0];
}
catch (Exception)
{
charsShift[i] = _keys[i].ToString()[0];
}
break;
}
}
}
KeyboardLayoutChanged(_currentLayout, changedLayout, chars, charsShift);
_currentLayout = changedLayout;
}
}