<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Break и Shift+Break как в пунто свитчере]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6393</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6393&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Break и Shift+Break как в пунто свитчере».]]></description>
		<lastBuildDate>Tue, 09 Sep 2025 13:40:54 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162713#p162713</link>
			<description><![CDATA[<p>Да, в некоторых приложениях работает некорректно. Попробую исправить, как руки дойдут. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 09 Sep 2025 13:40:54 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162713#p162713</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162710#p162710</link>
			<description><![CDATA[<p>Лично у меня некорректно работает смена раскладки слова слева от каретки в Subime Text (смена раскладки выделенного слова корректно работает).&nbsp; Скрипт в этом случае не заменяет слово, а вставляет слово с изменённой раскладкой в конец строки, оставляя при этом слово с неправильной раскладкой. Это можно пофиксить?</p>]]></description>
			<author><![CDATA[null@example.com (FoxWMulder)]]></author>
			<pubDate>Tue, 09 Sep 2025 11:24:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162710#p162710</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162159#p162159</link>
			<description><![CDATA[<p>Если находит в тексте пробел или таб.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 01 Apr 2025 09:22:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162159#p162159</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162158#p162158</link>
			<description><![CDATA[<div class="codebox"><pre><code>
      if RegExMatch(A_Clipboard, &quot;([ \t])&quot;, &amp;Found) &amp;&amp; A_Index != 1       ; было &quot;P)([ \t])&quot;
      {
         MsgBox &quot;RegExMatch !!!&quot;
         SendInput &quot;^+{Right}&quot;
         Return SubStr(A_Clipboard, Found.Pos[1] + 1)
      }</code></pre></div><p>Вроде так должно быть на v2. Только не могу понять, что отрабатывает данный блок кода, какой случай? Поставил индикатор вызова внутрь - MsgBox, но что то не удается добиться срабатывания.</p>]]></description>
			<author><![CDATA[null@example.com (AlexPORT)]]></author>
			<pubDate>Tue, 01 Apr 2025 08:31:19 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162158#p162158</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162157#p162157</link>
			<description><![CDATA[<div class="quotebox"><cite>AlexPORT пишет:</cite><blockquote><p>как это могло работать</p></blockquote></div><p><a href="https://www.autohotkey.com/docs/v1/lib/RegExMatch.htm#PosMode">https://www.autohotkey.com/docs/v1/lib/ … tm#PosMode</a><br /></p><div class="quotebox"><cite>AlexPORT пишет:</cite><blockquote><p>как поправить</p></blockquote></div><p>Придётся читать справку по RegEx для v2.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 01 Apr 2025 07:21:43 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162157#p162157</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=162156#p162156</link>
			<description><![CDATA[<p>Привет! Пытаюсь переложить на v2 последнюю версию скрипта <a href="http://forum.script-coding.com/viewtopic.php?pid=82490#p82490">отсюда</a>... В функции GetWord() есть кусок кода с двумя необъявленными переменными &quot;Found&quot; и &quot;FoundPos1 &quot;, на которые естественно идет ругачка при запуске скрипта:<br /></p><div class="codebox"><pre><code>
      if RegExMatch(Clipboard, &quot;P)([ \t])&quot;, Found) &amp;&amp; A_Index != 1
      {
         SendInput, ^+{Right}
         Return SubStr(Clipboard, FoundPos1 + 1)
      }</code></pre></div><p>Сообщение: Warning: This local variable appears to never be assigned a value.</p><p>Может кто пояснить, как это могло работать и как поправить? Found я бы мог еще понять, как выходная переменная для результата регекспа, но FoundPos1 ...</p>]]></description>
			<author><![CDATA[null@example.com (AlexPORT)]]></author>
			<pubDate>Tue, 01 Apr 2025 04:05:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=162156#p162156</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=157375#p157375</link>
			<description><![CDATA[<p>Мне для себя было интересно, Win7 я не использую. Все мои древние калькуляторы завелись под 10кой, несмотря на то что драйверов для них нет.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Thu, 23 Mar 2023 19:21:33 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=157375#p157375</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=157372#p157372</link>
			<description><![CDATA[<p>Ваша версия не работает под Win7, а та, что из коллекции работает.</p>]]></description>
			<author><![CDATA[null@example.com (stuermer)]]></author>
			<pubDate>Thu, 23 Mar 2023 18:09:42 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=157372#p157372</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=157316#p157316</link>
			<description><![CDATA[<div class="quotebox"><cite>serzh82saratov пишет:</cite><blockquote><p>У вас какие языки?</p></blockquote></div><p>У меня DE&lt;&gt;RU.</p><div class="quotebox"><cite>serzh82saratov пишет:</cite><blockquote><p>А пунто свитчер как себя ведёт если эту строку выделить?</p></blockquote></div><div class="codebox"><pre><code>абвфисв</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (stuermer)]]></author>
			<pubDate>Mon, 20 Mar 2023 20:08:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=157316#p157316</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=157315#p157315</link>
			<description><![CDATA[<div class="codebox"><pre><code>абвabcd</code></pre></div><p>А пунто свитчер как себя ведёт если эту строку выделить? Он только bcd поменяет на исв, или также абв поменяет на f,d.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Mon, 20 Mar 2023 19:09:20 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=157315#p157315</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=157314#p157314</link>
			<description><![CDATA[<div class="quotebox"><cite>serzh82saratov пишет:</cite><blockquote><p>Кстати если кто языки будет менять, напишите на каких нормально работает.</p></blockquote></div><p><strong>stuermer</strong><br />У вас какие языки?</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Mon, 20 Mar 2023 17:36:55 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=157314#p157314</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=157313#p157313</link>
			<description><![CDATA[<div class="quotebox"><cite>stuermer пишет:</cite><blockquote><p>На это я и расчитывал вначале</p></blockquote></div><p>Да, тогда мне интересно было, потом забылось, а тут слово за слово и допилилось.<br />Но посмотрим, может рано радоваться, не тестировалось же толком.<br />Кстати если кто языки будет менять, напишите на каких нормально работает.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Mon, 20 Mar 2023 17:13:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=157313#p157313</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=157312#p157312</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>RegEx, работать должно без него, само собой.<br />SymbolsListCreate без параметров выводит все установленные раскладки в буфер обмена.<br />Нужные раскладки можно менять не перезапуская скрипт, запустив SymbolsListCreate с нужными.</p></blockquote></div><p>На это я и расчитывал вначале, иначе нет преимущества по сравнению со старой версией в коллекции, если нужно раскладки вручную переделывать.<br />Работает, спасибо!</p>]]></description>
			<author><![CDATA[null@example.com (stuermer)]]></author>
			<pubDate>Mon, 20 Mar 2023 16:45:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=157312#p157312</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=157311#p157311</link>
			<description><![CDATA[<div class="quotebox"><cite>stuermer пишет:</cite><blockquote><p>Кто-то может под немецкий переделать? Я в Perl не силен.<br />Буквы хжэ -&gt; üöä соответственно.</p></blockquote></div><div class="codebox"><pre><code>RegExMatch(Char, &quot;(*UCP)[^\W\d_]&quot;)</code></pre></div><p>И этот ответ, породил решение этого<br /></p><div class="quotebox"><cite>serzh82saratov пишет:</cite><blockquote><p>Добавил ConvertRegistr, но с ним теперь такая штука, он был предназначен для исправления с неправильным CapsLock, а теперь как с неправильным Shift</p></blockquote></div><p>И самое интересное, теперь этот ответ не нужен, то есть RegEx, работать должно без него, само собой.</p><p>SymbolsListCreate без параметров выводит все установленные раскладки в буфер обмена.</p><p>Нужные раскладки можно менять не перезапуская скрипт, запустив SymbolsListCreate с нужными.<br /></p><div class="codebox"><pre><code>
/*
Смена раскладки написанного текста
Модификация этого скрипта https://forum.script-coding.com/viewtopic.php?pid=102343#p102343

v1.2
С генерацией раскладок
	http://forum.script-coding.com/viewtopic.php?pid=157311#p157311
*/

#SingleInstance Force
#Persistent
ListLines Off
SetBatchLines -1
#NoEnv

Global oSymbols := {} 
; SymbolsListCreate() ; Все раскладки в буфер обмена
SymbolsListCreate(&quot;ENU&quot;, &quot;RUS&quot;) 
Return
   
^PGDN::SwitchKeysLocale()   ; Ctrl + Page Down
+PGDN::SwitchRegistr()      ; Shift + Page Down

; Esc:: ExitApp

SwitchKeysLocale()
{
	SelText := GetWord(TempClipboard) 
	If SelText = 
		Return Clipboard := TempClipboard
	Clipboard := ConvertText(SelText, Layout)
	SendInput  {LCtrl Down}{vk56}{LCtrl Up}    ;  &quot;V&quot;
	Sleep, 50
	SwitchLocale(Layout)
	Sleep, 50
	Clipboard := TempClipboard
}

SwitchRegistr()
{
	SelText := GetWord(TempClipboard)
	If SelText = 
		Return Clipboard := TempClipboard
	Clipboard := ConvertRegistr(SelText) 
	SendInput  {LCtrl Down}{vk56}{LCtrl Up}    ;  &quot;V&quot;
	Sleep, 200 
	Clipboard := TempClipboard
}

GetWord(ByRef TempClipboard)
{
   SetBatchLines, -1
   SetKeyDelay, 0
   
   TempClipboard := ClipboardAll
   Clipboard =
   SendInput  {LCtrl Down}{vk43}{LCtrl Up}    ;  &quot;C&quot;
   Sleep, 100
   if (Clipboard != &quot;&quot;)
      Return Clipboard
   
   While A_Index &lt; 20
   {
      SendInput, {LCtrl Down}{LShift Down}{Left}{LCtrl Up}{LShift Up}{LCtrl Down}{vk43}{LCtrl Up}    ;  &quot;C&quot;
      ClipWait, 1
      if ErrorLevel
         Return

      if RegExMatch(Clipboard, &quot;P)([ \t])&quot;, Found) &amp;&amp; A_Index != 1
      {
         SendInput  {LCtrl Down}{LShift Down}{Right}{LCtrl Up}{LShift Up}
         Return SubStr(Clipboard, FoundPos1 + 1)
      }

      PrevClipboard := Clipboard
      Clipboard =
      SendInput, {LShift Down}{Left}{LShift Up}{LCtrl Down}{vk43}{LCtrl Up}    ;  &quot;C&quot;
      ClipWait, 1
      if ErrorLevel
         Return

      if (StrLen(Clipboard) = StrLen(PrevClipboard))
      {
         Clipboard =
         SendInput, {LShift Down}{Left}{LShift Up}{LCtrl Down}{vk43}{LCtrl Up}    ;  &quot;C&quot;
         ClipWait, 1
         if ErrorLevel
            Return

         if (StrLen(Clipboard) = StrLen(PrevClipboard))
            Return Clipboard
         Else
         {
            SendInput  {LShift Down}{Right 2}{LShift Up}
            Return PrevClipboard
         }
      }

      SendInput  {LShift Down}{Right}{LShift Up}

      s := SubStr(Clipboard, 1, 1)
      if s in %A_Space%,%A_Tab%,`n,`r
      {
         Clipboard =
         SendInput, {LShift Down}{Left}{LShift Up}{LCtrl Down}{vk43}{LCtrl Up}    ;  &quot;C&quot;
         ClipWait, 1
         if ErrorLevel
            Return

         Return Clipboard
      }
      Clipboard =
   }
}

ConvertText(string, ByRef OppositeLayout) 
{   
	L1 := L2 := 0
	Loop, Parse, string
	{  
		_ord := Ord(A_LoopField)
		If oSymbols[oSymbols.Langs[1]].charischar[_ord]
			++L1
		Else If oSymbols[oSymbols.Langs[2]].charischar[_ord]
			++L2 
	}
	if (L1 != L2)  {
		CurrentLayout := L1 &gt; L2 ? oSymbols.Langs[1] : oSymbols.Langs[2]
		OppositeLayout := L1 &gt; L2 ? oSymbols.Langs[2] : oSymbols.Langs[1] 
	}
	else
	{
		threadId := DllCall(&quot;GetWindowThreadProcessId&quot;, Ptr, WinExist(&quot;A&quot;), UInt, 0, Ptr)
		landId := DllCall(&quot;GetKeyboardLayout&quot;, Ptr, threadId, Ptr) &amp; 0xFFFF
		if (oSymbols.Langs[1] = landId)
			CurrentLayout := oSymbols.Langs[1], OppositeLayout := oSymbols.Langs[2]
		else
			CurrentLayout := oSymbols.Langs[2], OppositeLayout := oSymbols.Langs[1]
	}   
	Return ConvertLayout(string, CurrentLayout, OppositeLayout)
} 

SwitchLocale(Layout)
{
   ControlGetFocus, CtrlFocus, A
   PostMessage, 0x50,, Layout, %CtrlFocus%, A	; WM_INPUTLANGCHANGEREQUEST 
}

ConvertRegistr(string) {
	Loop, Parse, string
	{ 
		r := oSymbols.Registr[Ord(A_LoopField)] 
		newstring .= (r = &quot;&quot;) ? A_LoopField : r
	}
	Return newstring 
}

ConvertLayout(string, inhkl, outhkl) {
	Loop, Parse, string
	{ 
		If !sc := oSymbols[inhkl].chartocode[Ord(A_LoopField)]
			newstring .= A_LoopField
		Else
			newstring .= oSymbols[outhkl].sctochar[sc]
	}
	Return newstring 
}   

SymbolsListCreate(L1 = &quot;&quot;, L2 = &quot;&quot;) {
	; ENU = 1033, RUS = 1049, DEU = 1031
	Static MAPVK_VK_TO_VSC := 0
	If (L1 = &quot;&quot;)
	{
		for hkl, LayoutName in GetKeyboardLayoutList()
			LangsStr .= LayoutName &quot;`t&quot; hkl  &quot;`n&quot; 
		MsgBox % Clipboard := LangsStr
		Return
	}
	oSymbols := {} 
	oSymbols.Langs := [] 
	oSymbols.Registr := {}
	for hkl, LayoutName in GetKeyboardLayoutList()
	{ 
		If (LayoutName != L1 &amp;&amp; LayoutName != L2)
			Continue 
		oSymbols.Langs[2 - (LayoutName = L1)] := hkl 
		oSymbols[hkl] := {}, oSymbols[hkl].sctochar := {}
		oSymbols[hkl].chartocode := {}, oSymbols[LayoutName] := hkl
		oSymbols[hkl].charischar := {}
		for min, max in {0x30:0x5A,0xBA:0xE2}
		{
			loop % max - min + 1
			{
				vk := min + A_Index - 1
				If !sc := DllCall(&quot;MapVirtualKeyEx&quot;, &quot;Uint&quot;, vk, &quot;Uint&quot;, MAPVK_VK_TO_VSC, &quot;Ptr&quot;, hkl, &quot;Uint&quot;)
					Continue
				Char := GetKeyChar(vk, sc, hkl, 0), _Char := GetKeyChar(vk, sc, hkl, 1)
				If (Char != &quot;&quot;) 
				{
					_ord := Ord(Char)
					oSymbols[hkl].sctochar[sc] := Char
					oSymbols[hkl].chartocode[_ord] := sc
					If (RegExMatch(Char, &quot;(*UCP)[^\W\d_]&quot;))
					{
						oSymbols[hkl].charischar[_ord] := 1
						If (_Char != &quot;&quot;)
							oSymbols.Registr[_ord] := _Char 
					}
				}
				If (_Char != &quot;&quot;) 
				{
					_ord := Ord(_Char)
					oSymbols[hkl].sctochar[-sc] := _Char
					oSymbols[hkl].chartocode[_ord] := -sc 
					If (RegExMatch(_Char, &quot;(*UCP)[^\W\d_]&quot;))
					{
						oSymbols[hkl].charischar[_ord] := 1
						If (Char != &quot;&quot;)
							oSymbols.Registr[_ord] := Char 
					}  
				} 
			} 
		}
	}  
	If oSymbols.Langs.Count() != 2 
		Throw Exception(&quot;Не найдена указанная раскладка!&quot;)
} 

GetKeyChar(vk, sc, HKL, Shift = 0) {
    Static state, _ := VarSetCapacity(state, 256, 0)
		, char, __ := VarSetCapacity(char, 4, 0) 
	If Shift
		NumPut(-128, state, 0x10 , &quot;Char&quot;)  
	Else 
		NumPut(0, state, 0x10 , &quot;Char&quot;)   
    n := DllCall(&quot;ToUnicodeEx&quot;, &quot;uint&quot;, vk, &quot;uint&quot;, sc
        , &quot;ptr&quot;, &amp;state, &quot;ptr&quot;, &amp;char, &quot;int&quot;, 1, &quot;uint&quot;, 0, &quot;ptr&quot;, HKL)
    Return StrGet(&amp;char, n, &quot;utf-16&quot;)
}
	
GetKeyboardLayoutList() {
   VarSetCapacity(List, A_PtrSize*5)
   Size := DllCall(&quot;GetKeyboardLayoutList&quot;, Int, 5, Str, List)
   Locales := []
   Loop % Size 
		Locales[Locale := NumGet(List, A_PtrSize*(A_Index - 1)) &amp; 0xFFFF] := GetLangName(Locale)
   Return Locales
}

GetLangName(Locale, LCType := 3) { 
	Size := DllCall(&quot;GetLocaleInfo&quot;, UInt, Locale, UInt, LCType, UInt, 0, UInt, 0) * 2
	VarSetCapacity(lpLCData, Size, 0)
	DllCall(&quot;GetLocaleInfo&quot;, UInt, Locale, UInt, LCType, Str, lpLCData, UInt, Size)
	Return lpLCData
}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Mon, 20 Mar 2023 16:43:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=157311#p157311</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Break и Shift+Break как в пунто свитчере]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=157310#p157310</link>
			<description><![CDATA[<div class="quotebox"><cite>stuermer пишет:</cite><blockquote><p>Убрал лишнее из GetWord() - восстановление старого буфера и проверки</p></blockquote></div><p>Это на любителя.</p><br /><p>Добавил ConvertRegistr, но с ним теперь такая штука, он был предназначен для исправления с неправильным CapsLock, а теперь как с неправильным Shift, например &quot;5&quot; теперь меняется на &quot;%&quot;.</p><div class="codebox"><pre><code>#SingleInstance Force
#Persistent
#NoEnv  

Global oSymbols := {}
SymbolsListCreate(&quot;ENU&quot;, &quot;RUS&quot;)
Return

^PGDN::SwitchKeysLocale()   ; Ctrl + Page Down
+PGDN::SwitchRegistr()      ; Shift + Page Down

SwitchKeysLocale()
{
   SelText := GetWord(TempClipboard) 
   Clipboard := ConvertText(SelText, Layout)
   SendInput, ^{vk56}   ; Ctrl + V
   Sleep, 50
   SwitchLocale(Layout)
   Sleep, 50
   Clipboard := TempClipboard
}

SwitchRegistr()
{
   SelText := GetWord(TempClipboard)
   Clipboard := ConvertRegistr(SelText) 
   SendInput, ^{vk56}   ; Ctrl + V 
   Sleep, 200 
   Clipboard := TempClipboard
}

GetWord(ByRef TempClipboard)
{
   SetBatchLines, -1
   SetKeyDelay, 0
   
   TempClipboard := ClipboardAll
   Clipboard =
   SendInput, ^{vk43}
   Sleep, 100
   if (Clipboard != &quot;&quot;)
      Return Clipboard
   
   While A_Index &lt; 10
   {
      SendInput, ^+{Left}^{vk43}
      ClipWait, 1
      if ErrorLevel
         Return

      if RegExMatch(Clipboard, &quot;P)([ \t])&quot;, Found) &amp;&amp; A_Index != 1
      {
         SendInput, ^+{Right}
         Return SubStr(Clipboard, FoundPos1 + 1)
      }

      PrevClipboard := Clipboard
      Clipboard =
      SendInput, +{Left}^{vk43}
      ClipWait, 1
      if ErrorLevel
         Return

      if (StrLen(Clipboard) = StrLen(PrevClipboard))
      {
         Clipboard =
         SendInput, +{Left}^{vk43}
         ClipWait, 1
         if ErrorLevel
            Return

         if (StrLen(Clipboard) = StrLen(PrevClipboard))
            Return Clipboard
         Else
         {
            SendInput, +{Right 2}
            Return PrevClipboard
         }
      }

      SendInput, +{Right}

      s := SubStr(Clipboard, 1, 1)
      if s in %A_Space%,%A_Tab%,`n,`r
      {
         Clipboard =
         SendInput, +{Left}^{vk43}
         ClipWait, 1
         if ErrorLevel
            Return

         Return Clipboard
      }
      Clipboard =
   }
}

ConvertText(Text, ByRef OppositeLayout)
{  
   RegExReplace(Text, &quot;i)[A-Z@#\$\^&amp;\[\]&#039;`\{}]&quot;, &quot;&quot;, LatCount)
   RegExReplace(Text, &quot;i)[А-ЯЁ№]&quot;, &quot;&quot;, CyrCount)
   
   if (LatCount != CyrCount)  {
      CurrentLayout := LatCount &gt; CyrCount ? oSymbols.Langs[1] : oSymbols.Langs[2]
      OppositeLayout := LatCount &gt; CyrCount ? oSymbols.Langs[2] : oSymbols.Langs[1]
   }
   else
   {
      threadId := DllCall(&quot;GetWindowThreadProcessId&quot;, Ptr, WinExist(&quot;A&quot;), UInt, 0, Ptr)
      landId := DllCall(&quot;GetKeyboardLayout&quot;, Ptr, threadId, Ptr) &amp; 0xFFFF
      if (oSymbols.Langs[1] = landId)
         CurrentLayout := oSymbols.Langs[2], OppositeLayout := oSymbols.Langs[1]
      else
         CurrentLayout := oSymbols.Langs[1], OppositeLayout := oSymbols.Langs[2]
   }  
   Return Translate(Text, CurrentLayout, OppositeLayout)
} 

SwitchLocale(Layout)
{
   ControlGetFocus, CtrlFocus, A
   PostMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, Layout, %CtrlFocus%, A
}

ConvertRegistr(string) {
	Loop, Parse, string
	{ 
		r := oSymbols.Registr[Ord(A_LoopField)] 
		newstring .= (r = &quot;&quot;) ? A_LoopField : r
	}
	Return newstring 
}

Translate(string, inhkl, outhkl) {
	Loop, Parse, string
	{ 
		If !sc := oSymbols[inhkl].chartocode[Ord(A_LoopField)]
			newstring .= A_LoopField
		Else
			newstring .= oSymbols[outhkl].sctochar[sc]
	}
	Return newstring 
} 

SymbolsListCreate(L1, L2) {
	Static MAPVK_VK_TO_VSC := 0
	oSymbols := {}
	oSymbols.Langs := [] 
	oSymbols.Registr := {}
	for hkl, LayoutName in GetKeyboardLayoutList()
	{
		If (LayoutName != L1 &amp;&amp; LayoutName != L2)
			Continue 
		oSymbols.Langs[2 - (LayoutName = L1)] := hkl 
		oSymbols[hkl] := {}, oSymbols[hkl].sctochar := {}, oSymbols[hkl].chartocode := {}, oSymbols[LayoutName] := hkl
		for min, max in {0x30:0x5A,0xBA:0xE2}
			loop % max - min + 1
			{
				vk := min + A_Index - 1
				If !sc := DllCall(&quot;MapVirtualKeyEx&quot;, &quot;Uint&quot;, vk, &quot;Uint&quot;, MAPVK_VK_TO_VSC, &quot;Ptr&quot;, hkl, &quot;Uint&quot;)
					Continue
				Char := GetKeyChar(vk, sc, hkl, 0), _Char := GetKeyChar(vk, sc, hkl, 1)
				If (Char != &quot;&quot;) 
				{
					oSymbols[hkl].sctochar[sc] := Char
					oSymbols[hkl].chartocode[Ord(Char)] := sc 
					If (_Char != &quot;&quot;) 
						oSymbols.Registr[Ord(Char)] := _Char
				}
				If (_Char != &quot;&quot;) 
				{
					oSymbols[hkl].sctochar[-sc] := _Char
					oSymbols[hkl].chartocode[Ord(_Char)] := -sc 
					If (Char != &quot;&quot;) 
						oSymbols.Registr[Ord(_Char)] := Char
				} 
			}
	}  
}

GetKeyChar(vk, sc, HKL, Shift = 0) {
    Static state, _ := VarSetCapacity(state, 256, 0)
		, char, __ := VarSetCapacity(char, 4, 0) 
	If Shift
		NumPut(-128, state, 0x10 , &quot;Char&quot;)  
	Else 
		NumPut(0, state, 0x10 , &quot;Char&quot;)   
    n := DllCall(&quot;ToUnicodeEx&quot;, &quot;uint&quot;, vk, &quot;uint&quot;, sc
        , &quot;ptr&quot;, &amp;state, &quot;ptr&quot;, &amp;char, &quot;int&quot;, 1, &quot;uint&quot;, 0, &quot;ptr&quot;, HKL)
    Return StrGet(&amp;char, n, &quot;utf-16&quot;)
}
	
GetKeyboardLayoutList() {
   VarSetCapacity(List, A_PtrSize*5)
   Size := DllCall(&quot;GetKeyboardLayoutList&quot;, Int, 5, Str, List)
   Locales := []
   Loop % Size 
		Locales[Locale := NumGet(List, A_PtrSize*(A_Index - 1)) &amp; 0xFFFF] := GetLangName(Locale)
   Return Locales
}

GetLangName(Locale, LCType := 3) { 
	Size := DllCall(&quot;GetLocaleInfo&quot;, UInt, Locale, UInt, LCType, UInt, 0, UInt, 0) * 2
	VarSetCapacity(lpLCData, Size, 0)
	DllCall(&quot;GetLocaleInfo&quot;, UInt, Locale, UInt, LCType, Str, lpLCData, UInt, Size)
	Return lpLCData
} </code></pre></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Mon, 20 Mar 2023 15:44:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=157310#p157310</guid>
		</item>
	</channel>
</rss>
