<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Еще один заменитель Punto Switcher'a]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=8737</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=8737&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Еще один заменитель Punto Switcher'a».]]></description>
		<lastBuildDate>Tue, 09 Feb 2021 21:34:30 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=146091#p146091</link>
			<description><![CDATA[<p><strong>MtZay</strong>, не вы первый кого не устраивали какие-либо правила форума.<br />Всегда заканчивалось одним и тем же - пользователь не получал помощи на свой вопрос по скриптованию и уходил ни с чем.<br />Особо надоедливых банили.</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Tue, 09 Feb 2021 21:34:30 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=146091#p146091</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=146071#p146071</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>предьявы<br />небыло<br />в предложеинии<br /><strong><a href="https://i.ibb.co/ZSftDGq/qt4ye.png">самому довелось быть модератором</a></strong><br />он сам нарушает правила модерирования<br />самосуд</p></blockquote></div><p>Зачем в милицию? Сразу к прокурору.<br /><span class="postimg"><img src="https://citaty.info/files/styles/s/public/quote-pictures/457599-kavkazskaya-plennica-ili-novye-priklyucheniya-shurika_1.jpg" alt="https://citaty.info/files/styles/s/public/quote-pictures/457599-kavkazskaya-plennica-ili-novye-priklyucheniya-shurika_1.jpg" /></span></p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Tue, 09 Feb 2021 14:32:56 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=146071#p146071</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=146070#p146070</link>
			<description><![CDATA[<div class="quotebox"><cite>MtZay пишет:</cite><blockquote><p>завершая последнее предложение точкой - чувствуется эмоциональный окрас жесткости и безразличия, а опуская точку выражается некая нейтральность, желаниее продолжения диалога</p></blockquote></div><p>Да, чувствуется, что трава у вас забористая...</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 09 Feb 2021 14:25:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=146070#p146070</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=146068#p146068</link>
			<description><![CDATA[<div class="quotebox"><cite>Malcev пишет:</cite><blockquote><p><strong>__Михаил__</strong>, а стоит ли отвечать пользователю, который не соблюдает правила форума и игнорит замечания модератора?</p></blockquote></div><p>Как только я прочел правила, на основании которых была притензия к моему стилю изложения, я сразу все исправил(можете проверить дату исправления). Но вот модератор свой минус из репутации не убрал. При том, что он сам нарушает правила модерирования, при указании на ошибку, необходимо ссылатся в этом же посте на пункт нарушеных правил, как делается на всех порядочных форумах(самому довелось быть модератором). А просто указами сыпать - это превышение своих полномочий и самосуд!&nbsp; <br />И вас не чуть не смутило основание его предьявы, что у меня небыло точки в предложеинии, после которого не следовало следующего. Мне удобно иногда так поступать, потому что завершая последнее предложение точкой - чувствуется эмоциональный окрас жесткости и безразличия, а опуская точку выражается некая нейтральность, желаниее продолжения диалога. А этот докапался просто из-за того что я мол сделал что то не так, как в его манямирке принято. И не надо мне тыкать сводом правил русского языка, который обновлялся в последний раз в 1956 году, когда еще и форумов то небыло, язык развивается и меняется, как все вокруг.</p>]]></description>
			<author><![CDATA[null@example.com (MtZay)]]></author>
			<pubDate>Tue, 09 Feb 2021 13:20:56 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=146068#p146068</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=145736#p145736</link>
			<description><![CDATA[<p><strong>__Михаил__</strong>, а стоит ли отвечать пользователю, который не соблюдает правила форума и игнорит замечания модератора?</p>]]></description>
			<author><![CDATA[null@example.com (Malcev)]]></author>
			<pubDate>Tue, 02 Feb 2021 18:06:11 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=145736#p145736</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=145735#p145735</link>
			<description><![CDATA[<div class="quotebox"><cite>__Михаил__ пишет:</cite><blockquote><p><strong>MtZay</strong></p><p>А строка вначале &#039;Hotkey % &quot;Pause&quot;, % corr&#039; вообще ничего не говорит?</p></blockquote></div><p>Да говорит,&nbsp; просто в оригенале смена происходит нажатием shift+pause, и раз stealzy не оговорил этот момент, значит всё осталось по дефолту. </p><p>Подскажите пожалуйста, где в коде pause связана с шифтом?</p>]]></description>
			<author><![CDATA[null@example.com (MtZay)]]></author>
			<pubDate>Tue, 02 Feb 2021 18:03:25 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=145735#p145735</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=145733#p145733</link>
			<description><![CDATA[<p><strong>MtZay</strong></p><p>А строка вначале &#039;Hotkey % &quot;Pause&quot;, % corr&#039; вообще ничего не говорит?</p>]]></description>
			<author><![CDATA[null@example.com (__Михаил__)]]></author>
			<pubDate>Tue, 02 Feb 2021 16:55:51 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=145733#p145733</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=145732#p145732</link>
			<description><![CDATA[<p><span style="color: green">Вот, читайте: <a href="http://forum.script-coding.com/misc.php?action=rules">Важнейшие правила поведения на форуме</a>.</span></p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Tue, 02 Feb 2021 16:43:40 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=145732#p145732</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=145731#p145731</link>
			<description><![CDATA[<div class="quotebox"><cite>ypppu пишет:</cite><blockquote><p><span style="color: green"><strong>MtZay</strong>, предложения должны начинаться с заглавной буквы и заканчиваться знаками препинания. Исправьте!</span><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=145715#p145715">http://forum.script-coding.com/viewtopi … 15#p145715</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=141445#p141445">http://forum.script-coding.com/viewtopi … 45#p141445</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=141394#p141394">http://forum.script-coding.com/viewtopi … 94#p141394</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=141391#p141391">http://forum.script-coding.com/viewtopi … 91#p141391</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=141341#p141341">http://forum.script-coding.com/viewtopi … 41#p141341</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=143498#p143498">http://forum.script-coding.com/viewtopi … 98#p143498</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=143493#p143493">http://forum.script-coding.com/viewtopi … 93#p143493</a></p></blockquote></div><p>Кому я опять что то должен? На каком основании, товарищ офицер? Предьявите статью занона о моём нарушении. Быстро!</p>]]></description>
			<author><![CDATA[null@example.com (MtZay)]]></author>
			<pubDate>Tue, 02 Feb 2021 16:18:21 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=145731#p145731</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=145724#p145724</link>
			<description><![CDATA[<p><span style="color: green"><strong>MtZay</strong>, предложения должны начинаться с заглавной буквы и заканчиваться знаками препинания. Исправьте!</span><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=145715#p145715">http://forum.script-coding.com/viewtopi … 15#p145715</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=141445#p141445">http://forum.script-coding.com/viewtopi … 45#p141445</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=141394#p141394">http://forum.script-coding.com/viewtopi … 94#p141394</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=141391#p141391">http://forum.script-coding.com/viewtopi … 91#p141391</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=141341#p141341">http://forum.script-coding.com/viewtopi … 41#p141341</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=143498#p143498">http://forum.script-coding.com/viewtopi … 98#p143498</a><br /><a href="http://forum.script-coding.com/viewtopic.php?pid=143493#p143493">http://forum.script-coding.com/viewtopi … 93#p143493</a></p>]]></description>
			<author><![CDATA[null@example.com (ypppu)]]></author>
			<pubDate>Tue, 02 Feb 2021 14:42:52 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=145724#p145724</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=145715#p145715</link>
			<description><![CDATA[<div class="quotebox"><cite>stealzy пишет:</cite><blockquote><p>Почти полностью переписал скрипт.</p><p>По заданной ГК исправляется последний набранный текст, таковым считается любой текст,<br />не прерывающийся нажатием клавиш:<br />мыши, навигации (←↑↓→Pg*, Home, End), модификаторов (Alt Ctrl Win), Enter, Esc, F[1-12].<br />Полный список прерывающих клавиш содержится в методе _GetInputText().<br />Можно добавить туда пробел - тогда будет исправлятся только последнее слово.<br />Можно исключить Enter - тогда можно исправлять абзацами <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />.<br />После исправления текста переключается раскладка.<br />Если выделен текст, то исправлен будет он.<br />(Большинством символов в выделенном будет определена раскладка, символы из которой необходимо исправить.)<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header"><strong>+</strong>&nbsp;Тех. особенности:</div><div class="fancy_spoiler"><p>• Использует команду Input для взятия последнего введенного текста,<br />если переменная последнего введенного текста пуста, то ^{Ins} и взятие из буфера обмена (выделенный текст)<br />(если использована одна из EndKeys клавиш, описанных в методе _GetInputText() или клик мышью, переменная последнего введенного текста обнуляется).<br />• Текст исправляется с помощью захардкоженного соответствия латинских и кириллических символов в стандартных раскладках (строки Lat:=&quot;~QWER... и Cyr:=&quot;ЁЙЦУК..., описанные в методе _GetTextInOppositeLayout()).<br />Направление исправления выбирается на основе тек.раскладки, для выделенного текста - на основе большинства символов в тексте.<br />• Использует BackSpace для стирания последнего введенного текста, и SendInput для ввода исправленного.</p><p>Ограничения: в одном скрипте с переключалкой нежелательно использовать горячие клавиши на клики мышью или клавиши модификаторы (переключалка устанавливает свои прозрачные ГК на мышь для запрета исправления введенного текста после клика мышью).</p></div></div><div class="codebox"><pre><code>#SingleInstance, force
#NoEnv
; #NoTrayIcon
P := new Punto
corr := ObjBindMethod(P, &quot;CorrectionEnteredText&quot;)
Hotkey % &quot;Pause&quot;, % corr
; togg := ObjBindMethod(P, &quot;ToggleLayout&quot;)
; Hotkey % &quot;!&quot; Format(&quot;vk{:02x}&quot;, GetKeyVK(&quot;R&quot;)), % corr
Return

Class Punto {
	__New() {
		; Workaround for include mouse button in Input EndKeys
			_InputFn := ObjBindMethod(this, &quot;_Input&quot;)
			_InputModFn := ObjBindMethod(this, &quot;_Input&quot;, keyModifier := true)
			Hotkey ~*LButton, % _InputFn
			Hotkey ~*RButton, % _InputFn
			Hotkey ~*MButton, % _InputFn
		; Workaround for run CorrectionEnteredText() from hotkey including modifier keys:
		; you can&#039;t put LAlt in EndKeys if you run correction method by hotkey contain Alt (!R).
			Hotkey ~*LControl, % _InputModFn
			Hotkey ~*RControl, % _InputModFn
			Hotkey ~*LAlt, % _InputModFn
			Hotkey ~*RAlt, % _InputModFn
			Hotkey ~*LWin, % _InputModFn
			Hotkey ~*RWin, % _InputModFn
		timer := ObjBindMethod(this, &quot;_GetInputText&quot;)
		SetTimer % timer, -1
	}
	_Input(keyModifier:=false) {
		If keyModifier ; Workaround because bug with using Hotkey ~*LAlt Up,
			KeyWait, % LTrim(A_ThisHotkey, &quot;~*&quot;)
		Input
	}
	_GetInputText() {
		Input text, i v, {Enter}{NumpadEnter}{Tab}{Backspace}{Escape}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}{Ins}{Capslock}{Numlock}{PrintScreen}{Pause}
		this.ReplaceAfter := this.ReplaceAfter ? this._ReplaceText(text) :
		timer := ObjBindMethod(this, &quot;_GetInputText&quot;)
		SetTimer % timer, -1
	}

	CorrectionEnteredText() {
		this.ReplaceAfter:=true
		Input
	}

	_ReplaceText(text) {
		StringLen count, text
		if (count&gt;0)	; если вводился текст
			SendInput {BS %count%}
		else { 				; если выделен текст (при выделении используются кнопки мыши или шифт с навигационными кл. =&gt; text=&quot;&quot; =&gt; count=0)
			cliptmp:=Clipboard
			Clipboard =
			SendPlay ^{Ins}
			Send ^{vk43}
			ClipWait .7, 1
			clipNew:=Clipboard
			if (clipNew != &quot;&quot;) {
				text:=Clipboard
				fromClip:=true
			} else {
				Tooltip Выделите текст для исправления, A_CaretX+20, A_CaretY-3
				SetTimer TToff, -1000
				Return

				TToff:
					ToolTip
					Return
			}
			Clipboard:=cliptmp
		}

		substituteText := this._GetTextInOppositeLayout(text, fromClip, LayoutNeedToggle)
		(!fromClip || LayoutNeedToggle)  ?  this.ToggleLayout()
		Sleep 50 ; без задержки появляются баги со знаками пунктуации
		SetKeyDelay 50, 50
		SendInput {Raw}%substituteText%
		Return
	}
	_GetTextInOppositeLayout(text, fromClip, ByRef LayoutNeedToggle) {
		static Lat:=&quot;~QWERTYUIOP{}ASDFGHJKL:&quot;&quot;ZXCVBNM&lt;&gt;``qwertyuiop[]asdfghjkl;&#039;zxcvbnm,./|?@#$^&amp;&quot;
		, Cyr:=&quot;ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю./,&quot;&quot;№;:?&quot;

		En := (this.GetInputHKL() = 0x04090409)
		If fromClip {
			; для выделенного текста определяем принадлежность большинства символов к той или иной раскладке
			u := 0
			Loop, parse, text
			{
				OutputDebug % (A_LoopField = &quot;`n&quot;) &quot; &quot; (A_LoopField = &quot;`r&quot;)
				LatSym := InStr(Lat, A_LoopField), CyrSym := InStr(Cyr, A_LoopField)
				if (LatSym &amp;&amp; !CyrSym)
					++u
				else if (CyrSym &amp;&amp; !LatSym)
					--u
			}

			failureLayout:= (u&gt;0) ? Lat : Cyr
			correctLayout := (u&gt;0) ? Cyr : Lat
			LayoutNeedToggle := En ^ (u&lt;=0)
		}
		Else {
			; для простого переключения основываемся на тек. раскладке
			failureLayout:= En ? Lat : Cyr
			correctLayout := En ? Cyr : Lat
		}

		Loop, parse, text,, `r ; `r — hack for Send command, because it regards `r`n as separate \n
		{
			if (symbolNum := InStr(failureLayout, A_LoopField, CaseSensitive:=true))
				substituteText .= SubStr(correctLayout, symbolNum, 1)
			else
				substituteText .= A_LoopField
		}
		Return substituteText
	}
	ToggleLayout() {
		PostMessage, 0x50, 2,,, % (hWndOwn := DllCall(&quot;GetWindow&quot;, Ptr, hWnd:=WinActive(&quot;A&quot;), UInt, GW_OWNER := 4, Ptr)) ? &quot;ahk_id&quot; hWndOwn : &quot;ahk_id&quot; hWnd
	}
	GetInputHKL() {
		hWnd := WinExist(&quot;A&quot;)
		WinGetClass, Class
		if (Class == &quot;ConsoleWindowClass&quot;) {
				WinGet, consolePID, PID
				DllCall(&quot;AttachConsole&quot;, Ptr, consolePID)
				VarSetCapacity(buff, 16)
				DllCall(&quot;GetConsoleKeyboardLayoutName&quot;, Str, buff)
				DllCall(&quot;FreeConsole&quot;)
				HKL := &quot;0x&quot; . SubStr(buff, -3)
		} else
			HKL := DllCall(&quot;GetKeyboardLayout&quot;, Ptr, DllCall(&quot;GetWindowThreadProcessId&quot;, Ptr, hWnd, UInt, 0, Ptr), Ptr)
		return HKL
	}
}</code></pre></div></blockquote></div><br /><br /><p>Подскажите пожалуйста, где в коде можно поменять хоткей для смены раскладки введеного текста? Я увидел кнопку паузы, но у меня ее нет на клаве(укороченая), и хотел бы поменять на дабл шифт, как в пунте.</p>]]></description>
			<author><![CDATA[null@example.com (MtZay)]]></author>
			<pubDate>Tue, 02 Feb 2021 11:57:28 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=145715#p145715</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=143945#p143945</link>
			<description><![CDATA[<p><strong>stealzy</strong><br />Спасибо за отличный скрипт! Давно отказался от Puntoswitcher, и вот прекрасная возможность кастомно и секьюрно настроить пост-переключение языков &quot;под себя&quot;.</p><p><strong>ww2</strong><br />Спасибо за тестирование разнообразных вариаций! Если Вы хотите избежать головную боль с циклическим переключением 3+ языков, замените<br /></p><div class="codebox"><pre><code>
PostMessage, 0x50, 2,,, % (hWndOwn := DllCall(&quot;GetWindow&quot;, Ptr, hWnd:=WinActive(&quot;A&quot;), UInt, GW_OWNER := 4, Ptr)) ? &quot;ahk_id&quot; hWndOwn : &quot;ahk_id&quot; hWnd
</code></pre></div><p>на <br /></p><div class="codebox"><pre><code>    
    ru := DllCall(&quot;LoadKeyboardLayout&quot;, &quot;Str&quot;, &quot;00000419&quot;, &quot;Int&quot;, 1)
    en := DllCall(&quot;LoadKeyboardLayout&quot;, &quot;Str&quot;, &quot;00000409&quot;, &quot;Int&quot;, 1)
      
    w := DllCall(&quot;GetForegroundWindow&quot;)
    pid := DllCall(&quot;GetWindowThreadProcessId&quot;, &quot;UInt&quot;, w, &quot;Ptr&quot;, 0)
    l := DllCall(&quot;GetKeyboardLayout&quot;, &quot;UInt&quot;, pid)
    if (l = en)
    {
        PostMessage 0x50, 0, %ru%,, A
    }
    else
    {
        PostMessage 0x50, 0, %en%,, A
    }
</code></pre></div><p>Credits: <a href="https://autohotkey.com/board/topic/70019-keyboard-layout-switcher-for-many-layouts/">https://autohotkey.com/board/topic/7001 … y-layouts/</a></p>]]></description>
			<author><![CDATA[null@example.com (drwindb)]]></author>
			<pubDate>Sun, 06 Dec 2020 16:04:18 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=143945#p143945</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=140517#p140517</link>
			<description><![CDATA[<p>Выбирал скрипты для замены Пунто. Самые стабильные оказались&nbsp; от <strong>stealzy </strong>(в 36 сообщении)<br />Была проблема с конвертацией выделения, но после того, как поменял SendPlay ^{Ins} на Send ^{vk43} по подсказке Автора, стало вообще все корректно.<br />Единственная проблема. У меня 3 установленных языка в системе (РУС,ENG,УКР). Так вот, если текст ошибочно набираю на английском, то исправление на русский влечет за собой и переключение языка на РУС.<br />Если ошибочно набираю на русском, то текст переводит на английский без проблем, но вот раскладку переключает на УКР. Изменение последовательности раскладок не помогает. Похоже, что переключение происходит не на конкретный язык, а на &quot;следующий&quot;. При 2-х языках такой проблемы, естественно, не будет. Смотрел скрипты и у других Авторов, но там проблем больше. У скрипта <strong>Krot66 </strong>в какой-то момент переключение вообще перестает работать, а у <strong>toxicdream </strong>иногда &quot;глотает&quot; переводы строк. <br />Сам с AHK последний раз работал лет 12-15 назад, да и то писал простенькие скрипты, поэтому сейчас &quot;с налету&quot; не смогу разобраться с текстом и исправить самостоятельно.<br />Логику работы, на мой взгляд, следует оставить существующую (определение раскладки выделенного текста &quot;голосованием&quot;). Так как 95% букв в кириллических языках совпадает, то выбор раскладки выделенного текста делать между русским и английским (кириллицей-латиницей). И при конвертации с латиницы на кириллицу переключать на РУС, а при конвертации кириллицы в латиницу - принудительно в ENG вне зависимости от того какая раскладка была текущей и сколько вообще языков и раскладок в системе установлено.<br />На случай, если текст будет набран в украинской раскладке вместо английской, добавлю в строки Cyr и Lat 3 украинские буквы и их соответствия в латинице, чтобы предусмотреть такой вариант. Уж с этим я разберусь самостоятельно <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> <br />Вариант циклического переключения языков не очень удобен (такой подход реализован в CarambaSwitcher Сергея Москалева - родоначальника PuntoSwitcher). Так как при каждой последующей конвертации текста из-за возможных знаков пунктуации текст может приобрести такой вид, что легче его перепечатать заново.<br />И, кстати, CarambaSwitcher тоже иногда вешает Скайп <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (ww2)]]></author>
			<pubDate>Wed, 01 Jul 2020 18:49:59 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=140517#p140517</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=137252#p137252</link>
			<description><![CDATA[<div class="codebox"><pre><code>ButtonSwitchLocale:
StringCaseSense On
ControlFocus, Edit1, ahk_exe AutoHotkey.exe
Send ^{vk41}  ; &quot;Ctrl+A&quot;

   ;clipSave:=clipAnsi()
   send ^{Insert}
   sleep,50
StringReplace, Clipboard, Clipboard, zh , ж , All
StringReplace, Clipboard, Clipboard, kh , х , All
StringReplace, Clipboard, Clipboard, shh , щ , All
StringReplace, Clipboard, Clipboard, sch , щ , All
StringReplace, Clipboard, Clipboard, sh , ш , All
StringReplace, Clipboard, Clipboard, ju , ю , All
StringReplace, Clipboard, Clipboard, yu , ю , All
StringReplace, Clipboard, Clipboard, ja , я , All
StringReplace, Clipboard, Clipboard, ya , я , All
StringReplace, Clipboard, Clipboard, ts , ц , All
StringReplace, Clipboard, Clipboard, ch , ч , All
StringReplace, Clipboard, Clipboard, c , ц , All
StringReplace, Clipboard, Clipboard, h , х , All
StringReplace, Clipboard, Clipboard, j , й , All
StringReplace, Clipboard, Clipboard, Zh , Ж , All
StringReplace, Clipboard, Clipboard, Kh , Х , All
StringReplace, Clipboard, Clipboard, Shh , Щ , All
StringReplace, Clipboard, Clipboard, Ju , Ю , All
StringReplace, Clipboard, Clipboard, Yu , Ю , All
StringReplace, Clipboard, Clipboard, Ja , Я , All
StringReplace, Clipboard, Clipboard, Ya , Я , All
StringReplace, Clipboard, Clipboard, Ts , Ц , All
StringReplace, Clipboard, Clipboard, Ch , Ч , All
StringReplace, Clipboard, Clipboard, Sch , Щ , All
StringReplace, Clipboard, Clipboard, Sh , Ш , All
StringReplace, Clipboard, Clipboard, C , Ц , All
StringReplace, Clipboard, Clipboard, H , Х , All
StringReplace, Clipboard, Clipboard, a , а , All
StringReplace, Clipboard, Clipboard, b , б , All
StringReplace, Clipboard, Clipboard, v , в , All
StringReplace, Clipboard, Clipboard, w , в , All
StringReplace, Clipboard, Clipboard, g , г , All
StringReplace, Clipboard, Clipboard, d , д , All
StringReplace, Clipboard, Clipboard, e , е , All
StringReplace, Clipboard, Clipboard, z , з , All
StringReplace, Clipboard, Clipboard, i , и , All
StringReplace, Clipboard, Clipboard, k , к , All
StringReplace, Clipboard, Clipboard, l , л , All
StringReplace, Clipboard, Clipboard, m , м , All
StringReplace, Clipboard, Clipboard, n , н , All
StringReplace, Clipboard, Clipboard, o , о , All
StringReplace, Clipboard, Clipboard, p , п , All
StringReplace, Clipboard, Clipboard, r , р , All
StringReplace, Clipboard, Clipboard, s , с , All
StringReplace, Clipboard, Clipboard, t , т , All
StringReplace, Clipboard, Clipboard, u , у , All
StringReplace, Clipboard, Clipboard, f , ф , All
StringReplace, Clipboard, Clipboard, y , ы , All
StringReplace, Clipboard, Clipboard, &#039; , ь , All
StringReplace, Clipboard, Clipboard, A , А , All
StringReplace, Clipboard, Clipboard, B , Б , All
StringReplace, Clipboard, Clipboard, V , В , All
StringReplace, Clipboard, Clipboard, W , В , All
StringReplace, Clipboard, Clipboard, G , Г , All
StringReplace, Clipboard, Clipboard, D , Д , All
StringReplace, Clipboard, Clipboard, E , Е , All
StringReplace, Clipboard, Clipboard, Z , З , All
StringReplace, Clipboard, Clipboard, I , И , All
StringReplace, Clipboard, Clipboard, K , К , All
StringReplace, Clipboard, Clipboard, L , Л , All
StringReplace, Clipboard, Clipboard, M , М , All
StringReplace, Clipboard, Clipboard, N , Н , All
StringReplace, Clipboard, Clipboard, O , О , All
StringReplace, Clipboard, Clipboard, P , П , All
StringReplace, Clipboard, Clipboard, R , Р , All
StringReplace, Clipboard, Clipboard, S , С , All
StringReplace, Clipboard, Clipboard, T , Т , All
StringReplace, Clipboard, Clipboard, U , У , All
StringReplace, Clipboard, Clipboard, F , Ф , All
StringReplace, Clipboard, Clipboard, Y , Ы , All
   send +{Insert}

Return
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (EV)]]></author>
			<pubDate>Tue, 14 Jan 2020 07:53:55 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=137252#p137252</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: Еще один заменитель Punto Switcher'a]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=136879#p136879</link>
			<description><![CDATA[<p>Спасибо большое.<br />На основе ваших скриптов наваял свое поделие.<br />Тестировал на двух языках в Windows 10.<br />Из особенностей:<br />+ работает в Edge<br />+ работает в консольных окнах CMD<br />+ перекодировывает смешанные строки</p><p>Для &quot;железобетонного&quot; переключения желательно назначить на каждый язык сочетание клавиш для переключения.<br />Или вручную, или с помощью файла реестра. В скрипте для английской раскладки ожидается Ctrl+Shist+1, для русской - Ctrl+Shift+2.<br /></p><div class="codebox"><pre><code>Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000100]
&quot;Virtual Key&quot;=hex:31,00,00,00
&quot;Key Modifiers&quot;=hex:06,c0,00,00
&quot;Target IME&quot;=hex:09,04,09,04

[HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\00000101]
&quot;Virtual Key&quot;=hex:32,00,00,00
&quot;Key Modifiers&quot;=hex:06,c0,00,00
&quot;Target IME&quot;=hex:19,04,19,04
</code></pre></div><p>Собственно моё изделие:<br /></p><div class="codebox"><pre><code>#InstallKeybdHook
#SingleInstance, force
#NoEnv
;#NoTrayIcon

SetNumLockState,    On
SetScrollLockState, AlwaysOff
SetCapsLockState,   AlwaysOff

MyPunto := new Punto

corr := ObjBindMethod(MyPunto, &quot;CorrectionEnteredText&quot;)
togg := ObjBindMethod(MyPunto, &quot;ToggleLayout&quot;)
tgEN := ObjBindMethod(MyPunto, &quot;ToggleLayout&quot;, &quot;ENG&quot;)
tgRU := ObjBindMethod(MyPunto, &quot;ToggleLayout&quot;, &quot;RUS&quot;)
;chck := ObjBindMethod(MyPunto, &quot;_check_lang&quot;)

Hotkey Pause,      %corr%
Hotkey ScrollLock, %togg%
Hotkey CapsLock,   %tgEN%
Hotkey +CapsLock,  %tgRU%
Hotkey ^CapsLock,  %tgRU%
Hotkey #n,         AkelPad
Hotkey #c,         Command
;Hotkey F12,        %chck%
Return

AkelPad:
Run c:\totalcmd\PROGRAMS\AkelPad.exe
Return

Command:
Run cmd.exe
Return

Class Punto {
	__New()
	{
		; Workaround for include mouse button in Input EndKeys
		_InputFn    := ObjBindMethod(this, &quot;_Input&quot;)
		_InputModFn := ObjBindMethod(this, &quot;_Input&quot;, keyModifier := true)
		Hotkey ~*LButton,  %_InputFn%
		Hotkey ~*RButton,  %_InputFn%
		Hotkey ~*MButton,  %_InputFn%
		; Workaround for run CorrectionEnteredText() from hotkey including modifier keys:
		; you can&#039;t put LAlt in EndKeys if you run correction method by hotkey contain Alt (!R).
		Hotkey ~*LControl, %_InputModFn%
		Hotkey ~*RControl, %_InputModFn%
		Hotkey ~*LAlt,     %_InputModFn%
		Hotkey ~*RAlt,     %_InputModFn%
		Hotkey ~*LWin,     %_InputModFn%
		Hotkey ~*RWin,     %_InputModFn%
		timer := ObjBindMethod(this, &quot;_GetInputText&quot;)
		SetTimer %timer%, -1
	}

	_Input(keyModifier:=false)
	{
		If keyModifier ; Workaround because bug with using Hotkey ~*LAlt Up,
			KeyWait, %LTrim%(A_ThisHotkey, &quot;~*&quot;)
		Input
	}

	_GetInputText()
	{						
		Input text, i v, {Enter}{NumpadEnter}{Tab}{Backspace}{Escape}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}{Ins}{Capslock}{Numlock}{PrintScreen}{Pause}
		this.ReplaceAfter := this.ReplaceAfter ? this._ReplaceText(text) :
		timer := ObjBindMethod(this, &quot;_GetInputText&quot;)
		SetTimer %timer%, -1
	}

	CorrectionEnteredText()
	{
		this.ReplaceAfter := true
		Input
	}

	_ReplaceText(text)
	{
		StringLen count, text
		if (count&gt;0)	; если вводился текст
			SendInput {BS %count%}
		else 				; если выделен текст (при выделении используются кнопки мыши или шифт с навигационными кл. =&gt; text=&quot;&quot; =&gt; count=0)
		{
			cliptmp := Clipboard
			Clipboard := &quot;&quot;
			Sleep 50
			SendEvent ^{Ins}
			ClipWait 1, 1
			clipNew := Clipboard
			Clipboard := cliptmp
			if StrLen(clipNew) != 0
				text := clipNew
			else
			{
				Tooltip Выделите текст для исправления, A_CaretX+20, A_CaretY-3
				SetTimer TToff, -2000
				Return
				TToff:
					ToolTip
					Return
			}
		}
		substituteText := this._GetTextInOppositeLayout(text)
		if this._check_lang() == &quot;ENG&quot;
			this.ToggleLayout(&quot;RUS&quot;)
		else
			this.ToggleLayout(&quot;ENG&quot;)
		Sleep 50 ; без задержки появляются баги со знаками пунктуации
		SetKeyDelay 50, 50
		SendInput {Raw}%substituteText%
		Return
	}

	_GetTextInOppositeLayout(text)
	{
		static str1 := &quot;~QWERTYUIOP{}ASDFGHJKL:&quot;&quot;ZXCVBNM&lt;&gt;``qwertyuiop[]asdfghjkl;&#039;zxcvbnm,./|?@#$^&amp;ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю./,&quot;&quot;№;:?&quot;,
		       str2 := &quot;ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю./,&quot;&quot;№;:?~QWERTYUIOP{}ASDFGHJKL:&quot;&quot;ZXCVBNM&lt;&gt;``qwertyuiop[]asdfghjkl;&#039;zxcvbnm,./|?@#$^&amp;&quot;
		Loop, parse, text,, `r ; `r — hack for Send command, because it regards `r`n as separate \n
		{
			if (symbolNum := InStr(str1, A_LoopField, CaseSensitive:=true))
				outputText .= SubStr(str2, symbolNum, 1)
			else
				outputText .= A_LoopField
		}
		Return outputText
	}

	ToggleLayout(Layout := &quot;&quot;)
	{
		WinGetClass, winClass, A
		SetKeyDelay -1, -1
		if (StrLen(Layout) == 0)  or (winClass == &quot;ConsoleWindowClass&quot;) 
			SendEvent {Blind}{LAlt down}{LShift down}{LShift up}{LAlt up}
		else
		{
			CurrLang := this._check_lang()
			if (Layout == &quot;ENG&quot;) and (CurrLang != &quot;ENG&quot;)
			{
				SendEvent ^+1
				SendMessage, 0x50, 0, 0x04090409,, A
			}
			if (Layout == &quot;RUS&quot;) and (CurrLang != &quot;RUS&quot;)
			{
				SendEvent ^+2
				SendMessage, 0x50, 0, 0x04190419,, A
			}
		}
		Return
	}

	_check_lang_by_window_id(hWnd)
	{
		if !hWnd
			Return
		WinGetClass, winClass, A
		if (winClass != &quot;ConsoleWindowClass&quot;) || (b := SubStr(A_OSVersion, 1, 2) = &quot;10&quot;)
		{
			if b
			{
				WinGet, consolePID, PID
				childConhostPID := this._GetCmdChildConhostPID(consolePID)
				dhw_prev := A_DetectHiddenWindows
				DetectHiddenWindows, On
				hWnd := WinExist(&quot;ahk_pid &quot; . childConhostPID)
				DetectHiddenWindows, %dhw_prev%
			}
			threadId := DllCall(&quot;GetWindowThreadProcessId&quot;, Ptr, hWnd, UInt, 0)
			lyt := DllCall(&quot;GetKeyboardLayout&quot;, Ptr, threadId, UInt)
			langID := Format(&quot;{:#x}&quot;, lyt)
		}
		else ; окно консольное в вин7
		{
			WinGet, dwProcessId, PID, A
			bResult := DllCall(&quot;AttachConsole&quot;, &quot;uint&quot;, dwProcessId, &quot;int&quot;)
			if(!bResult)
				langID := 
			else
			{
				VarSetCapacity(lyt, 16)
				DllCall(&quot;GetConsoleKeyboardLayoutName&quot;, Str, lyt)
				DllCall(&quot;FreeConsole&quot;)
				langID := &quot;0x&quot; . lyt
			}
		}
		if     (langID = 0x04090409) or (langID = 0x00000409) ; для английского
			Return &quot;ENG&quot;
		else if(langID = 0x04190419) or (langID = 0x00000419) ; для русского
			Return &quot;RUS&quot;
		else if(langID = 0xF0080419) or (langID = 0x00010419) ; русская машинопись
			Return &quot;RUQ&quot;
		else if(langID = 0xF0A80422) or (langID = 0x00020422) ; для украинского
			Return &quot;UKR&quot;
		else if(langID = 0x04230423) or (langID = 0x00000423) ; для белорусского
			Return &quot;BEL&quot;
		else if(langID = 0x043F043F) or (langID = 0x0000043F) ; для казахского
			Return &quot;KAZ&quot;
		else
			Return %langID%
	}

	_GetCmdChildConhostPID(CmdPID)
	{
		static TH32CS_SNAPPROCESS := 0x2, MAX_PATH := 260
		h := DllCall(&quot;CreateToolhelp32Snapshot&quot;, UInt, TH32CS_SNAPPROCESS, UInt, 0, Ptr)
		VarSetCapacity(PROCESSENTRY32, size := 4*7 + A_PtrSize*2 + (MAX_PATH &lt;&lt; !!A_IsUnicode), 0)
		NumPut(size, PROCESSENTRY32, &quot;UInt&quot;)
		res := DllCall(&quot;Process32First&quot;, Ptr, h, Ptr, &amp;PROCESSENTRY32)
		while res
		{
			parentPid := NumGet(PROCESSENTRY32, 4*4 + A_PtrSize*2, &quot;UInt&quot;)
			if (parentPid = CmdPID)
			{
				exeName := StrGet(&amp;PROCESSENTRY32 + 4*7 + A_PtrSize*2, &quot;CP0&quot;)
				if (exeName = &quot;conhost.exe&quot; &amp;&amp; PID := NumGet(PROCESSENTRY32, 4*2, &quot;UInt&quot;))
					break
			}
			res := DllCall(&quot;Process32Next&quot;, Ptr, h, Ptr, &amp;PROCESSENTRY32)
		}
		DllCall(&quot;CloseHandle&quot;, Ptr, h)
		Return PID
	}

	_check_lang()
	{
		SetFormat, Integer, H
		WinGet, WinID,, A
		CurLang := this._check_lang_by_window_id(WinID)
		;MsgBox, %CurLang%
		Return %CurLang%
	}

}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (toxicdream)]]></author>
			<pubDate>Mon, 16 Dec 2019 01:06:49 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=136879#p136879</guid>
		</item>
	</channel>
</rss>
