1

Тема: AHK: символы Unicode в окне GUI

Сам AutoHotkey не поддерживает Юникод, и окно, которое создаётся командой Gui, имеет неюникодовский класс и не может отображать символы, не входящие в набор ANSI. Но контролы, которые в него помещаются командой Add, - это уже стандартные окна Windows, и их классы (Button, Edit и пр.) - юникодовские.

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

Пример ниже при каждом нажатии на кнопку помещает на неё текст, состоящий из одного символа. Код символа при каждом нажатии увеличивается на 1. Также этот символ добавляется в Edit.

; При создании GUI нужно задать шрифт, в котором имеются нужные символы.

Gui, Font, s18, Lucida Sans Unicode
Gui, Add, Button, x5 y5 gUniButton hwndButtonID, OK
Gui, Add, Text, x+10, Code:
Gui, Add, Edit, x+10 w120       ; Edit1 - для кода.
Gui, Add, Edit, x5 y+30 w300 h100 hwndEditID
Gui, Show

WM_SETTEXT = 0xC                ; Замена текста.
EM_REPLACESEL = 0xC2            ; Вставка вместо выделенного, если есть,
                                ; иначе - туда, где текстовый курсор.
SetFormat, Integer, Hex

CharCode = 0x2100               ; Код начального символа.
VarSetCapacity(Buf,4,0)         ; Буфер под код. Первые 2 байта под символ,
                                ; последние 2 - нулевые, терминатор строки.

Return


UniButton:
  GuiControl,, Edit1, %CharCode%        ; Показать сам код.
  NumPut(CharCode, Buf, 0, "UShort")    ; Запись кода в память.
  DllCall("SendMessageW", "UInt", ButtonID, "UInt", WM_SETTEXT
                        , "UInt", 0, "UInt", &Buf)
  DllCall("SendMessageW", "UInt", EditID, "UInt", EM_REPLACESEL
                        , "UInt", 0, "UInt", &Buf)
  ++CharCode       ; Следующий символ.
Return

GuiClose:
  ExitApp