; @AZJIO 6.06.2010
; программа исправления текста набранного в неправильной раскладке клавиатуры
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_OutFile=TextCorrection.exe
;#AutoIt3Wrapper_icon=TextCorrection.ico
;#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseAnsi=y
#AutoIt3Wrapper_Res_Comment=-
#AutoIt3Wrapper_Res_Description=TextCorrection.exe
#AutoIt3Wrapper_Res_Fileversion=0.4.0.0
#AutoIt3Wrapper_Res_LegalCopyright=AZJIO
#AutoIt3Wrapper_Res_Language=1049
#AutoIt3Wrapper_Run_AU3Check=n
#AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\ResHacker\ResHacker.exe -add "%out%", "%out%", %scriptdir%\TextCorrection1.ico, IconGroup, 1, 0
#AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\ResHacker\ResHacker.exe -add "%out%", "%out%", %scriptdir%\TextCorrection3.ico, IconGroup, 3, 0
#AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\ResHacker\ResHacker.exe -add "%out%", "%out%", %scriptdir%\TextCorrection4.ico, IconGroup, 4, 0
#AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\ResHacker\ResHacker.exe -delete "%out%", "%out%", DIALOG, 1000,
#AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\ResHacker\ResHacker.exe -delete "%out%", "%out%", ICON, 161,
#AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\ResHacker\ResHacker.exe -delete "%out%", "%out%", ICON, 162,
#AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\ResHacker\ResHacker.exe -delete "%out%", "%out%", ICON, 164,
#AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\ResHacker\ResHacker.exe -delete "%out%", "%out%", ICON, 169,
#AutoIt3Wrapper_Run_After=%autoitdir%\SciTE\upx\upx.exe -7 --compress-icons=0 "%out%"
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#Include <HotKeyInput.au3>
#Include <vkConstants.au3>
#Include <vkArray.au3>
#Include <HotKey.au3>
Opt("SendKeyDelay", 1)
Opt("SendKeyDownDelay", 1)
Opt("TrayMenuMode", 1)
Opt("TrayOnEventMode", 1)
_Singleton(" ") ; не запускать дважды
Global $Paused, $En, $Ru, $HotKey[9]
Global $Ini = @ScriptDir&'\TextCorrection.ini' ; путь к TextCorrection.ini
$EnDef = "`qwertyuiop[]asdfghjkl;'zxcvbnm,./~QWERTYUIOP{}ASDFGHJKL:""|ZXCVBNM<>?@#$^&"
$RuDef = "ёйцукенгшщзхъфывапролджэячсмитьбю.ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ,""№;:?"
;Проверка существования TextCorrection.ini
If Not FileExists($Ini) Then
If MsgBox(4, "Выгодное предложение", "Первый старт, отсутствует TextCorrection.ini"&@CRLF&"создаём, иначе выход.") = "6" Then
$iniopen = FileOpen($Ini,2)
FileWrite($iniopen, '[General]' & @CRLF & _
'Lang1=' & $EnDef & @CRLF & _
'Lang2=' & $RuDef & @CRLF & @CRLF & _
'[HotKey]' & @CRLF & _
'HotKey1=732' & @CRLF & _
'HotKey2=734' & @CRLF & _
'HotKey3=698' & @CRLF & _
'HotKey4=703' & @CRLF & _
'HotKey5=702' & @CRLF & _
'HotKey6=731' & @CRLF & _
'HotKey7=733' & @CRLF & _
'HotKey8=539')
FileClose($iniopen)
Else
Exit
EndIf
EndIf
;читаем TextCorrection.ini
$En = IniRead ($Ini, "General", "Lang1", $EnDef )
$Ru = IniRead ($Ini, "General", "Lang2", $RuDef)
$aDef = StringSplit("732,734,698,703,702,731,733,539", ",")
For $i = 1 to 8
$HotKey[$i]=IniRead ($Ini, "HotKey", "HotKey"&$i, $aDef[$i] )
Next
TraySetIcon(@ScriptDir&"\TextCorrection.exe", 4)
$langdef = RegRead("HKCU\Keyboard Layout\Preload", "1") ; читаем язык по умолчанию
_HotKeySet()
$Suspend=TrayCreateItem("Приостановить")
TrayItemSetOnEvent(-1, "_Pause")
$Readme=TrayCreateItem("Readme")
TrayItemSetOnEvent(-1, "_Readme")
$About = TrayCreateItem("О программе")
TrayItemSetOnEvent(-1, "_About")
$GuiHotKey = TrayCreateItem("Горячие клавиши")
TrayItemSetOnEvent(-1, "_GuiHotKey")
$Quit = TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "_Mode8")
$L2=''
$hWnd=''
While 1
Sleep(150)
$WinList = WinList()
For $i = 1 To $WinList[0][0]
If $WinList[$i][0] <> "" And BitAND(WinGetState($WinList[$i][1]), 8) Then
$hWnd = WinGetHandle($WinList[$i][1])
ExitLoop
EndIf
Next
$L1=_WinAPI_GetKeyboardLayout($hWnd)
If $L1<>$L2 Then
If $L1 = 1033 Then
TraySetIcon(@ScriptDir&"\TextCorrection.exe", 3)
$L2=1033
Else
TraySetIcon(@ScriptDir&"\TextCorrection.exe", 4)
$L2=1049
EndIf
EndIf
WEnd
Func _Mode1()
_Re("^+{LEFT}")
EndFunc ;==>_Clovo
Func _Mode2()
_Re("+{HOME}", 1)
EndFunc ;==>_Stroka
Func _Mode3()
_Re("+{HOME}", 5)
EndFunc ;==>_space
Func _Mode4()
_Re("^+{LEFT}", 1)
EndFunc ;==>_Clovo1
Func _Mode5()
_Re("^+{LEFT}", 4)
EndFunc ;==>_Kras
Func _Mode6()
_Re("^+{LEFT}", 2)
EndFunc ;==>_Upper
Func _Mode7()
_Re("^+{LEFT}", 3)
EndFunc ;==>_Lower
Func _Mode8()
Exit
EndFunc ;==>_Quit
Func _Re($hk, $mode = 0)
Local $Selected_Text, $New_Text, $Old_bufer, $aBykvText, $hWnd, $WinList, $Lang
; определение активного окна и проверка раскладки клавиатуры
$WinList = WinList()
For $i = 1 To $WinList[0][0]
If $WinList[$i][0] <> "" And BitAND(WinGetState($WinList[$i][1]), 8) Then
$hWnd = WinGetHandle($WinList[$i][1])
ExitLoop
EndIf
Next
$Lang = _WinAPI_GetKeyboardLayout($hWnd) ; 1033 1049
$setLang = ''
$Old_bufer = ClipGet() ; для восстановления буфера
;проверка выделенного текста, если не выделен, то выделяем
Sleep(130)
_SendEx("^{INS}")
Sleep(30)
$Selected_Text = ClipGet()
Sleep(30)
If $Selected_Text = $Old_bufer Then
_SendEx($hk) ; выделяем текст
Sleep(30)
_SendEx("^{INS}") ; копируем текст
Sleep(30)
$Selected_Text = ClipGet()
Sleep(30)
EndIf
If $Selected_Text = '' Then
_SendEx($hk) ; выделяем текст
Sleep(30)
_SendEx("^{INS}") ; копируем текст
Sleep(30)
$Selected_Text = ClipGet()
Sleep(30)
EndIf
$New_Text = ''
If $mode = 5 Then ; исправление слова до пробела
$aSelected_Text=StringRegExp($Selected_Text,'(^.*)( |\(|\)|\\|=|\+|%|!)(.*)$',3)
If UBound($aSelected_Text)<2 Then
$mode = 0
Else
$New_Text = $aSelected_Text[0]&$aSelected_Text[1]
$Selected_Text = $aSelected_Text[2]
$mode = 0
EndIf
EndIf
$aBykvText = StringSplit($Selected_Text, "")
; ищем справа-налево последний валидный символ в тексте, по которому можно определить язык
$bykva = ''
For $i = StringLen($Selected_Text) To 1 Step -1
If StringInStr('ёйцукенгшщзхъфывапролджэячсмитьбюqwertyuiopasdfghjklzxcvbnm', StringMid($Selected_Text, $i, 1)) <> 0 Then
$bykva = StringMid($Selected_Text, $i, 1)
ExitLoop
EndIf
Next
; установка языка, иначе по раскладке
If $bykva<>'' Then
If StringInStr("ёйцукенгшщзхъфывапролджэячсмитьбю", $bykva) <> 0 Then $Lang = '1049'
If StringInStr("qwertyuiopasdfghjklzxcvbnm", $bykva) <> 0 Then $Lang = '1033'
EndIf
If $Lang = '' Then Return
If $mode = 4 Then ; красная строка, режим перевода в верхний регистр первой буквы
$bykva1 = ''
$Selected_Text = StringLower($Selected_Text)
For $i = 1 To StringLen($Selected_Text)
If StringInStr('ёйцукенгшщзхъфывапролджэячсмитьбюqwertyuiopasdfghjklzxcvbnm', StringMid($Selected_Text, $i, 1)) <> 0 Then
$New_Text = StringReplace($Selected_Text, $i, StringUpper(StringMid($Selected_Text, $i, 1)))
ExitLoop
EndIf
Next
EndIf
If $mode = 3 Then ; режим перевода в нижний регистр, в том числе спес-символов
$New_Text = StringLower($Selected_Text)
If $Lang = '1033' Then
$New_Text = StringReplace($New_Text, '@','2')
$New_Text = StringReplace($New_Text, '#','3')
$New_Text = StringReplace($New_Text, '$','4')
$New_Text = StringReplace($New_Text, '^','6')
$New_Text = StringReplace($New_Text, '&','7')
EndIf
If $Lang = '1049' Then
$New_Text = StringReplace($New_Text, '"','2')
$New_Text = StringReplace($New_Text, '№','3')
$New_Text = StringReplace($New_Text, ';','4')
$New_Text = StringReplace($New_Text, ':','6')
$New_Text = StringReplace($New_Text, '?','7')
EndIf
EndIf
If $mode = 2 Then ; режим перевода в верхний регистр, в том числе спес-символов
$New_Text = StringUpper($Selected_Text)
If $Lang = '1033' Then
$New_Text = StringReplace($New_Text, '2','@')
$New_Text = StringReplace($New_Text, '3','#')
$New_Text = StringReplace($New_Text, '4','$')
$New_Text = StringReplace($New_Text, '6','^')
$New_Text = StringReplace($New_Text, '7','&')
EndIf
If $Lang = '1049' Then
$New_Text = StringReplace($New_Text, '2','"')
$New_Text = StringReplace($New_Text, '3','№')
$New_Text = StringReplace($New_Text, '4',';')
$New_Text = StringReplace($New_Text, '6',':')
$New_Text = StringReplace($New_Text, '7','?')
EndIf
EndIf
If $mode = 1 Then ; режим инвертирования
;определяем язык
; если русский, то меняем на англ.
If $Lang = '1049' Then
For $i = 1 To $aBykvText[0]
$n = StringInStr($Ru, $aBykvText[$i], 1)
;===========================================================
; особое распознование в смешанном тексте для ;:? по левому символу
If StringInStr(';:?', $aBykvText[$i]) Then
$v=1
$bbb=0
While $i-$v>0 And $bbb=0
$bbb=StringInStr('ёйцукенгшщзхъфывапролджэячсмитьбюqwertyuiopasdfghjklzxcvbnm', $aBykvText[$i-$v])
$v+=1
WEnd
If $bbb > 33 Then
If $aBykvText[$i]=';' Then $New_Text &= 'ж'
If $aBykvText[$i]=':' Then $New_Text &= 'Ж'
If $aBykvText[$i]='?' Then $New_Text &= ','
ContinueLoop
EndIf
EndIf
;===========================================================
If $n = 0 Then
$n = StringInStr($En, $aBykvText[$i], 1)
If $n = 0 Then
$New_Text &= $aBykvText[$i]
Else
$New_Text &= StringMid($Ru, $n, 1)
EndIf
Else
$New_Text &= StringMid($En, $n, 1)
EndIf
Next
$setLang = '1033'
EndIf
; если английский, то меняем на русс.
If $Lang = '1033' Then
For $i = 1 To $aBykvText[0]
$n = StringInStr($En, $aBykvText[$i], 1)
;===========================================================
; особое распознование в смешанном тексте для ;:? по левому символу
If StringInStr(';:?', $aBykvText[$i]) Then
$v=1
$bbb=0
While $i-$v>0 And $bbb=0
$bbb=StringInStr('ёйцукенгшщзхъфывапролджэячсмитьбюqwertyuiopasdfghjklzxcvbnm', $aBykvText[$i-$v])
$v+=1
WEnd
If $bbb <= 33 And $bbb>0 Then
If $aBykvText[$i]=';' Then $New_Text &= '$'
If $aBykvText[$i]=':' Then $New_Text &= '^'
If $aBykvText[$i]='?' Then $New_Text &= '&'
ContinueLoop
EndIf
EndIf
;===========================================================
If $n = 0 Then
$n = StringInStr($Ru, $aBykvText[$i], 1)
If $n = 0 Then
$New_Text &= $aBykvText[$i]
Else
$New_Text &= StringMid($En, $n, 1)
EndIf
Else
$New_Text &= StringMid($Ru, $n, 1)
EndIf
Next
$setLang = '1049'
EndIf
EndIf
If $mode = 0 Then ; режим НЕ инвертирования
;определяем язык
; если русский, то меняем на англ.
If $Lang = '1049' Then
For $i = 1 To $aBykvText[0]
$n = StringInStr($Ru, $aBykvText[$i], 1)
If $n = 0 Then
$New_Text &= $aBykvText[$i]
Else
$New_Text &= StringMid($En, $n, 1)
EndIf
Next
$setLang = '1033'
EndIf
; если английский, то меняем на русс.
If $Lang = '1033' Then
For $i = 1 To $aBykvText[0]
$n = StringInStr($En, $aBykvText[$i], 1)
If $n = 0 Then
$New_Text &= $aBykvText[$i]
Else
$New_Text &= StringMid($Ru, $n, 1)
EndIf
Next
$setLang = '1049'
EndIf
EndIf
If $New_Text <> '' Then
ClipPut($New_Text) ; отправляем в буфер
Sleep(10)
Send("+{INS}") ; вставляем из буфера
Else
Send("{RIGHT}")
EndIf
ClipPut($Old_bufer) ; отправляем в буфер старый патерн
If $setLang <> '' Then
If $setLang = '1033' Then _SetKeyboardLayout("00000409", $hWnd)
If $setLang = '1049' Then _SetKeyboardLayout("00000419", $hWnd)
EndIf
EndFunc ;==>_Re
Func _SendEx($sSend_Data)
Local $hUser32DllOpen = DllOpen("User32.dll")
While _IsPressed("10", $hUser32DllOpen) Or _IsPressed("11", $hUser32DllOpen) Or _IsPressed("12", $hUser32DllOpen)
Sleep(10)
WEnd
Send($sSend_Data)
DllClose($hUser32DllOpen)
EndFunc ;==>_SendEx
; переключение раскладки клавиатуры
Func _SetKeyboardLayout($sLayoutID, $hWnd)
Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWnd, "int", 0x50, "int", 1, "int", $ret[0])
EndFunc ;==>_SetKeyboardLayout
Func _WinAPI_GetKeyboardLayout($hWnd)
Local $ret
$ret = DllCall('user32.dll', 'long', 'GetWindowThreadProcessId', 'hwnd', $hWnd, 'ptr', 0)
If (@error) Or (Not $ret[0]) Then
Return SetError(1, 0, 0)
EndIf
$ret = DllCall('user32.dll', 'long', 'GetKeyboardLayout', 'long', $ret[0])
If (@error) Or (Not $ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return BitAND($ret[0], 0xFFFF)
EndFunc ;==>_WinAPI_GetKeyboardLayout
Func _HotKeySet()
For $i = 1 to 8
_HotKeyAssign($HotKey[$i], '_Mode'&$i)
Next
EndFunc
Func _GuiHotKey()
Opt("TrayIconHide", 1)
$Gui1 = GUICreate('Назначение горячих клавиш', 440, 250)
$f1=25
Dim $TL[9] = [9, _
'исправление слова инвертированием', _
'исправление строки инвертированием', _
'исправление слова до первого пробела', _
'исправление слова либо всё русское, либо английское', _
'красная строка, первая буква заглавная', _
'перевод в верхний регистр', _
'перевод в нижний регистр', _
'Выход']
For $i = 1 to 8
Assign('Label' & $i, GUICtrlCreateLabel($TL[$i], 150,$f1*$i-10, 280, 17))
Assign('HotkeyInput' & $i, _GUICtrlCreateHotKeyInput($HotKey[$i], 10, $f1*$i-12, 130, 20))
Next
_KeyLock(0x062E) ; запретить CTRL-ALT-DEL
$ButtonOk = GUICtrlCreateButton('Применить', 350, 225, 80, 23)
GUISetState(@SW_SHOW, $Gui1)
$msg = $Gui1
$msg111 = ''
While 1
$msg = GUIGetMsg()
Select
Case $msg = $ButtonOk
For $i = 1 to 8
$iKey = _GUICtrlReadHotKeyInput(Eval('HotkeyInput' & $i))
If $iKey <> 0 Then
_HotKeyAssign(_GUICtrlReadHotKeyInput(Eval('HotkeyInput' & $i)), '_Mode'&$i)
If $HotKey[$i]<>$iKey Then
IniWrite($Ini, "HotKey", "HotKey"&$i, $iKey)
$HotKey[$i] = $iKey
EndIf
EndIf
;$msg111 &=_GUICtrlReadHotKeyInput(Eval('HotkeyInput' & $i))&@CRLF
Next
;ClipPut($msg111)
GUIDelete($Gui1)
Opt("TrayIconHide", 0)
ExitLoop
Case $msg = -3
GUIDelete($Gui1)
Opt("TrayIconHide", 0)
ExitLoop
EndSelect
WEnd
EndFunc
Func _Pause()
$Paused = NOT $Paused
TraySetIcon(@ScriptDir&"\TextCorrection.exe", 1)
HotKeySet('{ESC}', "_Pause")
TrayItemSetText($Suspend,'Возобновление по Esc')
TrayItemSetState($Suspend,128)
TrayItemSetState($About,128)
TrayItemSetState($Quit,128)
TrayItemSetState($Readme,128)
TrayItemSetState($GuiHotKey,128)
While $Paused
Sleep(200)
WEnd
TrayItemSetText($Suspend,'Приостановить')
TrayItemSetState($Suspend,64)
TrayItemSetState($About,64)
TrayItemSetState($Quit,64)
TrayItemSetState($Readme,64)
TrayItemSetState($GuiHotKey,64)
TraySetIcon(@ScriptDir&"\TextCorrection.exe", 4)
HotKeySet('{ESC}')
_HotKeySet()
EndFunc
Func _Readme()
Opt("TrayIconHide", 1)
MsgBox(0, 'Назначение программы', 'В скобках указана клавиша для английского языка' & @CRLF & @CRLF & _
'ESC - выход' & @CRLF & _
'Ctrl+\ исправление слова неинвертированием, либо всё на русском, либо всё на английском' & @CRLF & _
'Ctrl+ж (;) - исправление слова до первого пробела, неинвертированием' & @CRLF & _
'Ctrl+д (l) - исправление слова инвертированием' & @CRLF & _
'Ctrl+. (/) - исправление строки инвертированием' & @CRLF & _
'Ctrl+х ([) - перевод в верхний регистр' & @CRLF & _
'Ctrl+ъ (]) - перевод в нижний регистр' & @CRLF & _
'Ctrl+ю (.) - красная строка, первая буква заглавная.')
Opt("TrayIconHide", 0)
EndFunc
Func _About()
Opt("TrayIconHide", 1)
$font="Arial"
$Gui1 = GUICreate("О программе", 270, 180, -1, -1, -1, 0x00000080)
GUISetBkColor (0xf8c848)
GUICtrlCreateLabel('Text Correction', 0, 20, 270, 23, 0x01)
GUICtrlSetFont (-1,15, 600, -1, $font)
GUICtrlSetColor(-1,0xa21a10)
GUICtrlCreateLabel('исправление текста набранного в неправильной раскладке клавиатуры', 0, 49, 270, 46, 0x01)
GUICtrlSetFont (-1,11, 600, -1, $font)
GUISetFont (9, 600, -1, $font)
GUICtrlSetColor(-1,0xa21a10)
GUICtrlCreateLabel('Версия 0.4 от 6.06.2010', 55, 100, 210, 17)
GUICtrlCreateLabel('Сайт:', 55, 115, 40, 17)
$url=GUICtrlCreateLabel('http://azjio.ucoz.ru', 92, 115, 170, 17)
GUICtrlSetCursor(-1, 0)
GUICtrlSetColor(-1, 0x0000ff)
GUICtrlCreateLabel('WebMoney: R939163939152', 55, 130, 210, 17)
GUICtrlCreateLabel('Copyright AZJIO © 2010', 55, 145, 210, 17)
GUISetState(@SW_SHOW, $Gui1)
$msg = $Gui1
While 1
$msg = GUIGetMsg()
Select
Case $msg = $url
ShellExecute ('http://azjio.ucoz.ru')
Case $msg = -3
GUIDelete($Gui1)
Opt("TrayIconHide", 0)
ExitLoop
EndSelect
WEnd
EndFunc
; Misc.au3 - UDF
Func _IsPressed($sHexKey, $vDLL = 'user32.dll')
Local $a_R = DllCall($vDLL, "short", "GetAsyncKeyState", "int", '0x' & $sHexKey)
If @error Then Return SetError(@error, @extended, False)
Return BitAND($a_R[0], 0x8000) <> 0
EndFunc
Func _Singleton($sOccurenceName, $iFlag = 0)
Local Const $ERROR_ALREADY_EXISTS = 183
Local Const $SECURITY_DESCRIPTOR_REVISION = 1
Local $pSecurityAttributes = 0
If BitAND($iFlag, 2) Then
Local $tSecurityDescriptor = DllStructCreate("dword[5]")
Local $pSecurityDescriptor = DllStructGetPtr($tSecurityDescriptor)
Local $aRet = DllCall("advapi32.dll", "bool", "InitializeSecurityDescriptor", _
"ptr", $pSecurityDescriptor, "dword", $SECURITY_DESCRIPTOR_REVISION)
If @error Then Return SetError(@error, @extended, 0)
If $aRet[0] Then
$aRet = DllCall("advapi32.dll", "bool", "SetSecurityDescriptorDacl", _
"ptr", $pSecurityDescriptor, "bool", 1, "ptr", 0, "bool", 0)
If @error Then Return SetError(@error, @extended, 0)
If $aRet[0] Then
Local $structSecurityAttributes = DllStructCreate($tagSECURITY_ATTRIBUTES)
DllStructSetData($structSecurityAttributes, 1, DllStructGetSize($structSecurityAttributes))
DllStructSetData($structSecurityAttributes, 2, $pSecurityDescriptor)
DllStructSetData($structSecurityAttributes, 3, 0)
$pSecurityAttributes = DllStructGetPtr($structSecurityAttributes)
EndIf
EndIf
EndIf
Local $handle = DllCall("kernel32.dll", "handle", "CreateMutexW", "ptr", $pSecurityAttributes, "bool", 1, "wstr", $sOccurenceName)
If @error Then Return SetError(@error, @extended, 0)
Local $lastError = DllCall("kernel32.dll", "dword", "GetLastError")
If @error Then Return SetError(@error, @extended, 0)
If $lastError[0] = $ERROR_ALREADY_EXISTS Then
If BitAND($iFlag, 1) Then
Return SetError($lastError[0], $lastError[0], 0)
Else
Exit -1
EndIf
EndIf
Return $handle[0]
EndFunc