Test application for loading and switching keyboard layouts

svn path=/trunk/; revision=25281
This commit is contained in:
Saveliy Tretiakov 2007-01-03 11:16:47 +00:00
parent f3908f6d83
commit f7e1cf715a
6 changed files with 650 additions and 0 deletions

View file

@ -0,0 +1,352 @@
/*
* PROJECT: ReactOS
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/applications/testset/user32/kbdlayout/kbdlayout.c
* PURPOSE: Keyboard layout testapp
* COPYRIGHT: Copyright 2007 Saveliy Tretiakov
*/
#define UNICODE
#include<wchar.h>
#include <windows.h>
#include "resource.h"
LRESULT MainDialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);
HINSTANCE hInst;
HWND hMainDlg;
typedef struct {
WNDPROC OrigProc;
WCHAR WndName[25];
} WND_DATA;
INT WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
hInst = hInstance;
DialogBoxParam(hInst,
MAKEINTRESOURCE(IDD_MAINDIALOG),
NULL,
(DLGPROC)MainDialogProc,
(LPARAM)NULL);
return 0;
}
int GetKlList(HKL **list)
{
HKL *ret;
int n;
n = GetKeyboardLayoutList(0, NULL);
ret = HeapAlloc(GetProcessHeap(), 0, sizeof(HKL)*n);
GetKeyboardLayoutList(n, ret);
*list = ret;
return n;
}
void FreeKlList(HKL *list)
{
HeapFree(GetProcessHeap(), 0, list);
}
void UpdateData(HWND hDlg)
{
WCHAR buf[KL_NAMELENGTH];
WCHAR buf2[512];
HWND hList;
HKL *klList, hKl;
int n, i,j;
GetKeyboardLayoutName(buf);
swprintf(buf2, L"Active layout: %s (%x)", buf, GetKeyboardLayout(0));
SetWindowText(GetDlgItem(hDlg, IDC_ACTIVE), buf2);
hList = GetDlgItem(hDlg, IDC_LIST);
SendMessage(hList, LB_RESETCONTENT, 0, 0);
n = GetKlList(&klList);
hKl = GetKeyboardLayout(0);
for(i = 0; i < n; i++)
{
swprintf(buf, L"%x", klList[i] );
j = SendMessage(hList, LB_ADDSTRING, 0, (LPARAM) buf);
SendMessage(hList, LB_SETITEMDATA, j, (LPARAM) klList[i]);
if(klList[i] == hKl) SendMessage(hList, LB_SETCURSEL, j, 0);
}
FreeKlList(klList);
}
void FormatMsg(WCHAR *format, ...)
{
WCHAR buf[255];
va_list argptr;
va_start(argptr, format);
_vsnwprintf(buf, sizeof(buf)-1, format, argptr);
MessageBox(0, buf, L"msg", 0);
va_end(argptr);
}
void FormatBox(HWND hWnd, DWORD Flags, WCHAR *Caption, WCHAR *Format, ...)
{
WCHAR buf[255];
va_list argptr;
va_start(argptr, Format);
_vsnwprintf(buf, sizeof(buf)-1, Format, argptr);
MessageBox(hWnd, buf, Caption, Flags);
va_end(argptr);
}
LRESULT CALLBACK WndSubclassProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
WND_DATA *data = (WND_DATA*)GetWindowLong(hwnd, GWL_USERDATA);
if(uMsg == WM_INPUTLANGCHANGE)
{
FormatMsg(L"%s: WM_INPUTLANGCHANGE lParam=%x wParam=%x\n", data->WndName, lParam, wParam);
UpdateData(hMainDlg);
//Pass message to defwindowproc
}
else if(uMsg == WM_INPUTLANGCHANGEREQUEST)
{
FormatMsg(L"%s: WM_INPUTLANGCHANGEREQUEST lParam=%x wParam=%x\n", data->WndName, lParam, wParam);
UpdateData(hMainDlg);
//Pass message to defwindowproc
}
return ( CallWindowProc( data->OrigProc, hwnd, uMsg, wParam, lParam) );
}
void SubclassWnd(HWND hWnd, WCHAR* Name)
{
WND_DATA *data = HeapAlloc(GetProcessHeap(), 0, sizeof(WND_DATA));
data->OrigProc = (WNDPROC)SetWindowLong( hWnd, GWL_WNDPROC, (LONG)WndSubclassProc);
wcsncpy(data->WndName, Name, 25);
SetWindowLong(hWnd, GWL_USERDATA, (LONG)data);
return;
}
DWORD GetActivateFlags(HWND hDlg)
{
DWORD ret = 0;
if(IsDlgButtonChecked(hDlg, IDC_KLF_REORDER))
ret |= KLF_REORDER;
/* if(IsDlgButtonChecked(hDlg, IDC_KLF_RESET))
ret |= KLF_RESET;
if(IsDlgButtonChecked(hDlg, IDC_KLF_SHIFTLOCK))
ret |= KLF_SHIFTLOCK;*/
if(IsDlgButtonChecked(hDlg, IDC_KLF_SETFORPROCESS))
ret |= KLF_SETFORPROCESS;
return ret;
}
DWORD GetLoadFlags(HWND hDlg)
{
DWORD ret = 0;
if(IsDlgButtonChecked(hDlg, IDL_KLF_ACTIVATE))
ret |= KLF_ACTIVATE;
if(IsDlgButtonChecked(hDlg, IDL_KLF_NOTELLSHELL))
ret |= KLF_NOTELLSHELL;
if(IsDlgButtonChecked(hDlg, IDL_KLF_REORDER))
ret |= KLF_REORDER;
if(IsDlgButtonChecked(hDlg, IDL_KLF_REPLACELANG))
ret |= KLF_REPLACELANG;
if(IsDlgButtonChecked(hDlg, IDL_KLF_SUBSTITUTE_OK))
ret |= KLF_SUBSTITUTE_OK;
if(IsDlgButtonChecked(hDlg, IDL_KLF_SETFORPROCESS))
ret |= KLF_SETFORPROCESS;
return ret;
}
HKL GetSelectedLayout(HWND hDlg)
{
int n;
HWND hList;
hList = GetDlgItem(hDlg, IDC_LIST);
if((n = SendMessage(hList, LB_GETCURSEL, 0, 0)) != LB_ERR)
return (HKL) SendMessage(hList, LB_GETITEMDATA, n, 0);
else return INVALID_HANDLE_VALUE;
}
HKL GetActivateHandle(HWND hDlg)
{
if(IsDlgButtonChecked(hDlg, IDC_FROMLIST))
return GetSelectedLayout(hDlg);
else if(IsDlgButtonChecked(hDlg, IDC_FROMEDIT))
{
WCHAR buf[25];
ULONG kl;
GetWindowText(GetDlgItem(hDlg, IDC_HANDLE), buf, 25);
swscanf(buf, L"%x", &kl);
return (HKL) kl;
}
else if(IsDlgButtonChecked(hDlg, IDC_HKL_NEXT))
return (HKL)HKL_NEXT;
return (HKL)HKL_PREV;
}
/***************************************************
* MainDialogProc *
***************************************************/
LRESULT MainDialogProc(HWND hDlg,
UINT Msg,
WPARAM wParam,
LPARAM lParam)
{
HKL hKl;
switch (Msg)
{
case WM_INITDIALOG:
{
UpdateData(hDlg);
hMainDlg = hDlg;
SubclassWnd(GetDlgItem(hDlg, IDC_LIST), L"List");
SubclassWnd(GetDlgItem(hDlg, IDC_EDIT1), L"Edit1");
SubclassWnd(GetDlgItem(hDlg, IDC_EDIT2), L"Edit2");
SubclassWnd(GetDlgItem(hDlg, IDC_KLID), L"Klid");
SubclassWnd(GetDlgItem(hDlg, IDC_HANDLE), L"Handle");
SubclassWnd(GetDlgItem(hDlg, ID_CANCEL), L"Button");
CheckRadioButton(hDlg, IDC_FROMLIST, IDC_FROMEDIT, IDC_FROMLIST);
SetWindowText(GetDlgItem(hDlg, IDC_KLID), L"00000419");
return 0;
} /* WM_INITDIALOG */
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case ID_CANCEL:
{
EndDialog(hDlg, ERROR_CANCELLED);
break;
}
case IDC_ACTIVATE:
{
if((hKl = GetActivateHandle(hDlg)) != INVALID_HANDLE_VALUE)
{
if(!ActivateKeyboardLayout(hKl, GetActivateFlags(hDlg)))
FormatBox(hDlg, MB_ICONERROR, L"Error",
L"ActivateKeyboardLayout() failed. %d", GetLastError());
else UpdateData(hDlg);
}
else MessageBox(hDlg, L"No item selected", L"Error", MB_ICONERROR);
break;
}
case IDC_UNLOAD:
{
if((hKl = GetSelectedLayout(hDlg)) != INVALID_HANDLE_VALUE)
{
if(!UnloadKeyboardLayout(hKl))
FormatBox(hDlg, MB_ICONERROR, L"Error",
L"UnloadKeyboardLayout() failed. %d",
GetLastError());
else UpdateData(hDlg);
}
else MessageBox(hDlg, L"No item selected", L"Error", MB_ICONERROR);
break;
}
case IDC_LOAD:
{
WCHAR buf[255];
GetWindowText(GetDlgItem(hDlg, IDC_KLID), buf, sizeof(buf));
if(!LoadKeyboardLayout(buf, GetLoadFlags(hDlg)))
FormatBox(hDlg, MB_ICONERROR, L"Error",
L"LoadKeyboardLayout() failed. %d",
GetLastError());
else UpdateData(hDlg);
break;
}
case IDC_REFRESH:
{
UpdateData(hDlg);
break;
}
case IDC_LIST:
{
if(HIWORD(wParam) == LBN_SELCHANGE)
{
WCHAR buf[25];
if((hKl = GetSelectedLayout(hDlg)) != NULL)
{
swprintf(buf, L"%x", hKl);
SetWindowText(GetDlgItem(hDlg, IDC_HANDLE), buf);
}
}
break;
}
}
return TRUE;
} /* WM_COMMAND */
case WM_INPUTLANGCHANGE:
{
FormatMsg(L"dlg WM_INPUTLANGCHANGE lParam=%x wParam=%x\n", lParam, wParam);
return FALSE;
}
case WM_INPUTLANGCHANGEREQUEST:
{
FormatMsg(L"dlg WM_INPUTLANGCHANGEREQUEST lParam=%x wParam=%x\n", lParam, wParam);
return FALSE;
}
case WM_CLOSE:
{
EndDialog(hDlg, ERROR_CANCELLED);
return TRUE;
} /* WM_CLOSE */
default:
return FALSE;
}
}

View file

@ -0,0 +1,98 @@
# Microsoft Developer Studio Project File - Name="kbdlayout" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=kbdlayout - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "kbdlayout.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "kbdlayout.mak" CFG="kbdlayout - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "kbdlayout - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "kbdlayout - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "kbdlayout - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD BASE RSC /l 0x419 /d "NDEBUG"
# ADD RSC /l 0x419 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
!ELSEIF "$(CFG)" == "kbdlayout - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD BASE RSC /l 0x419 /d "_DEBUG"
# ADD RSC /l 0x419 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
# SUBTRACT LINK32 /pdb:none
!ENDIF
# Begin Target
# Name "kbdlayout - Win32 Release"
# Name "kbdlayout - Win32 Debug"
# Begin Source File
SOURCE=.\kbdlayout.c
# End Source File
# Begin Source File
SOURCE=.\kbdlayout.rc
# End Source File
# Begin Source File
SOURCE=.\resource.h
# End Source File
# End Target
# End Project

View file

@ -0,0 +1,13 @@
<module name="kbdlayout" type="win32gui" installbase="system32" installname="kbdlayout.exe">
<include base="kbdlayout">.</include>
<define name="__USE_W32API" />
<define name="_UNICODE" />
<define name="_WIN32_IE">0x0500</define>
<define name="_WIN32_WINNT">0x0600</define>
<define name="WINVER">0x0600</define>
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<file>kbdlayout.c</file>
<file>kbdlayout.rc</file>
</module>

View file

@ -0,0 +1,141 @@
//Microsoft Developer Studio generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Russian resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_RUS)
#ifdef _WIN32
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
#pragma code_page(1251)
#endif //_WIN32
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_MAINDIALOG DIALOG DISCARDABLE 0, 0, 403, 223
STYLE DS_CENTER | WS_MINIMIZEBOX | WS_CAPTION | WS_SYSMENU
CAPTION "Keyboard layout test"
FONT 8, "MS Sans Serif"
BEGIN
PUSHBUTTON "Exit",ID_CANCEL,138,202,121,14
EDITTEXT IDC_EDIT1,7,140,195,58,ES_MULTILINE | ES_AUTOHSCROLL
LISTBOX IDC_LIST,185,17,101,87,LBS_NOINTEGRALHEIGHT | WS_VSCROLL |
WS_TABSTOP
LTEXT "Loaded layouts",IDC_STATIC,190,7,49,8
LTEXT "Active layout:",IDC_ACTIVE,7,127,173,10,SS_SUNKEN
EDITTEXT IDC_EDIT2,206,140,190,58,ES_MULTILINE | ES_AUTOHSCROLL
PUSHBUTTON "Unload",IDC_UNLOAD,186,105,48,14
PUSHBUTTON "Activate",IDC_ACTIVATE,237,121,47,14
GROUPBOX "Activate Flags",IDC_STATIC,293,7,103,67
CONTROL "KLF_REORDER",IDC_KLF_REORDER,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,299,22,69,10
CONTROL "KLF_RESET",IDC_KLF_RESET,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,299,34,66,12
CONTROL "KLF_SETFORPROCESS",IDC_KLF_SETFORPROCESS,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,299,48,95,10
CONTROL "KLF_SHIFTLOCK",IDC_KLF_SHIFTLOCK,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,299,60,72,10
GROUPBOX "Activate layout",IDC_STATIC,294,77,101,60
CONTROL "From list",IDC_FROMLIST,"Button",BS_AUTORADIOBUTTON |
WS_GROUP,298,90,41,10
CONTROL "HKL_NEXT",IDC_HKL_NEXT,"Button",BS_AUTORADIOBUTTON,298,
101,53,10
CONTROL "HKL_PREV",IDC_HKL_PREV,"Button",BS_AUTORADIOBUTTON,298,
112,53,10
CONTROL "From edit",IDC_FROMEDIT,"Button",BS_AUTORADIOBUTTON,298,
124,45,10
GROUPBOX "Load layout",IDC_STATIC,7,7,173,118
CONTROL "KLF_ACTIVATE",IDL_KLF_ACTIVATE,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,15,42,67,10
CONTROL "KLF_NOTELLSHELL",IDL_KLF_NOTELLSHELL,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,15,55,83,10
LTEXT "pwszKLID:",IDC_STATIC,15,22,35,8
EDITTEXT IDC_KLID,53,21,64,14,ES_AUTOHSCROLL | ES_NUMBER
CONTROL "KLF_REORDER",IDL_KLF_REORDER,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,15,68,69,10
CONTROL "KLF_REPLACELANG",IDL_KLF_REPLACELANG,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,15,81,85,10
CONTROL "KLF_SUBSTITUTE_OK",IDL_KLF_SUBSTITUTE_OK,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,15,94,92,10
CONTROL "KLF_SETFORPROCESS",IDL_KLF_SETFORPROCESS,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,15,107,95,10
PUSHBUTTON "Load",IDC_LOAD,125,21,50,14
PUSHBUTTON "Refresh",IDC_REFRESH,237,106,48,14
EDITTEXT IDC_HANDLE,185,122,49,14,ES_AUTOHSCROLL
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_MAINDIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 396
TOPMARGIN, 7
BOTTOMMARGIN, 216
END
END
#endif // APSTUDIO_INVOKED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // Russian resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View file

@ -0,0 +1,43 @@
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by lab17.rc
//
#define IDD_MAINDIALOG 101
#define ID_CANCEL 1000
#define IDC_EDIT1 1021
#define IDC_LIST 1022
#define IDC_ACTIVE 1023
#define IDC_EDIT2 1024
#define IDC_UNLOAD 1025
#define IDC_ACTIVATE 1026
#define IDC_KLF_REORDER 1027
#define IDC_KLF_RESET 1028
#define IDC_KLF_SETFORPROCESS 1029
#define IDC_KLF_SHIFTLOCK 1030
#define IDC_FROMLIST 1032
#define IDC_HKL_NEXT 1033
#define IDC_HKL_PREV 1034
#define IDL_KLF_ACTIVATE 1035
#define IDL_KLF_NOTELLSHELL 1036
#define IDC_KLID 1037
#define IDL_KLF_REORDER 1038
#define IDL_KLF_REPLACELANG 1039
#define IDL_KLF_SUBSTITUTE_OK 1040
#define IDL_KLF_SETFORPROCESS 1041
#define IDC_HKL_PREV2 1042
#define IDC_FROMEDIT 1042
#define IDC_LOAD 1043
#define IDC_REFRESH 1044
#define IDC_HANDLE 1046
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 105
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1049
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View file

@ -7,4 +7,7 @@
<directory name="sysicon">
<xi:include href="sysicon/sysicon.rbuild" />
</directory>
<directory name="kbdlayout">
<xi:include href="kbdlayout/kbdlayout.rbuild" />
</directory>
</group>