- Keyboard layout switching works now in ReactOS!

svn path=/trunk/; revision=33106
This commit is contained in:
Dmitry Chapyshev 2008-04-22 19:01:56 +00:00
parent 57e6630f32
commit 2d438bced6
2 changed files with 21 additions and 15 deletions

View file

@ -9,7 +9,6 @@
#include "kbswitch.h" #include "kbswitch.h"
#define WM_NOTIFYICONMSG (WM_USER + 248) #define WM_NOTIFYICONMSG (WM_USER + 248)
#define BUFSIZE 256
HINSTANCE hInst; HINSTANCE hInst;
HWND hwnd; HWND hwnd;
@ -48,14 +47,14 @@ GetLayoutID(LPTSTR szLayoutNum, LPTSTR szLCID)
{ {
DWORD dwBufLen; DWORD dwBufLen;
HKEY hKey; HKEY hKey;
TCHAR szTempLCID[CCH_LAYOUT_ID + 1]; TCHAR szTempLCID[MAX_PATH];
// Get the Layout ID // Get the Layout ID
if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Preload"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Preload"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{ {
dwBufLen = sizeof(szTempLCID); dwBufLen = MAX_PATH;
if(RegQueryValueEx(hKey, szLayoutNum, NULL, NULL, (LPBYTE)szTempLCID, &dwBufLen) != ERROR_SUCCESS) if (RegQueryValueEx(hKey, szLayoutNum, NULL, NULL, (LPBYTE)szTempLCID, &dwBufLen) != ERROR_SUCCESS)
{ {
RegCloseKey(hKey); RegCloseKey(hKey);
return FALSE; return FALSE;
@ -65,11 +64,11 @@ GetLayoutID(LPTSTR szLayoutNum, LPTSTR szLCID)
} }
// Look for a substitude of this layout // Look for a substitude of this layout
if(RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Substitutes"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Substitutes"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{ {
dwBufLen = sizeof(szTempLCID); dwBufLen = MAX_PATH;
if(RegQueryValueEx(hKey, szTempLCID, NULL, NULL, (LPBYTE)szLCID, &dwBufLen) != ERROR_SUCCESS) if (RegQueryValueEx(hKey, szTempLCID, NULL, NULL, (LPBYTE)szLCID, &dwBufLen) != ERROR_SUCCESS)
{ {
// No substitute found, then use the old LCID // No substitute found, then use the old LCID
lstrcpy(szLCID, szTempLCID); lstrcpy(szLCID, szTempLCID);
@ -97,11 +96,11 @@ GetLayoutName(LPTSTR szLayoutNum, LPTSTR szName)
if(!GetLayoutID(szLayoutNum, szLCID)) if(!GetLayoutID(szLayoutNum, szLCID))
return FALSE; return FALSE;
wsprintf(szBuf, _T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szLCID); _stprintf(szBuf, _T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szLCID);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)szBuf, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)szBuf, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
{ {
dwBufLen = MAX_PATH * sizeof(TCHAR); dwBufLen = MAX_PATH;
if(RegQueryValueEx(hKey, _T("Layout Text"), NULL, NULL, (LPBYTE)szName, &dwBufLen) != ERROR_SUCCESS) if(RegQueryValueEx(hKey, _T("Layout Text"), NULL, NULL, (LPBYTE)szName, &dwBufLen) != ERROR_SUCCESS)
{ {
@ -115,20 +114,26 @@ GetLayoutName(LPTSTR szLayoutNum, LPTSTR szName)
return TRUE; return TRUE;
} }
BOOL CALLBACK
EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
SendMessage(hwnd, WM_INPUTLANGCHANGEREQUEST, 0, lParam);
return TRUE;
}
static VOID static VOID
ActivateLayout(ULONG uLayoutNum) ActivateLayout(ULONG uLayoutNum)
{ {
HKL hKl; HKL hKl;
TCHAR szLayoutNum[CCH_ULONG_DEC + 1]; TCHAR szLayoutNum[CCH_ULONG_DEC + 1];
TCHAR szLCID[CCH_LAYOUT_ID + 1]; TCHAR szLCID[CCH_LAYOUT_ID + 1];
DWORD Ret;
_ultot(uLayoutNum, szLayoutNum, 10); _ultot(uLayoutNum, szLayoutNum, 10);
GetLayoutID(szLayoutNum, szLCID); GetLayoutID(szLayoutNum, szLCID);
// Switch to the new keyboard layout // Switch to the new keyboard layout
hKl = LoadKeyboardLayout(szLCID, KLF_ACTIVATE); hKl = LoadKeyboardLayout(szLCID, KLF_ACTIVATE);
Ret = SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, &hKl, SPIF_SENDWININICHANGE); EnumWindows(EnumWindowsProc, (LPARAM) hKl);
} }
static HMENU static HMENU
@ -137,7 +142,7 @@ BuildPopupMenu()
HMENU hMenu; HMENU hMenu;
HKEY hKey; HKEY hKey;
DWORD dwIndex, dwSize; DWORD dwIndex, dwSize;
LPTSTR szExit; TCHAR szExit[MAX_PATH];
TCHAR szLayoutNum[CCH_ULONG_DEC + 1]; TCHAR szLayoutNum[CCH_ULONG_DEC + 1];
TCHAR szName[MAX_PATH]; TCHAR szName[MAX_PATH];
@ -160,7 +165,7 @@ BuildPopupMenu()
RegCloseKey(hKey); RegCloseKey(hKey);
} }
LoadString(hInst, IDS_EXIT, (LPTSTR)&szExit, 0); LoadString(hInst, IDS_EXIT, szExit, MAX_PATH);
AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
AppendMenu(hMenu, MF_STRING, MENU_ID_EXIT, szExit); AppendMenu(hMenu, MF_STRING, MENU_ID_EXIT, szExit);
@ -230,11 +235,11 @@ wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdSho
WndClass.hCursor = NULL; WndClass.hCursor = NULL;
WndClass.hbrBackground = NULL; WndClass.hbrBackground = NULL;
WndClass.lpszMenuName = NULL; WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = L"kbswitch"; WndClass.lpszClassName = _T("kbswitch");
if (!RegisterClass(&WndClass)) return 0; if (!RegisterClass(&WndClass)) return 0;
hwnd = CreateWindow(L"kbswitch", L"kbswitch", 0, 0, 0, 1, 1, HWND_DESKTOP, NULL, hInstance, NULL); hwnd = CreateWindow(_T("kbswitch"), _T("kbswitch"), 0, 0, 0, 1, 1, HWND_DESKTOP, NULL, hInstance, NULL);
while(GetMessage(&msg,NULL,0,0)) while(GetMessage(&msg,NULL,0,0))
{ {

View file

@ -1,3 +1,4 @@
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <windows.h> #include <windows.h>
#include <tchar.h> #include <tchar.h>