Год спустя доработал скрипт до моего понимания. Прошу пробовать, исправлять, хвалить , критиковать итд.
#Persistent
#NoEnv
#Singleinstance force
SetTitleMatchMode 2
/*
Таблица символов появляющаяся по горячей клавише СредняяКлавишаМышки+ПраваяКлавишаМышки.
Символы отсылаются в Unicode. Если приложение не понимает Unicode, то может вставится черти-чё.
- Доступно перемещение Таблицы ( Лев.Мышь )
- Доступно добавление символа в таблицу, по его коду ( через контекстное меню).
- При вводе кода символа есть пред просмотр символа.
- Символ добавляется в конец таблицы.
- Доступно перетаскивание символов по таблице (Альт + Лев. Мышь)
- Доступно удаление символа из таблицы ( через контекстное меню).
- Коды символов в таблице сохраняются в ини файл.
- К скрипту привязана иконка.
Идея и главный код: ~lego
Использованы скриптовые конструкции от ~lego, teadrinker, Grey, creature.ws, и многих других
*/
global hGui1, hGui2, moved, IsClicked, col, b1W, Max, mX, mY, winW, winH, arrayOFindex, flag
OCR_NORMAL := 32512 ; обычный курсор в виде стрелки
OCR_CROSS := 32646 ; курсор в виде креста
NORMAL_CursorHandle := DllCall( "LoadCursor", Uint,0, Int, OCR_NORMAL) ; загрузить системный OCR_NORMAL-курсор
CROSS_CursorHandle := DllCall( "LoadCursor", Uint,0, Int, OCR_CROSS) ; загрузить системный OCR_CROSS-курсор
Extract_Omega_symbol(Func("Get_Omega_symbol").("Directory")"\"Func("Get_Omega_symbol").("Name"),DumpData = 0)
Menu, Tray, Icon, Omega_symbol.ico,, 1
Menu, MyMenu, Add, Add symbol, Addsymbol
arrayOFindex := [0x2206,0x2126,0x03b1,0x03b2,0x03b3,0x03b4,0x03b5,0x03b6,0x03b7,0x03b8,0x03b9
,0x03ba,0x03bc,0x03bd,0x03be,0x03bf,0x03c0,0x03c1,0x03c2,0x03c3,0x03c4,0x03c5,0x03c6,0x03c7,0x03c8,0x03c9
,0x007e,0x221e,0x00b0,0x00b1,0x2264,0x2260,0x2248,0x2265,0x2219,0x00d7,0x00f7,0x2215,0x2026,0x2212]
/*
68 - 2206 - ДЕЛЬТА
87 - 2126 - ОМЕГА
97-122 - 03b1-03c9 - малые греческие
126 - 007e - ~
165 - 221e - бесконечность
176 - 00b0 - градус
177 - 00b1 - плюс-минус
163 - 2264 - меньше-больше
185 - 2260 - не равно
187 - 2248 - равно приблизительно
179 - 2265 - больше-равно
215 - 2219 - умножить (точка)
180 - 00d7 - умножить х
184 - 00f7 - делить -
164 - 2215 - делить /
188 - 2026 - троеточие
209 - градиент
- 2212 - минус
*/
;------------------------------------------------------------------------------------------------------
GoSub, Ini_tialise ; считываем ини файл, если его нет, то создаем на основе базового набора символов
OnMessage(WM_CHAR:=0x102, "WM_CHAR") ;для фильтрования введенных символов = только HEX
OnMessage(WM_KEYDOWN:=0x100, "WM_CHAR") ; для фильтрования нажатия Enter
col:=12 ; quantity of columns
b1W:=25 ; button size
flag:=0
Gui, 1:Destroy ; Gui, 2: это окошко ввода кода нового символа
Gui, 2: +AlwaysOnTop +LastFound -Caption +Toolwindow -E0x08000000 ; окно поверх всего, без рамок,границ,заголовия
Gui, 2:Add, Text, x10 y0, enter HEX code
Gui, 2:Add, Text, x4 y28, 0x
Gui, 2:Add, Edit, hwndhEdit r1 +Limit vnewIndex x15 y25 w35
Gui, 2:Add, Text, hwndhText x65 y25 vnewChar, "= "
Gui, 2:Font, s12, Times New Roman
Gui, 2:+HWNDhGui2
OnMessage(WM_LBUTTONDOWN:=0x201, "WindowProc")
Redraw:
Gui, 1:Destroy
Gui, 1:+AlwaysOnTop +LastFound -Caption +Toolwindow -E0x08000000 ; окно поверх всего, без рамок,границ,заголовия
Gui, 1:Font, s12, Times New Roman
Gui, 1:+HWNDhGui1
x:=0
y:=0
Max := arrayOFindex.MaxIndex()
Loop % Max {
Gui, 1:Add, Button, % "x" x " y" y " w" b1W " h" b1W " gS vB" A_Index, % chr(arrayOFindex[A_Index])
x += b1W
if (x >= col*b1W) {
x := 0
y += b1W
}
winH := y+b1W
}
winW := col*b1W
Gui, 1:Add, Button, x+0 w5 h%b1W% hwndB0 vBB0
GuiControl, 1:Hide, % B0
Return ; ;-)
ShowTable:
CoordMode, Mouse, Screen ; берем координаты мышки
MouseGetPos, mX, mY ; относительно всего экрана
ShowTableM:
Gui, 2:Hide
Gui, 1:Show, % "x" mX "y" mY "h" winH "w" winW "NA", charmap ; показываем окно
WinSet , Transparent , 210 , charmap ; устанавливаем его прозрачность
SetTimer,CheckCode,off
Return
~Mbutton & Rbutton::
If (flag := !flag)
GoSub, ShowTable ; показываем таблицу
Else
Gui, Cancel ; если клавиши нажаты, а окно показано - прячем
return
S: ;вставляем символ
WinMove(WinID)
if moved
return
Gui, Cancel
GuiControlGet, S_S, 1: , % A_GuiControl
Clipboard := %s_S%
SendInput, %s_S%
flag := !flag
Return
GuiContextMenu:
mControlX := A_GuiX ;запоминаем переменные для последующей работы с ними
mControlY := A_GuiY
mControl := A_GuiControl
GuiControlGet, S_S, 1: , % A_GuiControl
Menu, MyMenu, Add, Add symbol, Addsymbol
if (S_S)
Menu, MyMenu, Add, Del symbol %S_S%, Delsymbol
Menu, MyMenu, Show,
if (S_S)
Menu, MyMenu, Delete, Del symbol %S_S%
Return
AddSymbol:
SetTimer, CheckCode, 300
Gui, 1:Hide,
flag := !flag
Gui, 2:Show,
GuiControl, 2:Focus, newIndex
Return
DelSymbol:
Key:= col*Floor(mControlY/b1W)+Ceil(mControlX/b1W) ; вычисление индекса символа, выбранного на удаление, в масиве
arrayOFindex.Remove(Key)
WinGetPos, mX, mY,,, % "ahk_ID" hGui1
GoSub, Ini_readwrite ; перезапись инифайла согласно новому содержимому массива
Gosub, Redraw
Gosub, ShowTableM
Return
AddNewButton: ; получаем введенный код и добавляем новый символ
Gui, 2:Submit
Gui, 1:Show,
flag := !flag
arrayOFindex.Insert(newIndex:="0x"newIndex)
WinGetPos, mX, mY,,, % "ahk_ID" hGui1
GoSub, Ini_readwrite
GoSub, Redraw
Gosub, ShowTableM
Return
~LButton::
MouseGetPos,,, WinID
if (WinID = hGui1||WinID = hGui2)
WinMove(WinID)
return
Esc::
if (WinActive("A")=hGui2)
Gosub, ShowTableM
else
Send, {ESC}
return
CheckCode:
GuiControlGet, newIndex, 2:
GuiControl, 2:Text, newChar, % chr("0x"newIndex)
return
#If GetKeyState("Alt", "P") And (!IsClicked)
*LButton::SomeFuncName(IsClicked:= True)
#If
SomeFuncName(Arg)
{
static Key1, Key0
/*
KEy1 - MouseX
Key2 - MouseY
Key3 - WinID
Key4 - ControlClassNN (ID)
Key5 - ControlX
Key6 - ControlY
Key7 - ControlW
Key8 - ControlH
*/
MouseGetPos, M%Arg%_X, M%Arg%_Y , Win%Arg%_ID , C%Arg%_ID , 2
ControlGetPos, C%Arg%_X , C%Arg%_Y , , , , % "ahk_id" Win%Arg%_ID
Winactivate, % "ahk_id" Win%Arg%_ID
GuiControlGet, BName%Arg%, 1:Name , % C%Arg%_ID
Key%Arg%:= % SubStr(BName%Arg%, 2)
if (Arg) {
GuiControl, 1:Disable, % BName%Arg%
GuiControl, 1:Move, % B0, % "x" C1_X " y" C1_Y
GuiControl, 1:Show, BB0
While GetKeyState("LButton", "P") {
if !GetKeyState("Alt", "P") {
GuiControl, 1:Hide, BB0
IsClicked:=False
return
}
MouseGetPos, M_X, M_Y
;проверка чтоб указывающая кнопка не выходила за пределы окна или пустого места
qx:=(M_X//b1W)*b1W, mx:=(Max-1-(Max//col)*col)*b1W
qq:=(M_Y < (winH-b1W) ? qx : (qx < mx ? qx : mx))
qq1:=(qq < 0 ? 0 : (qq >= winW ? (winW-b1W) : qq))
yy:=(M_y < 0 ? 0 : (M_Y >= winH ? (winH-b1W) : (M_Y//b1W)*b1W))
;
GuiControl, 1:MoveDraw, BB0, % "x"qq1 " y"yy
Sleep, 10
;MouseGetPos, M_X, M_Y , Win_ID , C_ID , 2
;ControlGetPos, C_X , C_Y , , , , % "ahk_id" Win_ID
;GuiControlGet, BName, 1:Name , % C_ID
;Key:= % SubStr(BName, 2)
;tooltip, % "0 arrayOFindex(" Key1 ")=" arrayOFindex[Key1] "`narrayOFindex(" Key ")=" arrayOFindex[Key] "`n"
; . arrayOFindex.MaxIndex() " | " REmV "`n" Arg,,, 1
}
Arg:=False , IsClicked:=False
GuiControl, 1:Hide, BB0
}
MouseGetPos, M%Arg%_X, M%Arg%_Y , Win%Arg%_ID , C%Arg%_ID , 2
ControlGetPos, C%Arg%_X , C%Arg%_Y , , , , % "ahk_id" Win%Arg%_ID
GuiControlGet, BName%Arg%, 1:Name , % C%Arg%_ID
Key%Arg%:= % SubStr(BName%Arg%, 2)
;tooltip, % "1 arrayOFindex(" Key1 ")=" arrayOFindex[Key1] "`narrayOFindex(" Key0 ")=" arrayOFindex[Key0] "`n"
; . arrayOFindex.MaxIndex() " | " REmV "`n" Arg, 0, 20 , 4
GuiControl, 1:Enable, % BName1
If (!Arg & Key0!="")
{
REmV:= arrayOFindex.Remove(Key1)
arrayOFindex.Insert(Key0,RemV)
WinGetPos, mX, mY,,, % "ahk_ID" Win%Arg%_ID ; чтобы окно отрисовалось не в новом месте , а на старом
GoSub, Ini_readwrite ; перезапись инифайла согласно новому содержимому массива
Gosub, Redraw
Gosub, ShowTableM
;tooltip, % "2 arrayOFindex(" Key1 ")=" arrayOFindex[Key1] "`narrayOFindex(" Key0 ")=" arrayOFindex[Key0] "`n"
; . arrayOFindex.MaxIndex() " | " REmV "`n" Arg, 0,120, 5
}
;tooltip, % "3 arrayOFindex(" Key1 ")=" arrayOFindex[Key1] "`narrayOFindex(" Key0 ")=" arrayOFindex[Key0] "`n"
; . arrayOFindex.MaxIndex() " | " REmV "`n" Arg, 0, 300, 6
}
;********************************************************************************************
WinMove(WinID)
{
global CROSS_CursorHandle, OCR_NORMAL
CoordMode, Mouse
SetWinDelay, -1
SetBatchLines, -1
MouseGetPos, Start_X, Start_Y
WinGetPos, X_Win, Y_Win,,, ahk_id %WinID%
While GetKeyState("LButton", "P")
{
if !hand ;изменение вида курсора при перетягивании окна
DllCall("SetSystemCursor", UInt, CROSS_CursorHandle, Int, OCR_NORMAL) , hand:=1
MouseGetPos, Current_X, Current_Y
moved := (Current_X != Start_X || Current_Y != Start_Y) ? 1 : ""
WinMove, ahk_id %WinID%,, X_Win + Current_X - Start_X, Y_Win + Current_Y - Start_Y
Sleep, 10
}
if hand ;изменение вида курсора при окончании перетягивания окна
DllCall("SystemParametersInfo", UInt, SPI_SETCURSORS:=0x57, UInt, 0, UInt, 0, UInt, 0), hand:=""
}
WM_CHAR(wp, lp, msg, hwnd)
{
global hEdit
static IsCheck
if (hwnd != hEdit)
return
If Msg=0x102
{
if (wp = 22 && RegExMatch(Clipboard, "i)[^\da-f]"))
Return 0
if wp in 3,8,22,24 ; обработка 3=Ctrl+C, 8=Backspace, 24=Ctrl+X, 26=Ctrl+Z
return
Chr := Chr(wp)
if Chr not in 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
Return 0
}
if % msg=0x100 And wp=0xD
GoSub, AddNewButton
}
;:--------------------------------------------------------------------------------------:;
Ini_tialise:
IniName := A_ScriptDir "\" RegExReplace(A_ScriptName, "(.*)\..*", "$1") ".ini"
IniRead, indexList, % IniName, Settings, indexList, 3
SetFormat IntegerFast, H
if (indexList=0 or indexList="" or indexList=3)
GoSub, Ini_readwrite
Else
Loop, Parse, indexList, `,
arrayOFindex[A_Index]:= A_LoopField
SetFormat IntegerFast, D
Return
Ini_readwrite:
indexList := ""
SetFormat IntegerFast, H
Loop % Max
indexList := indexList arrayOFindex[A_Index] ","
SetFormat IntegerFast, D
StringTrimRight, indexList, indexList, 1
IniWrite, %indexList%, % IniName, Settings, indexList
Return
;----------------------------------------==============================================
Get_Omega_symbol(What)
{
Static Size = 1150, Name = "Omega_symbol.ico", Extension = "ico", Directory = A_WorkingDir
;This function returns the size(in bytes), name, filename, extension or directory of the file stored depending on what you ask for.
If What = Size
Return Size
Else If What = Name
Return Name
Else If What = Extension
Return Extension
Else If What = Directory
Return Directory
}
Extract_Omega_symbol(Filename,DumpData = 0)
{
;This function "extracts" the file to the location+name you pass to it.
Static HasData = 1, Base64Decode, Out_Data, Hex_Mcodex86 = "558bec518365fc00568b75088a1684d20f86ac000000578b7d0c5333db33c084d2764d32c984c975318aca80e92b4680f94f770c0fb6ca8b55108a4c11d5eb02b1240fb6d180ea3d80f9240f94c1fec923ca8a1684d277cd84c9760943fec9884c0508eb05c6440508004083f8047caf83fb027c4b8a45098a4d08c0e102c0e8040ac18a4d0a88074783fb027e108a55098ac1c0e802c0e2040ac288074783fb037e09c0e1060a4d0b880f478b45fc8a1684d28d4418ff8945fc0f875bffffff5b5f8b45fc5ec9c3"
Static Hex_Mcodex64 = "48895C241048897C2418440FB60933DB488BFA4C8BD14584C90F84BC000000904533DB33C94584C9744F32C00F1F400084C0752C418D41D549FFC23C4F7712410FB6C1420FB64400D53C24740404C3EB0232C0450FB60A4584C975D484C0740B41FFC3FEC888440C08EB05C6440C080048FFC14883F9047CAC4183FB027C5C0FB65424090FB644240848FFC7C0E0020FB6CAC0E9040AC8884FFF0FB64C240A4183FB027E11C0E2040FB6C1C0E8020AC248FFC78847FF4183FB037E0DC0E1060A4C240B48FFC7884FFF450FB60A428D5C1BFF4584C90F8545FFFFFF488B7C24188BC3488B5C2410C3"
Static CD = "|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\]^_``abcdefghijklmnopq"
Static 1="AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAMUAAADhAAAA4QAAAAAAAAAAAAAA4QAAAOEAAADF////AP///wD///8A////AP///wD///8A////AP///wAAAABpAQEBLwEBAc4BAQEAAQEBAAEBAc4BAQEvAAAAaf///wD///8A////AP///wD///8A////AP///wD///8AAQEBAAEBAUABAQHGAQEBAAEBAQABAQHGAQEBQAEBAQD///8A////AP///wD///8A////AP///wD///8A////AAEBAUUBAQG4AQEBSQEBAQABAQEAAQEBSQEBAbgBAQFF////AP///wD///8A////AP///wD///8A////AP///wABAQGeAQEBfgEBAQABAQEAAQEBAAEBAQABAQF+AQEBnv///wD///8A////AP///wD///8A////AP///wD///8AAQEBrAEBAW0BAQEAAQEBAAEBAQABAQEAAQEBbQEBAaz///8A////AP///wD///8A////AP///wD///8A////AAEBAXUBAQGbAQEBFgEBAQABAQEAAQEBFgEBAZsBAQF1////AP///wD///8A////AP///wD///8A////AP///wABAQEQAQEBcwEBAaQBAQGtAQEBrQEBAaQBAQFzAQEBEP///wD///8A////AP///wD///8A////AP///wD///8AAQEBAAEBAQABAQEJAQEBHgEBAR4BAQEJAQEBAAEBAQD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A//8AAP//AAD//wAA//8AAPGPAADxjwAA+Z8AAPGPAADzzwAA888AAPGPAADwDwAA/D8AAP//AAD//wAA//8AAA=="
If (!HasData)
Return -1
If (CD){
VarSetCapacity(TD,1576 * (A_IsUnicode ? 2 : 1))
Loop,% 1
TD .= %A_Index%, %A_Index% := ""
Hex_Mcode := A_PtrSize = 8 ? Hex_Mcodex64 : Hex_Mcodex86
VarSetCapacity(Base64Decode,StrLen(Hex_Mcode)//2)
Loop % StrLen(Hex_Mcode)//2
NumPut("0x" . SubStr(Hex_Mcode,2*A_Index-1,2),Base64Decode,A_Index-1,"Char")
DllCall("VirtualProtect",A_IsUnicode ? "Ptr" : "UInt",&Base64Decode,A_IsUnicode ? "Ptr" : "UInt",VarSetCapacity(Base64Decode),"uint",0x40,"uint*",0)
VarSetCapacity(Out_Data,1150,0)
, DllCall(&Base64Decode,A_IsUnicode ? "AStr" : "Str",TD,A_IsUnicode ? "Ptr" : "UInt",&Out_Data,A_IsUnicode ? "AStr" : "Str",CD,"CDECL UINT")
, Base64Decode := ""
, TD := ""
, CD := ""
, Hex_Mcodex86 := ""
, Hex_Mcodex64 := ""
, Hex_Mcode := ""
}
IfExist,%Filename%
FileDelete,%Filename%
h := DllCall("CreateFile","str",Filename,"Uint",0x40000000,"Uint",0,"UInt",0,"UInt",4,"Uint",0,"UInt",0)
DllCall("WriteFile","UInt",h,A_IsUnicode ? "Ptr" : "UInt",&Out_Data,"UInt",1150,"UInt",0,"UInt",0)
DllCall("CloseHandle", "Uint", h)
If (DumpData)
VarSetCapacity(Out_Data,1150,0)
, VarSetCapacity(Out_Data,0)
, HasData := 0
}
;-----------------------------------------------------------------------------