1 (изменено: stealzy, 2017-11-14 16:00:55)

Тема: AHK: Класс для операций с раскладками

; Loop % Lyt.GetList().MaxIndex()
; 	str .= A_Index ": " Lyt.GetList()[A_Index].LngName " - " Lyt.GetList()[A_Index].DisplayName "`n"
; MsgBox,, Your layout list, % str
F1::Lyt.Set(0x4090409)	; set english layout by id
F2::Lyt.Set("Switch", "ahk_id 0x100b4")		; switch input language. Lyt.Set() do the same.
F3::Lyt.Set("Forward")	; move forward (cycle) in current layout list
F4::Lyt.Set(2)					; set second layout in current layout list
F7::Lyt.Set("-en")			; set first non-english layout in current layout list
F8::Lyt.Set("en", "global")
F9::Lyt.Set("forward", WinExist("AutoHotkey Help ahk_class HH Parent")) ; in opened AutoHotkey.chm
F10::Lyt.Set("en", "AutoHotkey Help ahk_class HH Parent")
F11::MsgBox % Lyt.GetDisplayName("AutoHotkey Help ahk_class HH Parent")
F12::MsgBox % "HKL: " Format("{:#010x}", Lyt.GetInputHKL()) "`n№: " Lyt.GetNum() "`nDisplayName: " Lyt.GetDisplayName() "`nLanguage: " Lyt.GetLng() " - " Lyt.GetLng(,, true) "`n"
. Lyt.GetList()[2].DisplayName " " Lyt.GetList()[2].LngName " " Lyt.GetList()[2].LngFullName
Esc::ExitApp
#SingleInstance force
#NoEnv

Class Lyt {
	Static SISO639LANGNAME						:= 0x0059 ; ISO abbreviated language name, eg "en"
	Static LOCALE_SENGLANGUAGE				:= 0x1001 ; Full language name, eg "English"
	Static WM_INPUTLANGCHANGEREQUEST	:= 0x0050
	Static INPUTLANGCHANGE_FORWARD		:= 0x0002
	Static INPUTLANGCHANGE_BACKWARD		:= 0x0004
	; ===================================================================================================================
	; PUBLIC METHOD Set()
	; Parameters:     arg (optional)   - (switch / forward / backward / 2-letter language name(en) / language number in current active layout list / language id e.g. HKL (0x04090409)). Default: switch
	;                 win (optional)   - (ahk format WinTitle / hWnd). Default: Active Window
	; Return value:   empty or description string in case of errors
	; ===================================================================================================================
	Set(arg := "switch", win := 0) {
		hWnd := win
						?	( win + 0
								? WinExist("ahk_id" win)
								: win = "global"
									? win
									: WinExist(win) )
						: WinExist("A")
		If hWnd = 0 ; WinExist() return 0
			Return "Window not found"

		if (arg = "forward") {
			Return This.Change(, This.INPUTLANGCHANGE_FORWARD, hWnd)
		} else if (arg = "backward") {
			Return This.Change(, This.INPUTLANGCHANGE_BACKWARD, hWnd)
		} else if (arg = "switch") {
			Return This.Change((This.GetNum(hWnd) != 1)  ?  This.GetList()[1].h  :  This.GetList()[2].h,, hWnd)
		} else if (arg ~= "[A-z]{2}") {
			invert := ((SubStr(arg, 1, 1) = "-") && (arg := SubStr(arg, 2, 2))) ? true : false
			For index, layout in This.GetList()
				if (InStr(layout.LngName, arg) ^ invert)
					Return This.Change(layout.h,, hWnd)
			Return "Language not found in current layout list"
		} else if (arg <= This.GetList().MaxIndex()) {
			Return This.Change(This.GetList()[arg].h,, hWnd)
		} else if (arg > 1024) {
			Return This.Change(arg,, hWnd)
		} else
			Return "Not valid input"
	}
	Change(HKL := 0, INPUTLANGCHANGE := 0, hWnd := 0) {
		Return (hWnd = "global")
			? This.ChangeGlobal(HKL, INPUTLANGCHANGE)
			: This.ChangeLocal(HKL, INPUTLANGCHANGE, hWnd)
	}
	ChangeGlobal(HKL, INPUTLANGCHANGE) { ; in all window
		If (INPUTLANGCHANGE != 0)
			Return "Unpredictable behavior. Use other methods for global."
		tmp := A_DetectHiddenWindows
		DetectHiddenWindows On
		WinGet, List, List
		DetectHiddenWindows % tmp
		Loop % List
			This.ChangeLocal(HKL, INPUTLANGCHANGE, List%A_Index%)
	}
	ChangeLocal(HKL, INPUTLANGCHANGE, hWnd) {
		; #Space::PostMessage WM_INPUTLANGCHANGEREQUEST:=0x50, INPUTLANGCHANGE_FORWARD:=0x2,,, % (hWndOwn := DllCall("GetWindow", Ptr, hWnd:=WinExist("A"), UInt, GW_OWNER := 4, Ptr)) ? "ahk_id" hWndOwn : "ahk_id" hWnd
		PostMessage, This.WM_INPUTLANGCHANGEREQUEST, % HKL ? "" : INPUTLANGCHANGE, % HKL ? HKL : "",, % (hWndOwn := DllCall("GetWindow", Ptr, hWnd, UInt, GW_OWNER := 4, Ptr)) ? "ahk_id" hWndOwn : "ahk_id" hWnd
	}

	GetNum(win := 0, HKL := 0) { ; Number of layout in your current layout list
		HKL ? : HKL := This.GetInputHKL(win)
		If !HKL ; ConsoleWindow
			Return
		For index, layout in This.GetList()
			if (layout.h = HKL)
				Return index
	}
	GetList() { ; List of your current layouts
		Static Layouts
		If IsObject(Layouts)
			Return Layouts
		Else {
			VarSetCapacity(List, A_PtrSize*5)
			Size := DllCall("GetKeyboardLayoutList", Int, 5, Str, List)
			Layouts := []
			Loop % Size {
				Layouts[A_Index] := {}
				Layouts[A_Index].h := NumGet(List, A_PtrSize*(A_Index - 1))
				Layouts[A_Index].LngName := This.GetLng(, Layouts[A_Index].h)
				Layouts[A_Index].LngFullName := This.GetLng(, Layouts[A_Index].h, true)
				Layouts[A_Index].DisplayName := This.GetDisplayName(, Layouts[A_Index].h)
			}
			Return Layouts
		}
	}
	GetLng(win := 0, HKL := 0, FullName := false) { ; e.g. "EN"
		HKL ? : HKL := This.GetInputHKL(win)
		If HKL
			LocID := HKL & 0xFFFF
		Else
			LocID := this.LocID, this.LocID := "" ; ConsoleWindow
		LCType := FullName ? This.LOCALE_SENGLANGUAGE : This.SISO639LANGNAME
		Size := (DllCall("GetLocaleInfo", UInt, LocID, UInt, LCType, UInt, 0, UInt, 0) * 2)
		VarSetCapacity(localeSig, Size, 0)
		DllCall("GetLocaleInfo", UInt, LocID, UInt, LCType, Str, localeSig, UInt, Size)
		Return localeSig
	}
	GetDisplayName(win := 0, HKL := 0) { ; Name of layout in your system language
		HKL ? : HKL := This.GetInputHKL(win)
		If !HKL ; ConsoleWindow
			Return
		KLID := This.HKLtoKLID(HKL)
		RegRead, displayName, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Control\Keyboard Layouts\%KLID%, Layout Display Name
		if !displayName
			Return false

		DllCall("Shlwapi.dll\SHLoadIndirectString", "Ptr", &displayName, "Ptr", &displayName, "UInt", outBufSize:=50, "UInt", 0)
		if !displayName
			RegRead, displayName, HKEY_LOCAL_MACHINE, SYSTEM\CurrentControlSet\Control\Keyboard Layouts\%KLID%, Layout Text

		Return displayName
		}
	HKLtoKLID(HKL) {
		VarSetCapacity(KLID, 8 * (A_IsUnicode ? 2 : 1))

		priorHKL := DllCall("GetKeyboardLayout", "Ptr", DllCall("GetWindowThreadProcessId", "Ptr", 0, "UInt", 0, "Ptr"), "Ptr")
		if !DllCall("ActivateKeyboardLayout", "Ptr", HKL, "UInt", 0)
		|| !DllCall("GetKeyboardLayoutName", "Ptr", &KLID)
		|| !DllCall("ActivateKeyboardLayout", "Ptr", priorHKL, "UInt", 0)
			return false

		return StrGet(&KLID)
	}
	GetInputHKL(win := 0) { ; if handle incorrect, system default HKL return
		hWnd := win
						? win + 0
							? WinExist("ahk_id" win)
							: WinExist(win)
						: WinExist("A")
		If hWnd = 0
			Return "Window not found"

		WinGetClass, Class
		if (Class == "ConsoleWindowClass") {
				WinGet, consolePID, PID
				DllCall("AttachConsole", Ptr, consolePID)
				VarSetCapacity(KLID, 16)
				DllCall("GetConsoleKeyboardLayoutName", Str, KLID)
				DllCall("FreeConsole")
				this.LocID := "0x" . SubStr(KLID, -3)
		} else
			HKL := DllCall("GetKeyboardLayout", Ptr, DllCall("GetWindowThreadProcessId", Ptr, hWnd, UInt, 0, Ptr), Ptr)
		return HKL
	}
}

В основном компиляция собранного на форуме, от себя добавил определение 2-буквенного имени языка и взятие отображаемого имени раскладки из реестра, если в dll ресурса оно не прописано (что система и делает, когда надо).
Примечание: Windows не позволяет переключить раскладку на панели задач когда фокус на ней.
Сделано это для того, чтобы по клику на языковую панель (которая является контролом панели задач) из активного окна отображаемая раскладка не сменялась тут же на текущую раскладку панели задач. И хотя не никаких причин менять раскладку на панели задач (-;, благодаря тов. Malcev и teadrinker был найден способ это делать:

+ Хак для активной панели задач

Данный код следует вставить в ChangeLocal():

WinGetClass class_, ahk_id %hWnd%
if (class_ = "Shell_TrayWnd") {
	ControlGetFocus v, ahk_id %hWnd%
	tmp := A_DetectHiddenWindows
	DetectHiddenWindows On
	ControlFocus, Desktop OpenBox Host1, ahk_class DV2ControlHost
	PostMessage, This.WM_INPUTLANGCHANGEREQUEST, % HKL ? "" : INPUTLANGCHANGE, % HKL ? HKL : "", Desktop OpenBox Host1, ahk_class DV2ControlHost
	DetectHiddenWindows % tmp
	ControlClick % v, ahk_id %hWnd%
}

Upd: Исправлена обработка HKL, с учетом того, что из консоли можно получить только LocID часть.

2 (изменено: teadrinker, 2017-02-16 23:22:37)

Re: AHK: Класс для операций с раскладками

stealzy пишет:

Возможно для неактивного окна стоит брать список контролов, и слать всем?

Хорошая догадка, только бывают окна, где нет контролов, поэтому нужно слать ещё и самому окну.

stealzy пишет:

С параметром Forward тогда не выйдет.

Да, но можно определять текущую раскладку, и слать следующую в списке.

stealzy пишет:

По параметру INPUTLANGCHANGE_SYSCHARSET

Не заморачивайся, там куда-то совсем глубоко копать нужно, на практике его влияния замечено не было.

Заметил несколько недочётов:

VarSetCapacity(KLID, 8*(A_IsUnicode+1))

Такая конструкция в ANSI-версии не сработает, там A_IsUnicode равно пустому значению.

Hex(num) {
	OldFormat := A_FormatInteger
	SetFormat, Integer, Hex
	num += 0
	SetFormat, Integer, %OldFormat%
	Return num
}

Устаревший способ. Сейчас для преобразования в hex есть функция Format().

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

3 (изменено: stealzy, 2017-02-17 07:20:31)

Re: AHK: Класс для операций с раскладками

teadrinker, как всегда, содержательный ответ!
По недочетам переделано, ознакомился с Format() заодно.
По неактивным окнам похоже я ошибался, по крайней мере сейчас все работает.
Можно для красоты выделить метод Get(), а ему уже передавать в параметре, что надо.

4

Re: AHK: Класс для операций с раскладками

Интересно, что окно PascalABC.NET не понимает WM_INPUTLANGCHANGEREQUEST с параметрами циклического переключения FORWARD/BACKWARD (PostMessage, 0x50, 2) и выбрасывает исключение:

+ открыть спойлер

Подробная информация об использовании оперативной
(JIT) отладки вместо данного диалогового
окна содержится в конце этого сообщения.

************** Текст исключения **************
System.Globalization.CultureNotFoundException: Неподдерживаемая культура.
Имя параметра: culture
0 (0x0000) - недопустимый идентификатор культуры.
   в System.Globalization.CultureInfo.InitializeFromCultureId(Int32 culture, Boolean useUserOverride)
   в System.Windows.Forms.InputLanguage.get_Culture()
   в System.Windows.Forms.InputLanguageChangingEventArgs..ctor(InputLanguage inputLanguage, Boolean sysCharSet)
   в System.Windows.Forms.InputLanguage.CreateInputLanguageChangingEventArgs(Message m)
   в System.Windows.Forms.Control.WmInputLangChangeRequest(Message& m)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.Form.WndProc(Message& m)
   в VisualPascalABC.Form1.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Загруженные сборки **************
mscorlib
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
----------------------------------------
PascalABCNET
    Версия сборки: 3.2.0.1404
    Версия Win32: 3.2.0.1404
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PascalABCNET.exe
----------------------------------------
System
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Core
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Windows.Forms
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
PluginsSupport
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PluginsSupport.DLL
----------------------------------------
CompilerTools
    Версия сборки: 3.2.0.1404
    Версия Win32: 3.2.0.1404
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/CompilerTools.DLL
----------------------------------------
WeifenLuo.WinFormsUI.Docking
    Версия сборки: 2.2.5489.36547
    Версия Win32: 2.2.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/WeifenLuo.WinFormsUI.Docking.DLL
----------------------------------------
Compiler
    Версия сборки: 3.2.0.1404
    Версия Win32: 3.2.0.1404
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/Compiler.DLL
----------------------------------------
Localization
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/Localization.DLL
----------------------------------------
System.Configuration
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
ICSharpCode.TextEditor
    Версия сборки: 0.0.0.0
    Версия Win32: 0.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.TextEditor.DLL
----------------------------------------
CodeCompletion
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/CodeCompletion.DLL
----------------------------------------
ParserTools
    Версия сборки: 3.2.0.1404
    Версия Win32: 3.2.0.1404
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ParserTools.DLL
----------------------------------------
Accessibility
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/Accessibility/v4.0_4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
Errors
    Версия сборки: 3.2.0.1404
    Версия Win32: 3.2.0.1404
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/Errors.DLL
----------------------------------------
SyntaxTree
    Версия сборки: 3.2.0.1404
    Версия Win32: 3.2.0.1404
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/SyntaxTree.DLL
----------------------------------------
ICSharpCode.SharpDevelop
    Версия сборки: 4.2.1.0
    Версия Win32: 4.2.1.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.SharpDevelop.DLL
----------------------------------------
ICSharpCode.Core
    Версия сборки: 4.2.1.0
    Версия Win32: 4.2.1.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.Core.DLL
----------------------------------------
ICSharpCode.SharpDevelop.Dom
    Версия сборки: 4.2.1.8805
    Версия Win32: 4.2.1.8805
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.SharpDevelop.Dom.DLL
----------------------------------------
ICSharpCode.NRefactory
    Версия сборки: 4.2.1.8805
    Версия Win32: 4.2.1.8805
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.NRefactory.DLL
----------------------------------------
ICSharpCode.AvalonEdit
    Версия сборки: 4.2.1.8805
    Версия Win32: 4.2.1.8805
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.AvalonEdit.DLL
----------------------------------------
ICSharpCode.Core.Presentation
    Версия сборки: 4.2.1.0
    Версия Win32: 4.2.1.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.Core.Presentation.DLL
----------------------------------------
ICSharpCode.SharpDevelop.Widgets
    Версия сборки: 4.2.1.8805
    Версия Win32: 4.2.1.8805
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.SharpDevelop.Widgets.DLL
----------------------------------------
ICSharpCode.Core.WinForms
    Версия сборки: 4.2.1.0
    Версия Win32: 4.2.1.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/ICSharpCode.Core.WinForms.DLL
----------------------------------------
System.Design
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Design/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Design.dll
----------------------------------------
Debugger.Core
    Версия сборки: 3.0.0.2649
    Версия Win32: 3.0.0.2649
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/Debugger.Core.DLL
----------------------------------------
System.Data
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_64/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
TreeConverter
    Версия сборки: 3.2.0.1404
    Версия Win32: 3.2.0.1404
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/TreeConverter.DLL
----------------------------------------
NETGenerator
    Версия сборки: 3.2.0.1404
    Версия Win32: 3.2.0.1404
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/NETGenerator.DLL
----------------------------------------
SyntaxTreeConverters
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/SyntaxTreeConverters.DLL
----------------------------------------
SemanticTree
    Версия сборки: 3.2.0.1404
    Версия Win32: 3.2.0.1404
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/SemanticTree.DLL
----------------------------------------
System.Numerics
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Numerics/v4.0_4.0.0.0__b77a5c561934e089/System.Numerics.dll
----------------------------------------
PascalABCParser
    Версия сборки: 0.0.0.0
    Версия Win32: 0.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PascalABCParser.DLL
----------------------------------------
OptimizerConversion
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/OptimizerConversion.DLL
----------------------------------------
PT4Provider
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PT4Provider.DLL
----------------------------------------
PT4Tools
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/PT4Tools.DLL
----------------------------------------
SyntaxVisitors
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/SyntaxVisitors.DLL
----------------------------------------
YieldConversionSyntax
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/YieldConversionSyntax.DLL
----------------------------------------
YieldHelpers
    Версия сборки: 1.0.0.0
    Версия Win32: 1.0.0.0
    CodeBase: file:///C:/Program%20Files%20(x86)/PascalABC.NET/YieldHelpers.DLL
----------------------------------------
System.Security
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1590.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Security/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Security.dll
----------------------------------------
mscorlib.resources
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1055.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_ru_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------
System.Windows.Forms.resources
    Версия сборки: 4.0.0.0
    Версия Win32: 4.6.1055.0 built by: NETFXREL2
    CodeBase: file:///C:/windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_ru_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------

************** Оперативная отладка (JIT) **************
Для подключения оперативной (JIT) отладки файл .config данного
приложения или компьютера (machine.config) должен иметь
значение jitDebugging, установленное в секции system.windows.forms.
Приложение также должно быть скомпилировано с включенной
отладкой.

Например:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

При включенной отладке JIT любое необрабатываемое исключение
пересылается отладчику JIT, зарегистрированному на данном компьютере,
вместо того чтобы обрабатываться данным диалоговым окном.

Поддерживается только метод с указанием hkl раскладки, что и происходит при ручном переключении судя по логу spyxx.