<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Быстродоступная таблица символов]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=5972&amp;type=atom" />
	<updated>2013-05-27T11:11:05Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=5972</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=72471#p72471" />
			<content type="html"><![CDATA[<p>В моем нынешнем понимании - финальная версия скрипта.<br />- добавлены проверки на отсутствие символа при записи ини файла<br />- добавлены проверки на пустые ячейки.<br /></p><div class="codebox"><pre><code>#Persistent
#NoEnv
#Singleinstance force
SetTitleMatchMode 2
/* 
;*****************************************************************************
; AutoHotkey Version:   1.1.10  32-bit
; Авторы:               ~lego, Mikki
; Имя скрипта:          CharTable.ahk (v.X.Y)
;*****************************************************************************

Таблица символов появляющаяся по горячей клавише {СредняяКлавишаМышки+ПраваяКлавишаМышки}.
 Символы отсылаются в Unicode. Если приложение не понимает Unicode, то может вставится черти-чё.
 
 - Вызов окна таблицы по {MButton+RButton}
 - Доступно перемещение окна ( Лев.Мышь )
 - Доступно добавление символа в таблицу, по его коду ( через контекстное меню). 
 - Символ добавляется в конец таблицы. 
 - Доступно перетаскивание символов по таблице (Альт + Лев. Мышь)
 - Доступно удаление символа из таблицы ( через контекстное меню). 
 - Коды символов в таблице сохраняются в ини файл.
 - К скрипту привязана иконка.


 Идея и главный код: ~lego
 Использованы скриптовые конструкции от ~lego, teadrinker, Grey, creature.ws, Robert Eding и многих других
*/
global hGui1, hGui2, moved, IsClicked, col, b1W, Max, mX, mY, winW, winH, arrayOFindex, flag

OCR_NORMAL := 32512    ; обычный курсор в виде стрелки
OCR_CROSS := 32646    ; курсор в виде креста
NORMAL_CursorHandle := DllCall( &quot;LoadCursor&quot;, Uint,0, Int, OCR_NORMAL) ; загрузить системный OCR_NORMAL-курсор
CROSS_CursorHandle  := DllCall( &quot;LoadCursor&quot;, Uint,0, Int, OCR_CROSS)   ; загрузить системный OCR_CROSS-курсор

Extract_Omega_symbol(Func(&quot;Get_Omega_symbol&quot;).(&quot;Directory&quot;)&quot;\&quot;Func(&quot;Get_Omega_symbol&quot;).(&quot;Name&quot;),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, &quot;WM_CHAR&quot;)       ;для фильтрования введенных символов = только HEX
OnMessage(WM_KEYDOWN:=0x100, &quot;WM_CHAR&quot;) ; для фильтрования нажатия 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, &quot;= &quot;
Gui, 2:Font, s12, Times New Roman 
Gui, 2:+HWNDhGui2

OnMessage(WM_LBUTTONDOWN:=0x201, &quot;WindowProc&quot;)


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, % &quot;x&quot; x &quot; y&quot; y &quot; w&quot; b1W &quot; h&quot; b1W &quot; gS +hwndHB&quot; A_Index &quot; vB&quot; A_Index, % chr(arrayOFindex[A_Index])
        x += b1W
        if (x &gt;= 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    ;  ;-)

~Mbutton &amp; Rbutton::
    If (flag := !flag)     
        GoSub, ShowTable            ; показываем таблицу
    Else 
        Gui, Cancel                                        ; если клавиши нажаты, а окно показано - прячем
return

~LButton::
    MouseGetPos,,, WinID
    if (WinID = hGui1||WinID = hGui2)
        WinMove(WinID)
return


Esc::
    if (WinActive(&quot;A&quot;)=hGui2) 
        Gosub, ShowTableM
    else
        Send, {ESC}
return

 
S:            ;вставляем символ
    WinMove(WinID)
    if moved
        return
    Gui, Cancel
    GuiControlGet, S_S, 1: , % A_GuiControl
    Clipboard := %s_S%
    SendInput, %s_S%
    flag := !flag
Return

ShowTable:
        CoordMode, Mouse, Screen     ; берем координаты мышки
        MouseGetPos, mX, mY            ; относительно всего экрана
        WinGetPos,,, pW, pH, Program Manager
        mX:= (mX+winW)&gt;pW ? (pW-winW) : mX
        mY:= (mY+winH)&gt;pH ? (pH-winH) : mY
ShowTableM:
        Gui, 2:Hide
        Gui, 1:Show, %  &quot;x&quot; mX &quot;y&quot; mY &quot;h&quot; winH &quot;w&quot; winW &quot;NA&quot;, charmap    ; показываем окно
        SetTimer,CheckCode,off
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) ; вычисление индекса символа, выбранного на удаление, в масиве
    if key &lt;= arrayOFindex.MaxIndex()
        arrayOFindex.Remove(Key)
    WinGetPos, mX, mY,,, % &quot;ahk_ID&quot; hGui1
    GoSub, Ini_readwrite            ; перезапись инифайла согласно новому содержимому массива
    Gosub, Redraw
    Gosub, ShowTableM
Return

AddNewButton:            ; получаем введенный код и добавляем новый символ
    Gui, 2:Submit
    Gui, 1:Show,
    flag := !flag
    if (newIndex)
        arrayOFindex.Insert(newIndex:=&quot;0x&quot;newIndex)
    WinGetPos, mX, mY,,, % &quot;ahk_ID&quot; hGui1
    GoSub, Ini_readwrite
    GoSub, Redraw
    Gosub, ShowTableM
Return


CheckCode: 
     GuiControlGet, newIndex, 2:
    GuiControl, 2:Text, newChar, % chr(&quot;0x&quot;newIndex)
return


#If GetKeyState(&quot;Alt&quot;, &quot;P&quot;) 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
   */
    CoordMode, ToolTip,Screen
    MouseGetPos, M%Arg%_X, M%Arg%_Y , Win%Arg%_ID , C%Arg%_ID , 2
    ControlGetPos, C%Arg%_X , C%Arg%_Y , , , , % &quot;ahk_id&quot; Win%Arg%_ID 
    Winactivate, % &quot;ahk_id&quot; 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, % &quot;x&quot; C1_X &quot; y&quot; C1_Y 
    GuiControl, 1:Show, BB0
    While GetKeyState(&quot;LButton&quot;, &quot;P&quot;) {
        if !GetKeyState(&quot;Alt&quot;, &quot;P&quot;) {
            GuiControl, 1:Hide, BB0
            GuiControl, 1:Enable, % BName1
            IsClicked:=False
            return
            }
        MouseGetPos, M_X, M_Y
        ;проверка чтоб указывающая кнопка не выходила за пределы окна или пустого места
        qx:=(M_X//b1W)*b1W,        mx:=(Max-1-(Max//col)*col)*b1W    
        qq:=(M_Y &lt; (winH-b1W) ? qx : (qx &lt; mx ? qx : mx))
        qq1:=(qq &lt; 0 ? 0 : (qq &gt;= winW ? (winW-b1W) : qq))
        yy:=(M_y &lt; 0 ? 0 : (M_Y &gt;= winH ? (winH-b1W) : (M_Y//b1W)*b1W))
        
        GuiControl, 1:MoveDraw, BB0, % &quot;x&quot;qq &quot; y&quot;yy
        Sleep, 10
        }
    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 , , , , % &quot;ahk_id&quot; Win%Arg%_ID 
    GuiControlGet, BName%Arg%, 1:Name , % C%Arg%_ID
    Key%Arg%:= % SubStr(BName%Arg%, 2)
    GuiControl, 1:Enable, % BName1
    ; если мышка отпущена и вторая кнопка существует то:
    If (!Arg &amp; Key0!=&quot;&quot;)
    {
      REmV:= arrayOFindex.Remove(Key1)
      arrayOFindex.Insert(Key0,RemV)
      WinGetPos, mX, mY,,, % &quot;ahk_ID&quot; Win%Arg%_ID   ; чтобы окно отрисовалось не в новом месте , а на старом                        
      GoSub, Ini_readwrite                            ; перезапись инифайла согласно новому содержимому массива
      Gosub, Redraw
      Gosub, ShowTableM
   }
}

;********************************************************************************************

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(&quot;LButton&quot;, &quot;P&quot;)
    {
        if !hand                                     ;изменение вида курсора при перетягивании окна
            DllCall(&quot;SetSystemCursor&quot;, UInt, CROSS_CursorHandle, Int, OCR_NORMAL) , hand:=1
        MouseGetPos, Current_X, Current_Y
        moved := (Current_X != Start_X || Current_Y != Start_Y) ? 1 : &quot;&quot;
        WinMove, ahk_id %WinID%,, X_Win + Current_X - Start_X, Y_Win + Current_Y - Start_Y
         Sleep, 10
    }
    WinGetPos, mX, mY,,, ahk_id%hGui1%
    if hand                                    ;изменение вида курсора при окончании перетягивания окна
        DllCall(&quot;SystemParametersInfo&quot;, UInt, SPI_SETCURSORS:=0x57, UInt, 0, UInt, 0, UInt, 0), hand:=&quot;&quot;
}
 
WM_CHAR(wp, lp, msg, hwnd)
{
   global hEdit
   static IsCheck
   if (hwnd != hEdit)
      return
    If Msg=0x102
    {
        if (wp = 22 &amp;&amp; RegExMatch(Clipboard, &quot;i)[^\da-f]&quot;))
        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 &quot;\&quot; RegExReplace(A_ScriptName, &quot;(.*)\..*&quot;, &quot;$1&quot;) &quot;.ini&quot;

    IniRead, indexList, % IniName, Settings, indexList, 3

    SetFormat IntegerFast, H
    if (indexList=0 or indexList=&quot;&quot; or indexList=3)
        GoSub, Ini_readwrite
        Else
            Loop, Parse, indexList, `,  
                arrayOFindex[A_Index]:= A_LoopField
    SetFormat IntegerFast, D
Return

Ini_readwrite:
        indexList := &quot;&quot;
        SetFormat IntegerFast, H
        Loop % Max
            if (arrayOFindex[A_Index])
                indexList := indexList arrayOFindex[A_Index] &quot;,&quot;
            else 
                arrayOFindex.Remove(A_Index)
        SetFormat IntegerFast, D
        StringTrimRight, indexList, indexList, 1
        IniWrite, %indexList%, % IniName, Settings, indexList 
Return
;----------------------------------------==============================================
;Created by Robert Eding: Rseding91@yahoo.com
;Current version 2.3


Get_Omega_symbol(What)
{
    Static Size = 1150, Name = &quot;Omega_symbol.ico&quot;, Extension = &quot;ico&quot;, 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 &quot;extracts&quot; the file to the location+name you pass to it.
    Static HasData = 1, Base64Decode, Out_Data, Hex_Mcodex86 = &quot;558bec518365fc00568b75088a1684d20f86ac000000578b7d0c5333db33c084d2764d32c984c975318aca80e92b4680f94f770c0fb6ca8b55108a4c11d5eb02b1240fb6d180ea3d80f9240f94c1fec923ca8a1684d277cd84c9760943fec9884c0508eb05c6440508004083f8047caf83fb027c4b8a45098a4d08c0e102c0e8040ac18a4d0a88074783fb027e108a55098ac1c0e802c0e2040ac288074783fb037e09c0e1060a4d0b880f478b45fc8a1684d28d4418ff8945fc0f875bffffff5b5f8b45fc5ec9c3&quot;
    Static Hex_Mcodex64 = &quot;48895C241048897C2418440FB60933DB488BFA4C8BD14584C90F84BC000000904533DB33C94584C9744F32C00F1F400084C0752C418D41D549FFC23C4F7712410FB6C1420FB64400D53C24740404C3EB0232C0450FB60A4584C975D484C0740B41FFC3FEC888440C08EB05C6440C080048FFC14883F9047CAC4183FB027C5C0FB65424090FB644240848FFC7C0E0020FB6CAC0E9040AC8884FFF0FB64C240A4183FB027E11C0E2040FB6C1C0E8020AC248FFC78847FF4183FB037E0DC0E1060A4C240B48FFC7884FFF450FB60A428D5C1BFF4584C90F8545FFFFFF488B7C24188BC3488B5C2410C3&quot;
    Static CD = &quot;|$$$}rstuvwxyz{$$$$$$$&gt;?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\]^_``abcdefghijklmnopq&quot;
    Static 1=&quot;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==&quot;
    
    If (!HasData)
        Return -1
    
    If (CD){
        VarSetCapacity(TD,1576 * (A_IsUnicode ? 2 : 1))
        
        Loop,% 1
            TD .= %A_Index%, %A_Index% := &quot;&quot;
        
        Hex_Mcode := A_PtrSize = 8 ? Hex_Mcodex64 : Hex_Mcodex86
        VarSetCapacity(Base64Decode,StrLen(Hex_Mcode)//2)
        Loop % StrLen(Hex_Mcode)//2
            NumPut(&quot;0x&quot; . SubStr(Hex_Mcode,2*A_Index-1,2),Base64Decode,A_Index-1,&quot;Char&quot;)
        DllCall(&quot;VirtualProtect&quot;,A_IsUnicode ? &quot;Ptr&quot; : &quot;UInt&quot;,&amp;Base64Decode,A_IsUnicode ? &quot;Ptr&quot; : &quot;UInt&quot;,VarSetCapacity(Base64Decode),&quot;uint&quot;,0x40,&quot;uint*&quot;,0)
        
        VarSetCapacity(Out_Data,1150,0)
        , DllCall(&amp;Base64Decode,A_IsUnicode ? &quot;AStr&quot; : &quot;Str&quot;,TD,A_IsUnicode ? &quot;Ptr&quot; : &quot;UInt&quot;,&amp;Out_Data,A_IsUnicode ? &quot;AStr&quot; : &quot;Str&quot;,CD,&quot;CDECL UINT&quot;)
        , Base64Decode := &quot;&quot;
        , TD := &quot;&quot;
        , CD := &quot;&quot;
        , Hex_Mcodex86 := &quot;&quot;
        , Hex_Mcodex64 := &quot;&quot;
        , Hex_Mcode := &quot;&quot;
    }
    
    IfExist,%Filename%
        FileDelete,%Filename%
    
    h := DllCall(&quot;CreateFile&quot;,&quot;str&quot;,Filename,&quot;Uint&quot;,0x40000000,&quot;Uint&quot;,0,&quot;UInt&quot;,0,&quot;UInt&quot;,4,&quot;Uint&quot;,0,&quot;UInt&quot;,0)
    DllCall(&quot;WriteFile&quot;,&quot;UInt&quot;,h,A_IsUnicode ? &quot;Ptr&quot; : &quot;UInt&quot;,&amp;Out_Data,&quot;UInt&quot;,1150,&quot;UInt&quot;,0,&quot;UInt&quot;,0)
    DllCall(&quot;CloseHandle&quot;, &quot;Uint&quot;, h)
    
    If (DumpData)
        VarSetCapacity(Out_Data,1150,0)
        , VarSetCapacity(Out_Data,0)
        , HasData := 0
}

;-----------------------------------------------------------------------------
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2013-05-27T11:11:05Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=72471#p72471</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=72341#p72341" />
			<content type="html"><![CDATA[<p>- Поправлен баг с перетаскиванием кнопок (не хотели перетаскиваться, и удалялись при вытаскивании за пределы окна)<br />- Исправлен баг с неактивацией окна символов.</p>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2013-05-22T07:41:59Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=72341#p72341</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=72304#p72304" />
			<content type="html"><![CDATA[<p>Год спустя доработал скрипт до моего понимания. Прошу пробовать, исправлять, хвалить , критиковать итд.</p><p>из известных багов: <br />- при перетаскивании символа за пределы окна/строки кнопок - он удаляется;<br />- если окно скрипта уже висит, но фокус не в нем, а вы нажимаете Альт и Лев.Мышь пытаясь переместить символ в таблице - то кнопка-идентификатор (показывающая куда будет вставлен символ) стоит в одном месте, НО символы переставляются.</p><div class="codebox"><pre><code>#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( &quot;LoadCursor&quot;, Uint,0, Int, OCR_NORMAL) ; загрузить системный OCR_NORMAL-курсор
CROSS_CursorHandle  := DllCall( &quot;LoadCursor&quot;, Uint,0, Int, OCR_CROSS)   ; загрузить системный OCR_CROSS-курсор

Extract_Omega_symbol(Func(&quot;Get_Omega_symbol&quot;).(&quot;Directory&quot;)&quot;\&quot;Func(&quot;Get_Omega_symbol&quot;).(&quot;Name&quot;),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, &quot;WM_CHAR&quot;)       ;для фильтрования введенных символов = только HEX
OnMessage(WM_KEYDOWN:=0x100, &quot;WM_CHAR&quot;) ; для фильтрования нажатия 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, &quot;= &quot;
Gui, 2:Font, s12, Times New Roman 
Gui, 2:+HWNDhGui2

OnMessage(WM_LBUTTONDOWN:=0x201, &quot;WindowProc&quot;)


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, % &quot;x&quot; x &quot; y&quot; y &quot; w&quot; b1W &quot; h&quot; b1W &quot; gS vB&quot; A_Index, % chr(arrayOFindex[A_Index])
        x += b1W
        if (x &gt;= 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, %  &quot;x&quot; mX &quot;y&quot; mY &quot;h&quot; winH &quot;w&quot; winW &quot;NA&quot;, charmap    ; показываем окно
        WinSet , Transparent , 210 , charmap                 ; устанавливаем его прозрачность
        SetTimer,CheckCode,off
Return

~Mbutton &amp; 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,,, % &quot;ahk_ID&quot; hGui1
    GoSub, Ini_readwrite            ; перезапись инифайла согласно новому содержимому массива
    Gosub, Redraw
    Gosub, ShowTableM
Return

AddNewButton:            ; получаем введенный код и добавляем новый символ
    Gui, 2:Submit
    Gui, 1:Show,
    flag := !flag
    arrayOFindex.Insert(newIndex:=&quot;0x&quot;newIndex)
    WinGetPos, mX, mY,,, % &quot;ahk_ID&quot; hGui1
    GoSub, Ini_readwrite
    GoSub, Redraw
    Gosub, ShowTableM
Return

~LButton::
    MouseGetPos,,, WinID
    if (WinID = hGui1||WinID = hGui2)
        WinMove(WinID)
return

Esc::
    if (WinActive(&quot;A&quot;)=hGui2) 
        Gosub, ShowTableM
    else
        Send, {ESC}
return
 
CheckCode: 
     GuiControlGet, newIndex, 2:
    GuiControl, 2:Text, newChar, % chr(&quot;0x&quot;newIndex)
return

#If GetKeyState(&quot;Alt&quot;, &quot;P&quot;) 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 , , , , % &quot;ahk_id&quot; Win%Arg%_ID
    Winactivate, % &quot;ahk_id&quot; 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, % &quot;x&quot; C1_X &quot; y&quot; C1_Y 
    GuiControl, 1:Show, BB0
    While GetKeyState(&quot;LButton&quot;, &quot;P&quot;) {
        if !GetKeyState(&quot;Alt&quot;, &quot;P&quot;) {
            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 &lt; (winH-b1W) ? qx : (qx &lt; mx ? qx : mx))
        qq1:=(qq &lt; 0 ? 0 : (qq &gt;= winW ? (winW-b1W) : qq))
        yy:=(M_y &lt; 0 ? 0 : (M_Y &gt;= winH ? (winH-b1W) : (M_Y//b1W)*b1W))
        ;
        GuiControl, 1:MoveDraw, BB0, % &quot;x&quot;qq1 &quot; y&quot;yy
        Sleep, 10
    ;MouseGetPos, M_X, M_Y , Win_ID , C_ID , 2
    ;ControlGetPos, C_X , C_Y , , , , % &quot;ahk_id&quot; Win_ID 
    ;GuiControlGet, BName, 1:Name , % C_ID
    ;Key:= % SubStr(BName, 2)
    ;tooltip, % &quot;0 arrayOFindex(&quot; Key1 &quot;)=&quot; arrayOFindex[Key1]  &quot;`narrayOFindex(&quot; Key &quot;)=&quot; arrayOFindex[Key] &quot;`n&quot;
    ;        . arrayOFindex.MaxIndex() &quot; | &quot; REmV &quot;`n&quot; 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 , , , , % &quot;ahk_id&quot; Win%Arg%_ID 
    GuiControlGet, BName%Arg%, 1:Name , % C%Arg%_ID
    Key%Arg%:= % SubStr(BName%Arg%, 2)
    ;tooltip, % &quot;1 arrayOFindex(&quot; Key1 &quot;)=&quot; arrayOFindex[Key1]  &quot;`narrayOFindex(&quot; Key0 &quot;)=&quot; arrayOFindex[Key0] &quot;`n&quot;
    ;        . arrayOFindex.MaxIndex() &quot; | &quot; REmV &quot;`n&quot; Arg, 0, 20 , 4
    GuiControl, 1:Enable, % BName1
If (!Arg &amp; Key0!=&quot;&quot;)
   {
      REmV:= arrayOFindex.Remove(Key1)
      arrayOFindex.Insert(Key0,RemV)
      WinGetPos, mX, mY,,, % &quot;ahk_ID&quot; Win%Arg%_ID   ; чтобы окно отрисовалось не в новом месте , а на старом                        
      GoSub, Ini_readwrite                            ; перезапись инифайла согласно новому содержимому массива
      Gosub, Redraw
      Gosub, ShowTableM
      ;tooltip, % &quot;2 arrayOFindex(&quot; Key1 &quot;)=&quot; arrayOFindex[Key1]  &quot;`narrayOFindex(&quot; Key0 &quot;)=&quot; arrayOFindex[Key0] &quot;`n&quot;
        ;    . arrayOFindex.MaxIndex() &quot; | &quot; REmV &quot;`n&quot; Arg, 0,120, 5
   }
   ;tooltip, % &quot;3 arrayOFindex(&quot; Key1 &quot;)=&quot; arrayOFindex[Key1]  &quot;`narrayOFindex(&quot; Key0 &quot;)=&quot; arrayOFindex[Key0] &quot;`n&quot;
    ;        . arrayOFindex.MaxIndex() &quot; | &quot; REmV &quot;`n&quot; 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(&quot;LButton&quot;, &quot;P&quot;)
    {
        if !hand                                     ;изменение вида курсора при перетягивании окна
            DllCall(&quot;SetSystemCursor&quot;, UInt, CROSS_CursorHandle, Int, OCR_NORMAL) , hand:=1
        MouseGetPos, Current_X, Current_Y
        moved := (Current_X != Start_X || Current_Y != Start_Y) ? 1 : &quot;&quot;
        WinMove, ahk_id %WinID%,, X_Win + Current_X - Start_X, Y_Win + Current_Y - Start_Y
         Sleep, 10
    }
    if hand                                    ;изменение вида курсора при окончании перетягивания окна
        DllCall(&quot;SystemParametersInfo&quot;, UInt, SPI_SETCURSORS:=0x57, UInt, 0, UInt, 0, UInt, 0), hand:=&quot;&quot;
}
 
WM_CHAR(wp, lp, msg, hwnd)
{
   global hEdit
   static IsCheck
   if (hwnd != hEdit)
      return
    If Msg=0x102
    {
        if (wp = 22 &amp;&amp; RegExMatch(Clipboard, &quot;i)[^\da-f]&quot;))
        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 &quot;\&quot; RegExReplace(A_ScriptName, &quot;(.*)\..*&quot;, &quot;$1&quot;) &quot;.ini&quot;

    IniRead, indexList, % IniName, Settings, indexList, 3

    SetFormat IntegerFast, H
    if (indexList=0 or indexList=&quot;&quot; or indexList=3)
        GoSub, Ini_readwrite
        Else
            Loop, Parse, indexList, `,  
                arrayOFindex[A_Index]:= A_LoopField
    SetFormat IntegerFast, D
Return

Ini_readwrite:
        indexList := &quot;&quot;
        SetFormat IntegerFast, H
        Loop % Max 
            indexList := indexList arrayOFindex[A_Index] &quot;,&quot;
        SetFormat IntegerFast, D
        StringTrimRight, indexList, indexList, 1
        IniWrite, %indexList%, % IniName, Settings, indexList 
Return
;----------------------------------------==============================================
Get_Omega_symbol(What)
{
    Static Size = 1150, Name = &quot;Omega_symbol.ico&quot;, Extension = &quot;ico&quot;, 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 &quot;extracts&quot; the file to the location+name you pass to it.
    Static HasData = 1, Base64Decode, Out_Data, Hex_Mcodex86 = &quot;558bec518365fc00568b75088a1684d20f86ac000000578b7d0c5333db33c084d2764d32c984c975318aca80e92b4680f94f770c0fb6ca8b55108a4c11d5eb02b1240fb6d180ea3d80f9240f94c1fec923ca8a1684d277cd84c9760943fec9884c0508eb05c6440508004083f8047caf83fb027c4b8a45098a4d08c0e102c0e8040ac18a4d0a88074783fb027e108a55098ac1c0e802c0e2040ac288074783fb037e09c0e1060a4d0b880f478b45fc8a1684d28d4418ff8945fc0f875bffffff5b5f8b45fc5ec9c3&quot;
    Static Hex_Mcodex64 = &quot;48895C241048897C2418440FB60933DB488BFA4C8BD14584C90F84BC000000904533DB33C94584C9744F32C00F1F400084C0752C418D41D549FFC23C4F7712410FB6C1420FB64400D53C24740404C3EB0232C0450FB60A4584C975D484C0740B41FFC3FEC888440C08EB05C6440C080048FFC14883F9047CAC4183FB027C5C0FB65424090FB644240848FFC7C0E0020FB6CAC0E9040AC8884FFF0FB64C240A4183FB027E11C0E2040FB6C1C0E8020AC248FFC78847FF4183FB037E0DC0E1060A4C240B48FFC7884FFF450FB60A428D5C1BFF4584C90F8545FFFFFF488B7C24188BC3488B5C2410C3&quot;
    Static CD = &quot;|$$$}rstuvwxyz{$$$$$$$&gt;?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\]^_``abcdefghijklmnopq&quot;
    Static 1=&quot;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==&quot;
    
    If (!HasData)
        Return -1
    
    If (CD){
        VarSetCapacity(TD,1576 * (A_IsUnicode ? 2 : 1))
        
        Loop,% 1
            TD .= %A_Index%, %A_Index% := &quot;&quot;
        
        Hex_Mcode := A_PtrSize = 8 ? Hex_Mcodex64 : Hex_Mcodex86
        VarSetCapacity(Base64Decode,StrLen(Hex_Mcode)//2)
        Loop % StrLen(Hex_Mcode)//2
            NumPut(&quot;0x&quot; . SubStr(Hex_Mcode,2*A_Index-1,2),Base64Decode,A_Index-1,&quot;Char&quot;)
        DllCall(&quot;VirtualProtect&quot;,A_IsUnicode ? &quot;Ptr&quot; : &quot;UInt&quot;,&amp;Base64Decode,A_IsUnicode ? &quot;Ptr&quot; : &quot;UInt&quot;,VarSetCapacity(Base64Decode),&quot;uint&quot;,0x40,&quot;uint*&quot;,0)
        
        VarSetCapacity(Out_Data,1150,0)
        , DllCall(&amp;Base64Decode,A_IsUnicode ? &quot;AStr&quot; : &quot;Str&quot;,TD,A_IsUnicode ? &quot;Ptr&quot; : &quot;UInt&quot;,&amp;Out_Data,A_IsUnicode ? &quot;AStr&quot; : &quot;Str&quot;,CD,&quot;CDECL UINT&quot;)
        , Base64Decode := &quot;&quot;
        , TD := &quot;&quot;
        , CD := &quot;&quot;
        , Hex_Mcodex86 := &quot;&quot;
        , Hex_Mcodex64 := &quot;&quot;
        , Hex_Mcode := &quot;&quot;
    }
    
    IfExist,%Filename%
        FileDelete,%Filename%
    
    h := DllCall(&quot;CreateFile&quot;,&quot;str&quot;,Filename,&quot;Uint&quot;,0x40000000,&quot;Uint&quot;,0,&quot;UInt&quot;,0,&quot;UInt&quot;,4,&quot;Uint&quot;,0,&quot;UInt&quot;,0)
    DllCall(&quot;WriteFile&quot;,&quot;UInt&quot;,h,A_IsUnicode ? &quot;Ptr&quot; : &quot;UInt&quot;,&amp;Out_Data,&quot;UInt&quot;,1150,&quot;UInt&quot;,0,&quot;UInt&quot;,0)
    DllCall(&quot;CloseHandle&quot;, &quot;Uint&quot;, h)
    
    If (DumpData)
        VarSetCapacity(Out_Data,1150,0)
        , VarSetCapacity(Out_Data,0)
        , HasData := 0
}

;-----------------------------------------------------------------------------
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2013-05-21T08:52:31Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=72304#p72304</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=62242#p62242" />
			<content type="html"><![CDATA[<p>Огромное спасибо за вашу помощь.<br />Опробую код на выходных, сейчас - go на море.</p>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2012-08-01T11:39:43Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=62242#p62242</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=62197#p62197" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Mikki пишет:</cite><blockquote><p>Хотел еще добавить возможность перемещать кнопки...</p></blockquote></div><div class="codebox"><pre><code>Arr:={}

#If GetKeyState(&quot;Alt&quot;, &quot;P&quot;)
*LButton::SomeFuncName((IsClicked:=!IsClicked) ? True:False)
#If !GetKeyState(&quot;Alt&quot;, &quot;P&quot;) And IsClicked
LButton Up::IsClicked:=False
#If

SomeFuncName(Arg)
{
   global Arr
   MouseGetPos, Key1, Key2, Key3, Key4
   ControlGetPos, Key5, Key6, Key7, Key8, % Key4, % &quot;ahk_id&quot;Key3
   Loop, 8
      Arr[Arg, A_Index]:=Key%A_Index%
   If !Arg
   {
      ControlMove, % Arr.0.4, Arr.1.5, Arr.1.6, Arr.1.7, Arr.1.8, % &quot;ahk_id&quot;Arr.1.3
      ControlMove, % Arr.1.4, Arr.0.5, Arr.0.6, Arr.0.7, Arr.0.8, % &quot;ahk_id&quot;Arr.0.3
      WinSet, Redraw,, % &quot;ahk_id&quot;Arr.0.3
   }
}</code></pre></div><p>Я бы добавил ещё возможность <em>таскать</em> окно, раз заголовок убран:</p><div class="codebox"><pre><code>OnMessage(WM_LBUTTONDOWN:=0x201, &quot;WindowProc&quot;)
SetTimer, Action, -1000
Gui, +HWNDhGUI
Gui, Add, Button, x52 y100 w100 h30 gGuiClose, &amp;Exit
Gui, Add, Text, x72 y40 w70 h20 Center, Can drag...
Gui, Show, w200 h154, SomeTitle
Return

Action:
   WinSet, Style, -0xC00000, % &quot;ahk_id&quot;hGUI
   Return

GuiClose:
   ExitApp

WindowProc(wParam, lParam, uMsg, hWnd)
{
   global hGUI
   If uMsg=0x201
      PostMessage, WM_NCLBUTTONDOWN:=0xA1, HTCAPTION:=2,,, % &quot;ahk_id&quot;hGUI
}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Grey]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=25792</uri>
			</author>
			<updated>2012-07-31T03:48:19Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=62197#p62197</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=62157#p62157" />
			<content type="html"><![CDATA[<p>И снова, всем доброго дня. Микротемы созданные мной за последние три дня на этом форуме служили одной цели - решить небольшие проблемы возникшие при написании следующего скрипта. Я уже не решился создавать еще одну микротему, потому что, мне показалось, что пора выкладывать скрипт на общий вид, и уже после этого задавать вопрос.</p><p> Собственно, скрипт - доработанный вариант исходного <strong>&quot;Быстро доступная таблица символов&quot;</strong>. В этом скрипте добавлено:<br />сохранение таблицы символов в ини.файл<br />добавление символов через контекстное меню<br />удаление символов через контекстное меню</p><p>пытался реализовать мгновенное отображение символа по коду вводимому в поле <strong>newIndex</strong></p><p>Собственно, не возможность мгновенного отображения символа в процессе ввода кода и заставила меня выложить тут весь скрипт. Как реализовать это через таймеры я знаю. Но так как я уже начал писать через <strong>OnMessage</strong>, то и это хотелось бы реализовать через неё же.</p><p>Воооот... Хотел еще добавить возможность перемещать кнопки(символы) при зажатой клавише Alt(к примеру). Но спустя неделю coding приведенного ниже скрипта понял, что если и реализую перемещение, то это будет уродливая-навороченная-глючная структура. Посему, если кто из читающих это реализует перемещение кнопок на форме, то поклон ему и благодарность от меня.<br /></p><div class="codebox"><pre><code>#SingleInstance Force
#Persistent
#NoEnv
SetTitleMatchMode 2
/* Таблица символов появляющаяся по горячей клавише СредняяКлавишаМышки+ПраваяКлавишаМышки.
 Символы отсылаются в Unicode. Если приложение не понимает Unicode, то может вставиться чертичё.
 Доступно добавление символа в таблицу, по его коду, через контекстное меню. Символ добавляется в 
 конец таблицы. Доступно удаление символа из таблицы. Коды символов в таблице сохраняются в 
 ини файл.

 Использованы скриптовые конструкции от ~lego, teadrinker, Grey, creature.ws, и многих других
*/
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, &quot;WM_CHAR&quot;)       ;для фильтрования введенных символов = только HEX
OnMessage(WM_KEYDOWN:=0x100, &quot;WM_CHAR&quot;) ; для фильтрования нажатия Enter

col:=12 ; quantity of columns
b1Width:=25 ; button size
                                                  ; 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, x65 y25 vnewChar, &quot;= &quot;
Gui, 2:Font, s12, Times New Roman 


Redraw:
	Gui, 1:Destroy
	Gui, 1:+AlwaysOnTop +LastFound -Caption +Toolwindow -E0x08000000 ; окно поверх всего, без рамок,границ,заголовия
	Gui, 1:Font, s12, Times New Roman 
	x:=0
	y:=0

	Loop % arrayOFindex.MaxIndex() {
		Gui, 1:Add, Button, x%x% y%y% w%b1Width% h%b1Width% gS, % chr(arrayOFindex[A_Index])
		x += b1Width
		if (x &gt;= col*b1Width) {
			x := 0
			y += b1Width
		}
		winH := y+b1Width
	}
	winW := col*b1Width
Return

;==========================
~Mbutton &amp; Rbutton::
	If (flag := !flag) 	{
		CoordMode, Mouse, Screen 	; берем координаты мышки
		MouseGetPos, mX, mY			; относительно всего экрана
		GoSub, ShowTable			; показываем таблицу
		}
	Else 
		Gui, Cancel										; если клавиши нажаты, а окно показано - прячем
return

S:			;вставляем символ
	Gui, Cancel 
	Clipboard := A_GuiControl
	SendInput, %A_GuiControl%
	flag := !flag
Return


ShowTable:
		Gui, 1:Show, %  &quot;x&quot; mX &quot;y&quot; mY &quot;h&quot; winH &quot;w&quot; winW &quot;NA&quot;, charmap	; показываем окно
		WinSet , Transparent , 210 , charmap 				; устанавливаем его прозрачность
Return


GuiContextMenu: 
	mControlX := A_GuiX			;запоминаем переменные для последующей работы с ними
	mControlY := A_GuiY
	mControl := A_GuiControl
	Menu, MyMenu, Add, Add symbol, Addsymbol
	Menu, MyMenu, Add, Del symbol %mControl%, Delsymbol
	Menu, MyMenu, Show, 
	Menu, MyMenu, Delete, Del symbol %mControl%
Return

AddSymbol:
	Gui, 1:Hide,
	flag := !flag
	Gui, 2:Show,
	GuiControl, 2:Focus, newIndex
	GuiControl, 2:Text, newChar, % chr(newIndex:=&quot;0x&quot;newIndex)
Return

DelSymbol: 								
	Key:= col*Floor(mControlY/b1Width)+Ceil(mControlX/b1Width) ; вычисление индекса символа, выбранного на удаление, в масиве
	arrayOFindex.Remove(Key)
	GoSub, Ini_readwrite			; перезапись инифайла согласно новому содержимому массива
	Gosub, Redraw
	GoSub, ShowTable
Return

AddNewButton:			; получаем введенный код и добавляем новый символ
	Gui, 2:Submit
	Gui, 1:Show,
	flag := !flag
	arrayOFindex.Insert(newIndex:=&quot;0x&quot;newIndex)
	GoSub, Ini_readwrite
	GoSub, Redraw
	GoSub, ShowTable
Return
 
WM_CHAR(wp, lp, msg, hwnd)
{
   global hEdit
   static IsCheck
   if (hwnd != hEdit)
      return
 
	If Msg=0x102
	{
		if (wp = 22 &amp;&amp; RegExMatch(Clipboard, &quot;i)[^\da-f]&quot;))
		Return 0
 
		if wp in 3,8,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	
				
	; попытка сделать вывод символа в текстовом поле newChar, 
	; в процессе ВВОДА в поле Edit - newIndex
	ControlGet, OutVar, Line, 1, newIndex
	GuiControl, 2:Text, newChar, % chr(&quot;0x&quot;OutVar)
}

;:--------------------------------------------------------------------------------------:;

Ini_tialise:

	IniName := A_ScriptDir &quot;\&quot; RegExReplace(A_ScriptName, &quot;(.*)\..*&quot;, &quot;$1&quot;) &quot;.ini&quot;

	IniRead, indexList, % IniName, Settings, indexList, 3

	SetFormat IntegerFast, H
	if (indexList=0 or indexList=&quot;&quot; or indexList=3)
		GoSub, Ini_readwrite
		Else
			Loop, Parse, indexList, `,  
				arrayOFindex[A_Index]:= A_LoopField
	SetFormat IntegerFast, D
Return

Ini_readwrite:
		indexList := &quot;&quot;
		SetFormat IntegerFast, H
		Loop % arrayOFindex.MaxIndex() 
			indexList := indexList arrayOFindex[A_Index] &quot;,&quot;
		SetFormat IntegerFast, D
		StringTrimRight, indexList, indexList, 1
		IniWrite, %indexList%, % IniName, Settings, indexList 
Return</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2012-07-30T11:51:48Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=62157#p62157</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61956#p61956" />
			<content type="html"><![CDATA[<p>Вы как всегда правы. Не нашел только градиент. Но это не критично.<br /></p><div class="codebox"><pre><code>#SingleInstance Force
#Persistent
#NoEnv
SetTitleMatchMode 2

x:=0
y:=0

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 - минус (который на уровне с плюсом)
*/
col:=12 ; quantity of columns
b1Width:=25 ; s=button size
;flag:=0 ;  window shown or not

Gui, Font, s12, Times New Roman 

Loop % arrayOFindex.MaxIndex() {
	Gui, Add, Button, x%x% y%y% w%b1Width% h%b1Width% gS, % chr(arrayOFindex[A_Index])
	x += b1Width
	if (x &gt; col*b1Width) {
      x := 0
      y += b1Width
    }
	winH := y+b1Width
}
	winW := col*b1Width
Return

~Mbutton &amp; Rbutton::
	If (flag := !flag) 	{
		CoordMode, Mouse, Screen 	; берем координаты мышки
		MouseGetPos, mX, mY			; относительно всего экрана
		Gui, +AlwaysOnTop +LastFound -Caption +Toolwindow -E0x08000000 ; окно поверх всего, без рамок,границ,заголовия
;		MsgBox, %flag%
		Gui, Show, %  &quot;x&quot; mX &quot;y&quot; mY &quot;h&quot; winH &quot;w&quot; winW &quot;NA&quot;, charmap	; показываем окно
;		Gui, Show, %  &quot;x&quot; mX-winW//2 &quot;y&quot; mY-winH//2 h%winH% w%winW% NA, charmap	; показываем окно
		WinSet , Transparent , 210 , charmap 				; устанавливаем его прозрачность
}	Else {
		Gui, Cancel										; если клавиши нажаты, а окно показано - прячем
		 }
return

S:
Gui, Cancel 
Clipboard := A_GuiControl
SendInput, %A_GuiControl%}
flag := !flag

Return</code></pre></div><p>Не разобрался только со средней клавишей, которая, после закрытия окна без выбора символа <br />Else {<br />Gui, Cancel<br />}<br />то иногда срабатывает как запрограммировано в приложении (обычно - скролл), а иногда не срабатывает. Естественно надо чтоб она не срабатывала когда я вызываю свое окошко символов.</p><p>Да, и большое спасибо всем кто пытался достучаться до моего понимания решения, и <strong>creature.ws</strong>-у за то что достучался <img src="//forum.script-coding.com/img/smilies/big_smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2012-07-24T11:09:28Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61956#p61956</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61951#p61951" />
			<content type="html"><![CDATA[<p>Gui, Show, %&nbsp; &quot;x&quot; mX-winW//2 …</p><p>Забудьте вы о шрифте Symbol. Нужные символы известны, таблица символов под рукой — ищете, копируете 4-значные hex коды символов, их и храните в массиве, они и будут отображаться на кнопках, они и будут печататься при нажатии кнопки.</p>]]></content>
			<author>
				<name><![CDATA[creature.ws]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26105</uri>
			</author>
			<updated>2012-07-24T08:18:23Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61951#p61951</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61950#p61950" />
			<content type="html"><![CDATA[<p>Промежуточный работающий вариант скрипта. Хоткеи передаются. Символы вводятся. Осталось только приделать их отображение на кнопки. Есть советы?<br /></p><div class="codebox"><pre><code>#SingleInstance Force
#Persistent
#NoEnv
SetTitleMatchMode 2

x:=0
y:=0
arrayOFindex := [68,87,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,126,163,164,165,176,177,179,180,184,185,187,188,209,215] ; коды символов
/*
68 - ДЕЛЬТА
87 - ОМЕГА
97 - 122 - малые греческие
126 - ~
163 - меньше-больше
164 - делить /
165 - бесконечность
176 - градус
177 - плюс-минус
179 - больше-равно
180 - умножить х 
184 - делить - 
185 - не равно
187 - равно приблизительно
188 - троеточие
209 - градиент
215 - умножить (точка)
*/
col:=12 ; quantity of columns
b1Width:=30 ; s=button size
;flag:=0 ;  window shown or not

Gui, Font, s10, Symbol 

Loop % arrayOFindex.MaxIndex() {
	Gui, Add, Button, x%x% y%y% w%b1Width% h%b1Width% gS, % chr(arrayOFindex[A_Index])
	x := x+b1Width
	if (x &gt; col*b1Width) {
      x := 0
      y := y+b1Width
    }
	winH := y+b1Width
}
	winW := col*b1Width
Return

~Mbutton &amp; Rbutton::
	If (flag := !flag) 	{
		CoordMode , Mouse, Screen  ; берем координаты мышки
		MouseGetPos, mX, mY        ; относительно всего экрана
		Gui, +AlwaysOnTop +LastFound -Caption +Toolwindow -E0x08000000 ; окно поверх всего, без рамок,границ,заголовия
;		MsgBox, %flag%
		mX:=mX-winW/2
		Gui, Show, x%mX% y%mY% h%winH% w%winW% NA, charmap	; показываем окно
		WinSet , Transparent , 210 , charmap 				; устанавливаем его прозрачность
}	Else Gui, Cancel										; если клавиши нажаты, а окно показано - прячем

return

S:
Gui, Cancel 
Clipboard := A_GuiControl
{
	SendInput, %A_GuiControl%
	SendInput, {Shift Down}{Left}{Shift Up}								; выделяем последний введенный символ
	SendInput, {Control Down}{Shift Down}{SC021}{Shift UP}{Control UP}	; {VK46}переходим в окно выбора Шрифта Control+Shift+F
	SendInput, symb{Enter}{Right}										; вводим &quot;sym&quot; и Ентер, снимаем выделение с символа
	SendInput, {Control Down}{Shift Down}{SC021}{Shift UP}{Control UP}	; переходим в окно выбора Шрифта Control+Shift+F
	SendInput, times{Enter}												; вводим &quot;times&quot; и Ентер
}
flag := !flag

Return</code></pre></div><p>И еще вопросик: есть возможность внести вычисление&nbsp; mX:=mX-winW/2 во внутрь команды показа окна Gui, Show, x%mX% ......?</p>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2012-07-24T07:54:43Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61950#p61950</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61949#p61949" />
			<content type="html"><![CDATA[<p>Там изначально было {vk46}. Это я по ошибке вставил тестовый вариант. Не работает&nbsp; ни так ни так. Сейчас попробую со сканкодами.</p>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2012-07-24T07:13:48Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61949#p61949</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61918#p61918" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>SendInput, {Control Down}{Shift Down}{vk46}{Shift UP}{Control UP}</code></pre></div>]]></content>
			<author>
				<name><![CDATA[creature.ws]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26105</uri>
			</author>
			<updated>2012-07-23T14:03:34Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61918#p61918</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61917#p61917" />
			<content type="html"><![CDATA[<p>Триста раз уже тут перемусоливали тему раскладок клавиатуры и проблем с этим связанные, а&nbsp; не могу найти подсказок с тем с чем столкнулся.<br /></p><div class="codebox"><pre><code>#SingleInstance Force
#Persistent
#NoEnv
SetTitleMatchMode 2

x:=0
y:=0
arrayOFindex := [68,87,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,126,163,164,165,176,177,179,180,184,185,187,188,209,215] ; коды символов
/*
68 - ДЕЛЬТА
87 - ОМЕГА
97 - 122 - малые греческие
126 - ~
163 - меньше-больше
164 - делить /
165 - бесконечность
176 - градус
177 - плюс-минус
179 - больше-равно
180 - умножить х 
184 - делить - 
185 - не равно
187 - равно приблизительно
188 - троеточие
209 - градиент
215 - умножить (точка)
*/
col:=12 ; quantity of columns
b1Width:=30 ; s=button size
;flag:=0 ;  window shown or not

Gui, Font, s10, Symbol 

Loop % arrayOFindex.MaxIndex() {
	Gui, Add, Button, x%x% y%y% w%b1Width% h%b1Width% gS, % chr(arrayOFindex[A_Index])
	x := x+b1Width
	if (x &gt; col*b1Width) {
      winW := x
      x := 0
      y := y+b1Width
    }
	winH := y+b1Width
}
Return

~Mbutton &amp; Rbutton::
	If (flag := !flag) 	{
		CoordMode , Mouse, Screen  ; берем координаты мышки
		MouseGetPos, mX, mY        ; относительно всего экрана
		Gui, +AlwaysOnTop +LastFound -Caption +Toolwindow -E0x08000000 ; окно поверх всего, без рамок,границ,заголовия
;		MsgBox, %flag%
		Gui, Show, x%mX% y%mY% h%winH% w%winW% NA, charmap ; показываем окно
		WinSet , Transparent , 210 , charmap 			   ; устанавливаем его прозрачность
}	Else Gui, Cancel			; если клавиши нажаты, а окно показано - прячем
return

S:
Gui, Cancel 
Clipboard := A_GuiControl
{
	SendInput, %A_GuiControl%
	SendInput, {Shift Down}{Left}{Shift Up}								; выделяем последний введенный символ
	SendInput, {Control Down}{Shift Down}f{Shift UP}{Control UP}	; {VK46}переходим в окно выбора Шрифта Control+Shift+F
;	SendInput, {VK53}{VK59}{VK4d}{Enter}{Right}							; вводим &quot;sym&quot; и Ентер, снимаем выделение с символа
;	SendInput, {Control Down}{Shift Down}f{Shift UP}{Control UP}	; переходим в окно выбора Шрифта Control+Shift+F
;	SendInput, {VK54}{VK49}{VK4d}{VK45}{VK53}{Enter}						; вводим &quot;times&quot; и Ентер
}
flag := !flag

Return</code></pre></div><p>Если в Word-e английская раскладка - все ок. Если русская - то просто не срабатывает горячая клавиша Ctrl+Shft+f . Вместо этого оно просто пишет&nbsp; f, затирая выделенный символ.</p><p>Попытался в лоб применить код из <a href="http://forum.script-coding.com/viewtopic.php?id=7235">пост #3</a>. Но что-то не получается.<br />Посоветуйте как отослать клавиши, чтоб их понял Word. (Word 2003 SP3)</p>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2012-07-23T13:47:45Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61917#p61917</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61916#p61916" />
			<content type="html"><![CDATA[<p>Некоторые символы я не нашел в таблицах юникода.</p>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2012-07-23T11:54:57Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61916#p61916</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61914#p61914" />
			<content type="html"><![CDATA[<p>Символы шрифта Symbol&nbsp; уникальны или таки стандартизированы Unicode?<br />Что мешает задать символ стандартным его кодом? <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></content>
			<author>
				<name><![CDATA[creature.ws]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26105</uri>
			</author>
			<updated>2012-07-23T11:36:48Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61914#p61914</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Быстродоступная таблица символов]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=61913#p61913" />
			<content type="html"><![CDATA[<p>Да, вы правы - я не корректно поставил вопрос. Перезадаю:</p><p>Появилась ли возможность разрешить проблему отображения символов шрифта Symbol в окне GUI?<br />А именно символы с индексом 163,165...</p><div class="codebox"><pre><code>
#SingleInstance Force
#Persistent
#NoEnv
SetTitleMatchMode 2

index :=  65 ; 0x2100 ;
x:=0
y:=0
; arrayOFnumbers = [163,165,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190] ; коды символов
col:=12 ; quantity of columns
s:=30 ; button size
; flag:=0 ;  window shown or not

Gui, Font, s10, Symbol 
;Gui, Font, s10, Tahoma
;GUI, Add, Text, x%x% y%y% w%s% h%s% gS, % chr(index)


index := 163 ; символ меньше-равно
Gui, Add, Text, x%x% y%y% w%s% h%s% gS, % chr(index)
x := x+s
if (x &gt; col*s) {
      winW := x
      x := 0
      y := y+s
    }
winH := y+s

index := 165 ; символ бесконечности
Gui, Add, Text, x%x% y%y% w%s% h%s% gS, % chr(index)
x := x+s
if (x &gt; col*s) {
      winW := x
      x := 0
      y := y+s
    }
winH := y+s

index := 176
while (index &lt; 191) {
  Gui, Add, Button, x%x% y%y% w%s% h%s% gS, % chr(index)
  index++
  x := x+s
    if (x &gt; col*s) {
      winW := x
      x := 0
      y := y+s
    }
  winH := y+s
}

Return

~Mbutton &amp; Rbutton::
	If (flag := !flag) 	{
		CoordMode , Mouse, Screen  ; берем координаты мышки
		MouseGetPos, mX, mY        ; относительно всего экрана
		Gui, +AlwaysOnTop +LastFound -Caption +Toolwindow -E0x08000000 ; окно поверх всего, без рамок,границ,заголовия
;		Gui, Add, Edit, -ReadOnly w50 x%x% y%y%, % chr(index)
;		MsgBox, %A_Gui%
		Gui, Show, x%mX% y%mY% h%winH% w%winW% NA, charmap ; показываем окно
		WinSet , Transparent , 210 , charmap 			   ; устанавливаем его прозрачность
}	Else Gui, Cancel                                       ; если клавиши нажаты, а окно показано - прячем
return

S:
Gui, Cancel 
Clipboard := A_GuiControl
IfWinExist, Microsoft Word
{
	Send, %A_GuiControl%
	Send, {Shift Down}{Left}{Shift Up}								; выделяем последний введенный символ
	Send, {Control Down}{Shift Down}{VK46}{Control UP}{Shift UP}	; переходим в окно выбора Шрифта Control+Shift+F
	Send, {VK53}{VK59}{VK4d}{Enter}{Right}							; вводим &quot;sym&quot; и Ентер, снимаем выделение с символа
	Send, {Control Down}{Shift Down}{VK46}{Control UP}{Shift UP}	; переходим в окно выбора Шрифта Control+Shift+F
	Send, {VK54}{VK49}{VK4d}{VK45}{VK53}{Enter}						; вводим &quot;times&quot; и Ентер

	flag := !flag
}

Return</code></pre></div><p>Есть конечно же возможность сделать картинки с изображением этих символов и по вставлять их на кнопки, но тогда со скриптом придется и эти картинки таскать и он потеряет свою универсальность.</p>]]></content>
			<author>
				<name><![CDATA[Mikki]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=5905</uri>
			</author>
			<updated>2012-07-23T11:25:27Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=61913#p61913</id>
		</entry>
</feed>
