#region INCLUDES
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#Include <WinAPIEx.au3>
#Include <APIConstants.au3>
#include <Misc.au3>
#include <Array.au3>
#endregion
#region WRAPPER
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Res_FileVersion=1.0
#AutoIt3Wrapper_Res_Description=Переключатель языка в стиле Windows 8
#AutoIt3Wrapper_Res_LegalCopyright=Alexander Silenko 2012
#AutoIt3Wrapper_Res_Comment=Переключатель языка в стиле Windows 8
#AutoIt3Wrapper_Res_Field=OriginalFilename|Language 8 Switcher.exe
#AutoIt3Wrapper_Res_Field=ProductName|Language 8 Switcher
#AutoIt3Wrapper_Res_Field=ProductVersion|1.0
#AutoIt3Wrapper_Icon=D:\Картинки\4_Другое\Иконки\Token Light\TokenW-ICO\Office\Writing2.ico
#endregion
#region CHECK REGISTRY
If RegRead('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'SelectedColor') = '' Then
RegWrite('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'SelectedColor', 'REG_SZ', '0xFFFFFF')
EndIf
If RegRead('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'BkSelectedColor') = '' Then
RegWrite('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'BkSelectedColor', 'REG_SZ', '0x000000')
EndIf
If RegRead('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'ShowTime') = '' Then
RegWrite('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'ShowTime', 'REG_SZ', '700')
EndIf
#endregion
#region VARIABLES
Global $_SelectedColor = RegRead('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'SelectedColor')
Global $_BkSelectedColor = RegRead('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'BkSelectedColor')
Global $iShowTime = Number(RegRead('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'ShowTime'))
Global $_Color = 0x000000, $_BkColor = 0xFFFFFF
Global $hUser32DLL = DllOpen("user32.dll")
Global $hCurrentWindow = WinGetHandle('[active]')
Global $iCurrentLayout = _WinAPI_GetCurrentWindowKeyboardLayout()
#endregion
#region OPTIONS
OnAutoItExitRegister('_CloseUser32DLL')
Opt('TrayMenuMode', 3)
TraySetClick(8)
#endregion
_CreateSwitcherGui()
$_Tray_Settings = TrayCreateItem('Настройки')
TrayCreateItem('')
$_Tray_Exit = TrayCreateItem('Выход')
TraySetState()
TraySetToolTip('Language 8 Switcher / AutoIt 3.3.8.1')
_WinAPI_EmptyWorkingSet()
ConsoleWrite(@LF & 'Started' & @LF)
While True
If _LayoutChanged() Then
If WinGetHandle('[active]') <> $hCurrentWindow Then
$hCurrentWindow = WinGetHandle('[active]')
$iCurrentLayout = _WinAPI_GetCurrentWindowKeyboardLayout()
Else
_LayoutChangedGui()
EndIf
EndIf
$iTrayMsg = TrayGetMsg()
Switch $iTrayMsg
Case $_Tray_Settings
_SettingsGui()
Case $_Tray_Exit
Exit
EndSwitch
WEnd
Func _CreateSwitcherGui()
Global $aiLayouts = _WinAPI_GetKeyboardLayoutListEx()
Global $a_LayoutLabel[(UBound($aiLayouts))][3]
Local Const $iLayerLabelHeight = 15, $iLabelHeight = 35, $iGuiCornersMargin = 10
Local $iGuiWidth = 260
Local $iGuiHeight = ($aiLayouts[0] * ($iLabelHeight + $iLayerLabelHeight)) + (2 * $iGuiCornersMargin)
Local Const $iMainLabelWidth = 60, $iLabelWidth = $iGuiWidth - $iMainLabelWidth
#region CREATE WINDOW
Global $hGui = GuiCreate('Lang8switch', $iGuiWidth, $iGuiHeight, @DesktopWidth - $iGuiWidth - 1, Default, $WS_POPUP, $WS_EX_TOOLWINDOW)
GUISetBkColor($_BkColor)
GUICtrlCreateLabel('', 0, 0, $iGuiWidth, 2) ; TOP LINE
GUICtrlSetBkColor(-1, 0x000000)
GUICtrlCreateLabel('', 0, 0, 2, $iGuiHeight) ; LEFT LINE
GUICtrlSetBkColor(-1, 0x000000)
GUICtrlCreateLabel('', $iGuiWidth - 2, 0, 2, $iGuiHeight) ; RIGHT LINE
GUICtrlSetBkColor(-1, 0x000000)
GUICtrlCreateLabel('', 0, $iGuiHeight - 2, $iGuiWidth, 2) ; BOTTOM LINE
GUICtrlSetBkColor(-1, 0x000000)
#endregion
#region CREATE CONTROLS
Local $iY = $iGuiCornersMargin
For $n = 1 To (UBound($aiLayouts) - 1)
$a_LayoutLabel[$n][0] = GUICtrlCreateLabel('', 2, $iY, $iGuiWidth - 4, $iLayerLabelHeight)
$a_LayoutLabel[$n][1] = GUICtrlCreateLabel(_ReturnLabelName($n, 1), 2, $iY + 15, $iMainLabelWidth, $iLabelHeight, $SS_RIGHT)
GUICtrlSetFont(-1, 12, 800, 0, 'Arial')
$a_LayoutLabel[$n][2] = GUICtrlCreateLabel(_ReturnLabelName($n, 2), $iMainLabelWidth + 2, $iY + 15, $iGuiWidth - $iMainLabelWidth - 4, $iLabelHeight, $SS_CENTER)
GUICtrlSetFont(-1, 12, 400, 0, 'Arial')
$iY += ($iLabelHeight + $iLayerLabelHeight)
Next
#endregion
WinSetOnTop($hGui, '', 1)
EndFunc
Func _LayoutChangedGui()
_SetLayoutIndicator()
GUISetState(@SW_SHOWNOACTIVATE)
Local $hTimer = TimerInit()
While Round(TimerDiff($hTimer)) < $iShowTime
If _LayoutChanged() Then
_SetLayoutIndicator()
$hTimer = TimerInit()
EndIf
Sleep(20)
WEnd
$iCurrentLayout = _WinAPI_GetCurrentWindowKeyboardLayout()
GUISetState(@SW_HIDE)
EndFunc
Func _WinAPI_GetKeyboardLayoutListEx()
Local $iList = _WinAPI_GetKeyboardLayoutList()
For $i = 1 To $iList[0]
$iList[$i] = Hex(BitAND($iList[$i], 0xFFFF))
Next
_ArraySort($iList, 0, 1)
Return $iList
EndFunc
Func _SelectLabel($iNum)
GUICtrlSetBkColor($a_LayoutLabel[$iNum][0], $_BkSelectedColor)
GUICtrlSetColor($a_LayoutLabel[$iNum][1], $_SelectedColor)
GUICtrlSetBkColor($a_LayoutLabel[$iNum][1], $_BkSelectedColor)
GUICtrlSetColor($a_LayoutLabel[$iNum][2], $_SelectedColor)
GUICtrlSetBkColor($a_LayoutLabel[$iNum][2], $_BkSelectedColor)
EndFunc
Func _UnselectLabel($iNum)
GUICtrlSetBkColor($a_LayoutLabel[$iNum][0], $_BkColor)
GUICtrlSetColor($a_LayoutLabel[$iNum][1], $_Color)
GUICtrlSetBkColor($a_LayoutLabel[$iNum][1], $_BkColor)
GUICtrlSetColor($a_LayoutLabel[$iNum][2], $_Color)
GUICtrlSetBkColor($a_LayoutLabel[$iNum][2], $_BkColor)
EndFunc
Func _ReturnLabelName($iNum, $iLabelNum)
For $n = 1 To $aiLayouts[0]
If $n = $iNum Then
If $iLabelNum = 1 Then
Return _WinAPI_GetLocaleInfo(Number('0x' & $aiLayouts[$n]), $LOCALE_SABBREVLANGNAME)
Else
Return _WinAPI_GetLocaleInfo(Number('0x' & $aiLayouts[$n]), $LOCALE_SLANGUAGE)
EndIf
EndIf
Next
EndFunc
Func _CloseUser32DLL()
DllClose($hUser32DLL)
ConsoleWrite('User32.dll CLOSED' & @LF & @LF)
EndFunc
Func _WinAPI_GetCurrentWindowKeyboardLayout()
Return Hex(BitAND(_WinAPI_GetKeyboardLayout(WinGetHandle('[active]')), 0xFFFF))
EndFunc
Func _SetLayoutIndicator()
For $n = 1 To $aiLayouts[0]
If $aiLayouts[$n] = $iCurrentLayout Then
_SelectLabel($n)
Else
_UnselectLabel($n)
EndIf
Next
EndFunc
Func _LayoutChanged()
$iNew = _WinAPI_GetCurrentWindowKeyboardLayout()
If $iNew <> $iCurrentLayout And $iNew <> 0 Then
$iCurrentLayout = $iNew
ConsoleWrite(@HOUR & ':' & @MIN & ':' & @SEC & ' New layout ' & $iNew & ' for window "' & WinGetTitle('[active]') & '"' & @LF)
Return 1
EndIf
Return 0
EndFunc
Func _SettingsGui()
#region COLOUR SCHEME CONSTANTS
Local $_BlackScheme[2] = ['0x000000', '0xFFFFFF'] ; BkColor, Color
Local $_BlueScheme[2] = ['0x4617B4', '0xFFFFFF']
Local $_GreenScheme[2] = ['0x1DB417', '0x000000']
Local $_RedScheme[2] = ['0xB41B17', '0xFFFFFF']
Local $_CyanScheme[2] = ['0x17B0B4', '0x000000']
Local $_VioletScheme[2] = ['0x9D17B4', '0xFFFFFF']
#endregion
#region GUI CREATE
Local $iGuiHeight = 150
Local $hSettingsGui = GUICreate('Настройки Language 8 Switcher', 342, $iGuiHeight, -1, -1, $WS_SYSMENU)
GUISetFont(12, 400, 0, 'Arial')
Global $_SelectedSchemeCtrl = GUICtrlCreateLabel('Текущая тема оформления', 5, 5, 325, 20, $SS_CENTER)
GUICtrlSetColor(-1, $_SelectedColor)
GUICtrlSetBkColor(-1, $_BkSelectedColor)
GUISetFont(11, 400, 0, 'Arial')
GUICtrlCreateLabel('Выберите тему:', 5, 35)
GUISetFont(12, 400, 0, 'Arial')
$_BlackSchemeCtrl = GUICtrlCreateLabel('RUS', 5, 55, 50, 20, $SS_CENTER)
GUICtrlSetBkColor(-1, $_BlackScheme[0])
GUICtrlSetColor(-1, $_BlackScheme[1])
$_BlueSchemeCtrl = GUICtrlCreateLabel('RUS', 60, 55, 50, 20, $SS_CENTER)
GUICtrlSetBkColor(-1, $_BlueScheme[0])
GUICtrlSetColor(-1, $_BlueScheme[1])
$_GreenSchemeCtrl = GUICtrlCreateLabel('RUS', 115, 55, 50, 20, $SS_CENTER)
GUICtrlSetBkColor(-1, $_GreenScheme[0])
GUICtrlSetColor(-1, $_GreenScheme[1])
$_RedSchemeCtrl = GUICtrlCreateLabel('RUS', 170, 55, 50, 20, $SS_CENTER)
GUICtrlSetBkColor(-1, $_RedScheme[0])
GUICtrlSetColor(-1, $_RedScheme[1])
$_CyanSchemeCtrl = GUICtrlCreateLabel('RUS', 225, 55, 50, 20, $SS_CENTER)
GUICtrlSetBkColor(-1, $_CyanScheme[0])
GUICtrlSetColor(-1, $_CyanScheme[1])
$_VioletSchemeCtrl = GUICtrlCreateLabel('RUS', 280, 55, 50, 20, $SS_CENTER)
GUICtrlSetBkColor(-1, $_VioletScheme[0])
GUICtrlSetColor(-1, $_VioletScheme[1])
GUISetFont(11, 400, 0, 'Arial')
$_CloseBtn = GUICtrlCreateButton('OK', 230, $iGuiHeight - 65, 100, 30)
GUISetState()
#endregion
#region GUI MSGLOOP
Do
$iGuiMsg = GUIGetMsg()
Switch $iGuiMsg
Case $_BlackSchemeCtrl
_SetSchemeColor($_BlackScheme)
Case $_BlueSchemeCtrl
_SetSchemeColor($_BlueScheme)
Case $_GreenSchemeCtrl
_SetSchemeColor($_GreenScheme)
Case $_RedSchemeCtrl
_SetSchemeColor($_RedScheme)
Case $_CyanSchemeCtrl
_SetSchemeColor($_CyanScheme)
Case $_VioletSchemeCtrl
_SetSchemeColor($_VioletScheme)
EndSwitch
Until $iGuiMsg = -3 Or $iGuiMsg = $_CloseBtn
#endregion
GUIDelete($hSettingsGui)
EndFunc
Func _SetSchemeColor($aiColors)
GUICtrlSetBkColor($_SelectedSchemeCtrl, $aiColors[0])
GUICtrlSetColor($_SelectedSchemeCtrl, $aiColors[1])
$_BkSelectedColor = $aiColors[0]
RegWrite('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'BkSelectedColor', 'REG_SZ', $aiColors[0])
$_SelectedColor = $aiColors[1]
RegWrite('HKEY_CURRENT_USER\Software\Alexander Silenko\Language 8 Switcher', 'SelectedColor', 'REG_SZ', $aiColors[1])
EndFunc