1 (изменено: serzh82saratov, 2014-11-19 10:11:09)

Тема: AHK: Виртуальная 10-ти "клавишная" клавиатура

Скрипт создавался для набора текста с пульта ДУ десятью кнопками с цифрами.
Но также оказался для меня более удобным (при наборе только мышью) чем виртуальная клавиатура с полной раскладкой (видимо привычка набора текста на старом телефоне).
В том числе удобство ввода не только кликами, но и колёсиком мыши.

-----------------------------------------------------------

http://savepic.net/6175392.png

-----------------------------------------------------------
 
Пост в коллекции.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

2

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

#SingleInstance force
Gui, +AlwaysOnTop +E0x08000000
Gui, Add, Button, gPress v1 w44 h44, 1
Gui, Add, Button, gPress v2 x+10 wp hp, 2
Gui, Add, Button, gPress v3 x+10 wp hp, 3
Gui, Add, Button, gPress v4 x+10 wp hp, 4
Gui, Add, Button, gPress v5 x+10 wp hp, 5
Gui, Show, NA
return

Press:
    ToolTip % "Нажата кнопка " A_GuiControl, 10, 10
    return

GuiClose:
GuiEscape:
    ExitApp

3

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

creature.ws
Ну вообще отлично, спасибо!
А что за стиль такой E0x08000000?

И возможно-ли перетаскивание окна сделать плавным?
И сделать окно поверх всех, включая и те у которых стиль AlwaysOnTop?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

4

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

А что за стиль такой

WS_EX_NOACTIVATE

5

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Часть кнопок в заголовке не отображаются, я так понимаю (на Win7 SP1 x64).
http://savepic.org/6422055m.png

6

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

У меня как раз и есть Win7 SP1 x64. Тут наверное дело в наборе юникода конкретной винды (у меня - профессиональная). АНК ведь у тебя Unicodе?

Как вариант - надо попробовать написать эти кнопки на HTML.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

7

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Да, АНК — Юникод, а Винда домашняя расширенная.

А почему не использовать, например, для закрывающей кнопки букву икс? Ведь гарантия, что везде есть. Для сворачивающей — тире использовать или подчёркивание. И никаких проблем 100%.

8 (изменено: serzh82saratov, 2014-11-09 14:06:12)

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Для сворачивающей — тире использовать или подчёркивание.

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

Хотя может просто оставить надписи? Смотрится ничё, да и понятнее:
http://savepic.net/6181807.png



    ;   Виртуальная 10-ти "клавишная" клавиатура
    ;   Автор - serzh82saratov
    ;   http://forum.script-coding.com/viewtopic.php?pid=88135#p88135

#UseHook
#SingleInstance Force
#NoTrayIcon
#NoEnv
SetBatchLines -1
ListLines Off
OnExit GuiClose

TrayIcon := 1                             ;  Иконка только в трее, или только на панели задач
AutoRegistr := 1                        ;  Переключать в нижний регистр, после ввода символа из верхнего

If TrayIcon
{
    Menu, Tray, Icon
    Gui, +Owner
    Menu, Tray, Click, 1
    Menu, Tray, NoStandard
    Menu, Tray, Add, Min/Max, MinMax
    Menu, Tray, Standard
    Menu, Tray, Default, Min/Max
    Menu, Tray, Disable, Min/Max
}
Menu, Tray, UseErrorLevel
Menu, Tray, Icon, Shell32.dll, 174        ;  197 | 174 | accessibilitycpl.dll, 11 | Shell32.dll, 174

Global ChrN := 0, AreaA, ThisChr, Minimize, PrArea, WinArea, PrCurBank, hThisGui, isThisGui, CapsMode

    , CurBank := "Num"                    ;  Стартовая раскладка     bRu | sRu | bEn | sEn | Num | Sym
    , TimeOut := 1500                    ;  Таймаут авто ввода символа после последнего выбора
    , BgColor := "2F4F4F"                ;  Цвет фона  2F4F4F | 2943AF | 95746A | E3C47A | FF8C00 | 9DB5CB | FFDE8A
    , ChrColor := "000000"                ;  Цвет шрифта
    , ThisChrColor := "ffffff"            ;  Цвет выбранного символа
    , CtrlColor := "FF5300"                ;  Цвет надписей кнопок "Ctrl+..."      FF5300 | 2943AF
    , FontSize := 32                    ;  Размер шрифта символов

    , IsCaptionShowStr := True            ;  Показывать ли набранный текст в заголовке     True | False
    , CaptionStrLen := 64                ;  Количество символов в заголовке
    , CaptionFontSize := 14                ;  Размер шрифта символов в заголовке
    , CaptionFontColor := ChrColor        ;  Цвет шрифта символов в заголовке

    , Chr_Tab := Chr(0x2610)            ;  Символ табуляции
    , Chr_Space := Chr(0x25af)            ;  Символ пробела
    , Chr_Carret := Chr(0x21b2)            ;  Символ переноса строки

wKey := 130                                ;  Ширина кнопки
hKey := wKey//2                            ;  Высота кнопки
HCaption := hKey//3.1                    ;  Высота заголовка
Margin := 0                                ;  Расстояние между кнопками
Gui, Font, w700 s4                        ;  Параметр шрифта кнопок, из заголовка

Gosub InitConstants
FixIE(0)

Gui, Margin, 0, 0
Gui -DPIScale +AlwaysOnTop +Lastfound -Caption +HWNDhThisGui
Gui, Color, 696969
WinSet, TransColor, 696969 225

Gui, Add, Progress, % "x0 y0 h" HCaption " w" HCaption//0.6 " BackgroundD9952F vAreaD"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor% vDel, DEL

Gui, Add, Progress, % "x+" Margin " y0 h" HCaption " w" HCaption//0.6 " Background44AD24 vAreaS"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor%, SYMB

Gui, Add, Progress, % "x+" Margin " y0 h" HCaption " w" HCaption//0.6 " BackgroundFFFF00 vAreaR"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor% vRepeat, RET

Gui, Add, ActiveX, % "Border x+" Margin " yp h" HCaption " w" (wKey*3+Margin*2)-(HCaption//0.6)*5-Margin*5 " vAreaA", HTMLFile

Gui, Add, Progress, % "x+" Margin " yp h" HCaption " w" HCaption//0.6 " vAreaM Background365DC0"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor%, TURN

Gui, Add, Progress, % "x+" Margin " yp h" HCaption " w" HCaption//0.6 " vAreaC BackgroundEC4D48"
Gui, Add, Text, Border xp yp wp hp BackgroundTrans +0x201 c%ChrColor%, CLOSE

Gui, Add, ActiveX, Border x0 y+%Margin% w%wKey% h%hKey% vArea1, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea2, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea3, HTMLFile

Gui, Add, ActiveX, Border x0 y+%Margin% hp wp vArea4, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea5, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea6, HTMLFile

Gui, Add, ActiveX, Border x0 y+%Margin% hp wp vArea7, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea8, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea9, HTMLFile

Gui, Add, ActiveX, % "Border xp-" wKey + Margin " y+" Margin " hp wp vArea0", HTMLFile

WriteHTMLCaption()
Loop 10
    WriteHTML(I := A_Index-1, Bank_%CurBank%_%I%)

WinGetPos, , Y, , , ahk_class Shell_TrayWnd ahk_exe explorer.exe
Gui, Show, % "NA xCenter y" Y - (hKey * 4) - HCaption - (Margin * 5), Virtual mini keyboard
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0xC, "WM_SETTEXT")
OnMessage(0x200, "WM_MOUSEMOVE")
SetTimer, GuiShow, 250
Return

#If (!Minimize)    ; Если окно скрипта не свёрнуто. Условие для клавиш клавиатуры.

#If IsThisGuiScript

MButton::
    If WinArea = A
        CancelInputChr(), AreaA.getElementById("caption").InnerText := captiontext := ""
    Else If WinArea is number
        ChangeRegistr()
    Return
    
RButton::
    If WinArea = A
        CancelInputChr(), AreaA.getElementById("caption").InnerText := captiontext := ""
    Else If WinArea is number
        OKinputChr()
    Return
    
WheelDown::
    If WinArea is number
        ChrN ? CancelInputChr() : ChangeBank()
    Else If WinArea = D
        Gosub DeleteChr
    Return

WheelUp::
    If WinArea is number
        NextChrMouse()
    Else If WinArea = D
        Gosub DeleteChr
    Return

#If (IsThisGuiScript && WinArea != "A")

LButton::
    If (WinArea = "S" || GetKeyState("RButton", "P"))
        ChangeSymBank()
    Else If WinArea is number
        NextChrMouse()
    Else If WinArea = D
    {
        If ChrN
            CancelInputChr()
        SendInput {BS}
        GuiControl, +c%ThisChrColor%, Del
        GuiControl, +Redraw, Del
        SetTimer, BS, -650
        KeyWait LButton
        SetTimer, BS, Off
        GuiControl, +c%ChrColor%, Del
        GuiControl, +Redraw, Del
    }
    Else If WinArea = R
    {
        If ChrN
            OKinputChr()
        ThisChr := PrThisChr
        Gosub SendChr
        GuiControl, +c%ThisChrColor%, Repeat
        GuiControl, +Redraw, Repeat
        SetTimer, Repeat, -650
        KeyWait LButton
        SetTimer, Repeat, Off
        GuiControl, +c%ChrColor%, Repeat
        GuiControl, +Redraw, Repeat
    }
    Else If WinArea = M
        Gosub MinMax
    Else If WinArea = C
        ExitApp
    Return

#If

BS:
    SendInput {BS}
    SetTimer, BS, -30
    Return

Repeat:
    ThisChr := PrThisChr
    Gosub SendChr
    SetTimer, Repeat, -30
    Return

DeleteChr:
    If ChrN
        CancelInputChr()
    SendInput {BS}
    GuiControl, +c%ThisChrColor%, Del
    GuiControl, +Redraw, Del
    SetTimer, DelDefColor, -100
    Return

DelDefColor:
    GuiControl, +c%ChrColor%, Del
    GuiControl, +Redraw, Del
    Return

WM_SETTEXT(wParam, lParam, msg, hwnd) {        ; Для управления сообщениями
    Str := StrGet(lParam)                    ; SendMessage, 0xC, , "ChangeBank", , #Input_Num_Text# ahk_class AutoHotkeyGUI
    If Str = NextChr                        ; SendMessage, 0xC, 3, "NextChr", , #Input_Num_Text# ahk_class AutoHotkeyGUI
        NextChr(wParam)
    Else If IsFunc(Str)
        %Str%()
    Return True
}

WM_LBUTTONDOWN()   {      ; Перетаскивание окна
    If WinArea = A
    {
        PostMessage, 0xA1, 2
        KeyWait LButton
        IfWinActive
            SendInput !{Esc}
    }
}

WM_MOUSEMOVE()   {
    WinArea := SubStr(A_GuiControl, 0)
    SetTimer, IsThisGui, -10
}

ChangeSymBank()  {
    ChangeBank(CurBank = "Sym" ? PrCurBank : "Sym")
}

ChangeBank(Bank = "")  {
    SetTimer, SendChr, Off
    ThisChr := "", ChrN := 0, PrCurBank := CurBank
    If Bank
        CurBank := Bank
    Else If CapsMode
        CurBank := CurBank ~= "Num|Sym" ? "bRu"
                : CurBank = "bRu" ? "bEn"
                : CurBank = "bEn" ? "Num"
                : CurBank
    Else
        CurBank := CurBank ~= "Num|Sym" ? "sRu"
                : CurBank = "sRu" ? "sEn"
                : CurBank = "sEn" ? "Num"
                : CurBank
    Loop 10
        WriteHTML(I := A_Index-1, Bank_%CurBank%_%I%)
}

ChangeRegistr()  {
    OKinputChr(), ThisChr := "", ChrN := 0
    CurBank := CurBank = "sRu" ? "bRu"
            : CurBank = "bRu" ? "sRu"
            : CurBank = "bEn" ? "sEn"
            : CurBank = "sEn" ? "bEn"
            : CurBank = "Sym" ? "Num"
            : CurBank = "Num" ? "Sym"
            : CurBank
    CapsMode := CurBank ~= "bRu|bEn" ? 1
        : CurBank ~= "sEn|sRu" ? 0 : CapsMode
    Loop 10
        WriteHTML(I := A_Index-1, Bank_%CurBank%_%I%)
}

NextChrMouse()  {
    If (WinArea != "")
        NextChr(WinArea)
}

NextChr(Area)  {
    If (PrArea != Area)
        WriteHTML(PrArea, Bank_%CurBank%_%PrArea%)
        , PrArea := Area, OKinputChr()
    str := Bank_%CurBank%_%Area%
    ChrN := ChrN = StrLen(str) ? 1 : ChrN+1
    p1 := SubStr(Str, 1, ChrN-1)
    ThisChr := SubStr(Str, ChrN, 1)
    p2 := SubStr(Str, ChrN+1)
    If (CurBank = "Sym" && InStr(str, "Ctrl+"))
        p1 := p2 := "", ThisChr := str
    WriteHTML( Area, p1, ThisChr, p2)
    SetTimer, SendChr, % (p1 = "" && p2 = "") ? -20 : -TimeOut
}

SendChr:
    If (ThisChr = "")
        Return
    PrThisChr := ThisChr
    SendChr := ThisChr = Chr_Carret ? "`n" : ThisChr = Chr_Space ? " "
            : ThisChr = Chr_Tab ? A_Tab : ThisChr
    If StrLen(ThisChr) > 1
        SendInput % VkArr[ThisChr] (SendChr := "")
    Else
        SendInput {Raw}%SendChr%

    ThisChr := "", ChrN := 0
    Area%PrArea%.getElementById("ThisChr").style.color := SendChr != "" ? ChrColor : CtrlColor

    If (IsCaptionShowStr && SendChr != "")
    {
        captiontext .= SendChr = "`n" ? Chr_Carret : SendChr = A_Tab ? "    " : SendChr
        captiontext := SubStr(captiontext, -CaptionStrLen)
        AreaA.getElementById("caption").InnerText := captiontext Chr(0x25ae)
    }

    If (AutoRegistr && ((CurBank = "bRu" || CurBank = "bEn") && !InStr(Bank_NoBig, SendChr)))
        ChangeRegistr()
    Return

OKinputChr()  {
    SetTimer, SendChr, Off
    Gosub SendChr
}

CancelInputChr()  {
    SetTimer, SendChr, Off
    ThisChr := "", ChrN := 0
    Area%PrArea%.getElementById("ThisChr").style.color := ChrColor
}

WriteHTML(Area, p1, ThisChr = "", p2 = "")  {
    sizefont := CurBank = "Num" ? fontsize*1.4
        : (Area > 1) && (CurBank = "sRu" || CurBank = "sEn") ? fontsize*1.2 : fontsize
    colorchr := (CurBank = "Sym") && (Area > 6 || Area = 0) ? CtrlColor : ChrColor

    html =
    ( c
    <body onselectstart='return false' oncontextmenu='return false'>
    <div>%p1%<span id='ThisChr'>%ThisChr%</span>%p2%</div>
    </body>
    <style>
    body {background-color: '#%bgcolor%'; cursor: 'pointer'; overflow: 'hidden';}
    #ThisChr {color: '%ThisChrColor%';}
    div {text-align: 'center'; color: '%colorchr%'; font-size: '%sizefont%';
    font-family: 'Arial';    position: 'relative'; top: '-0.11em'}
    </style>
    )
    Area%Area%.body.innerHTML := html
}

WriteHTMLCaption()   {
    html =
    ( c
    <body onselectstart='return false' oncontextmenu='return false'>
    <p id="caption">&nbsp;</p>
    </body>
    <style>
    body {background-color: '#%bgcolor%'; cursor: 'move'; overflow: 'hidden';}
    #caption {position: 'absolute'; right: '15px'; top: '-1px';
    color: '%CaptionFontColor%'; white-space: 'nowrap';
    text-align: 'right'; font-size: '%CaptionFontSize%';}
    </style>
    )
    AreaA.body.innerHTML := html
}

FixIE(Fix)  {
    Static Key := "Software\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION"
    If A_IsCompiled
        ExeName := A_ScriptName
    Else
        SplitPath, A_AhkPath, ExeName
    If Fix
        RegWrite, REG_DWORD, HKCU, %Key%, %ExeName%, 0
    Else
        RegDelete, HKCU, %Key%, %ExeName%
}

MinMax:
    If TrayIcon
    {
        Minimize := !DllCall("IsWindowVisible", "Ptr", hThisGui)
        Gui, Show, % Minimize ? "NA" : "Hide"
        SetTimer, GuiShow, % (Minimize := !Minimize) ? "Off" : "On"
        If !Minimize
            SendInput !{Esc}
        Else
            CancelInputChr()
    }
    Else
        Gui, % Minimize = 1 ? "Show" : "Minimize"
    Return

GuiShow:
    If (!Minimize)
        Gui, Show, NA
    Return

IsThisGui:
    MouseGetPos, , , WinID
    If (hThisGui = WinID)
    {
        IsThisGuiScript := 1
        SetTimer, IsThisGui, -20
    }
    Else
        IsThisGuiScript := 0, WinArea := ""
    Return

GuiSize:
    If A_Eventinfo = 2
        Return
    Minimize := A_Eventinfo
    If (IsStart && Minimize = 0)
        SendInput !{Esc}
    IsStart := 1
    Return

GuiClose:
GuiEscape:
    Gui Destroy
    Loop 10
        I := A_Index-1, Area%I% := ""
    ExitApp

InitConstants:
    Bank_bEn_1 := Bank_sEn_1 := Bank_sRu_1 := Bank_bRu_1 := Bank_Sym_1 := Chr_Space ".,!?%"""
    Bank_bEn_0 := Bank_sEn_0 := Bank_sRu_0 := Bank_bRu_0 := Chr_Carret "+-*:()|"
    Bank_NoBig := Bank_bEn_0 Bank_bEn_1 " `n"
    VkArr := {"Ctrl+C":"^{vk43}","Ctrl+V":"^{vk56}","Ctrl+A":"^{vk41}","Ctrl+Z":"^{vk5A}"}

    Bank_Num_1 := 1
    Bank_Num_2 := 2               , Bank_Sym_2 := "{}<>[]"
    Bank_Num_3 := 3                , Bank_Sym_3 := "+-*:=~"
    Bank_Num_4 := 4                , Bank_Sym_4 := Chr_Carret "|``&'_"
    Bank_Num_5 := 5                , Bank_Sym_5 := "()/\^#$"
    Bank_Num_6 := 6                , Bank_Sym_6 := Chr_Tab "`;@№"
    Bank_Num_7 := 7                , Bank_Sym_7 := "Ctrl+C"
    Bank_Num_8 := 8                , Bank_Sym_8 := "Ctrl+V"
    Bank_Num_9 := 9                , Bank_Sym_9 := "Ctrl+A"
    Bank_Num_0 := 0                , Bank_Sym_0 := "Ctrl+Z"

    Bank_bEn_2 := "ABC"            , Bank_sEn_2 := "abc"
    Bank_bEn_3 := "DEF"            , Bank_sEn_3 := "def"
    Bank_bEn_4 := "GHI"            , Bank_sEn_4 := "ghi"
    Bank_bEn_5 := "JKL"            , Bank_sEn_5 := "jkl"
    Bank_bEn_6 := "MNO"            , Bank_sEn_6 := "mno"
    Bank_bEn_7 := "PQRS"        , Bank_sEn_7 := "pqrs"
    Bank_bEn_8 := "TUV"            , Bank_sEn_8 := "tuv"
    Bank_bEn_9 := "WXYZ"        , Bank_sEn_9 := "wxyz"

    Bank_bRu_2 := "АБВГ"        , Bank_sRu_2 := "абвг"
    Bank_bRu_3 := "ДЕЁЖЗ"        , Bank_sRu_3 := "деёжз"
    Bank_bRu_4 := "ИЙКЛ"        , Bank_sRu_4 := "ийкл"
    Bank_bRu_5 := "МНОП"        , Bank_sRu_5 := "мноп"
    Bank_bRu_6 := "РСТУ"        , Bank_sRu_6 := "рсту"
    Bank_bRu_7 := "ФХЦЧ"        , Bank_sRu_7 := "фхцч"
    Bank_bRu_8 := "ШЩЬЫ"        , Bank_sRu_8 := "шщьы"
    Bank_bRu_9 := "ЪЭЮЯ"        , Bank_sRu_9 := "ъэюя"
    Return
    
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

9

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Трудновато разобрать, что там написано. Особенно на кнопках слева.
http://savepic.org/6395442m.png

А справа от текста, появляющегося в заголовке что за столбик? Так и должно быть или тоже что-то не отобразилось?

10

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Трудновато разобрать, что там написано.

Тут надо каждому под себя подгонять размер всего. Как видишь на моём скрине всё читаемо.
Хотя думаю что у тебя при s6 будет нормально видно:


Gui, Font, w700 s4                        ;  Параметр шрифта кнопок, из заголовка

А справа от текста, появляющегося в заголовке что за столбик? Так и должно быть или тоже что-то не отобразилось?

Ну да, это типа каретка ввода из которой лезет текст.
Вообщем надо бы мне это дело полностью в HTML закать, и желательно в один HTMLFile. И все размеры загнать в процентное соотношение.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

11 (изменено: YMP, 2014-11-09 13:57:44)

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

serzh82saratov пишет:

Как видишь на моём скрине всё читаемо.

У меня он не отображается.

Хотя думаю что у тебя при s6 будет нормально видно:

Да, s6 нормально.

12

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

У меня он не отображается.

Поправил ссылки.

Да, s6 нормально.

Тут дело в A_ScreenDPI, у меня оно - 120. Поправил код с его учётом:

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

    ;   Виртуальная 10-ти "клавишная" клавиатура
    ;   Автор - serzh82saratov
    ;   http://forum.script-coding.com/viewtopic.php?pid=88135#p88135

#UseHook
#SingleInstance Force
#NoTrayIcon
#NoEnv
SetBatchLines -1
ListLines Off
OnExit GuiClose

TrayIcon := 1                             ;  Иконка только в трее, или только на панели задач
AutoRegistr := 1                        ;  Переключать в нижний регистр, после ввода символа из верхнего

If TrayIcon
{
    Menu, Tray, Icon
    Gui, +Owner
    Menu, Tray, Click, 1
    Menu, Tray, NoStandard
    Menu, Tray, Add, Min/Max, MinMax
    Menu, Tray, Standard
    Menu, Tray, Default, Min/Max
    Menu, Tray, Disable, Min/Max
}
Menu, Tray, UseErrorLevel
Menu, Tray, Icon, Shell32.dll, 174        ;  197 | 174 | accessibilitycpl.dll, 11 | Shell32.dll, 174

Global ChrN := 0, AreaA, ThisChr, Minimize, PrArea, WinArea, PrCurBank, hThisGui, isThisGui, CapsMode

    , CurBank := "Num"                    ;  Стартовая раскладка     bRu | sRu | bEn | sEn | Num | Sym
    , TimeOut := 1500                    ;  Таймаут авто ввода символа после последнего выбора
    , BgColor := "2F4F4F"                ;  Цвет фона  2F4F4F | 2943AF | 95746A | E3C47A | FF8C00 | 9DB5CB | FFDE8A
    , ChrColor := "000000"                ;  Цвет шрифта
    , ThisChrColor := "ffffff"            ;  Цвет выбранного символа
    , CtrlColor := "FF5300"                ;  Цвет надписей кнопок "Ctrl+..."      FF5300 | 2943AF
    , FontSize := 32                    ;  Размер шрифта символов

    , IsCaptionShowStr := True            ;  Показывать ли набранный текст в заголовке     True | False
    , CaptionStrLen := 64                ;  Количество символов в заголовке
    , CaptionFontSize := 14                ;  Размер шрифта символов в заголовке
    , CaptionFontColor := ChrColor        ;  Цвет шрифта символов в заголовке

    , Chr_Tab := Chr(0x2610)            ;  Символ табуляции
    , Chr_Space := Chr(0x25af)            ;  Символ пробела
    , Chr_Carret := Chr(0x21b2)            ;  Символ переноса строки

wKey := 130                                ;  Ширина кнопки
hKey := wKey//2                            ;  Высота кнопки
HCaption := hKey//3.1                    ;  Высота заголовка
Margin := 0                                ;  Расстояние между кнопками
Gui, Font, % "w700 s" 4 + (A_ScreenDPI = 120 ? 0 : 2)        ;  Параметр шрифта кнопок, из заголовка

Gosub InitConstants
FixIE(0)

Gui, Margin, 0, 0
Gui -DPIScale +AlwaysOnTop +Lastfound -Caption +HWNDhThisGui
Gui, Color, 696969
WinSet, TransColor, 696969 225

Gui, Add, Progress, % "x0 y0 h" HCaption " w" HCaption//0.6 " BackgroundD9952F vAreaD"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor% vDel, DEL

Gui, Add, Progress, % "x+" Margin " y0 h" HCaption " w" HCaption//0.6 " Background44AD24 vAreaS"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor%, SYMB

Gui, Add, Progress, % "x+" Margin " y0 h" HCaption " w" HCaption//0.6 " BackgroundFFFF00 vAreaR"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor% vRepeat, RET

Gui, Add, ActiveX, % "Border x+" Margin " yp h" HCaption " w" (wKey*3+Margin*2)-(HCaption//0.6)*5-Margin*5 " vAreaA", HTMLFile

Gui, Add, Progress, % "x+" Margin " yp h" HCaption " w" HCaption//0.6 " vAreaM Background365DC0"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor%, TURN

Gui, Add, Progress, % "x+" Margin " yp h" HCaption " w" HCaption//0.6 " vAreaC BackgroundEC4D48"
Gui, Add, Text, Border xp yp wp hp BackgroundTrans +0x201 c%ChrColor%, CLOSE

Gui, Add, ActiveX, Border x0 y+%Margin% w%wKey% h%hKey% vArea1, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea2, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea3, HTMLFile

Gui, Add, ActiveX, Border x0 y+%Margin% hp wp vArea4, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea5, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea6, HTMLFile

Gui, Add, ActiveX, Border x0 y+%Margin% hp wp vArea7, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea8, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea9, HTMLFile

Gui, Add, ActiveX, % "Border xp-" wKey + Margin " y+" Margin " hp wp vArea0", HTMLFile

WriteHTMLCaption()
Loop 10
    WriteHTML(I := A_Index-1, Bank_%CurBank%_%I%)

WinGetPos, , Y, , , ahk_class Shell_TrayWnd ahk_exe explorer.exe
Gui, Show, % "NA xCenter y" Y - (hKey * 4) - HCaption - (Margin * 5), Virtual mini keyboard
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0xC, "WM_SETTEXT")
OnMessage(0x200, "WM_MOUSEMOVE")
SetTimer, GuiShow, 250
Return

#If (!Minimize)    ; Если окно скрипта не свёрнуто. Условие для клавиш клавиатуры.

#If IsThisGuiScript

MButton::
    If WinArea = A
        CancelInputChr(), AreaA.getElementById("caption").InnerText := captiontext := ""
    Else If WinArea is number
        ChangeRegistr()
    Return
    
RButton::
    If WinArea = A
        CancelInputChr(), AreaA.getElementById("caption").InnerText := captiontext := ""
    Else If WinArea is number
        OKinputChr()
    Return
    
WheelDown::
    If WinArea is number
        ChrN ? CancelInputChr() : ChangeBank()
    Else If WinArea = D
        Gosub DeleteChr
    Return

WheelUp::
    If WinArea is number
        NextChrMouse()
    Else If WinArea = D
        Gosub DeleteChr
    Return

#If (IsThisGuiScript && WinArea != "A")

LButton::
    If (WinArea = "S" || GetKeyState("RButton", "P"))
        ChangeSymBank()
    Else If WinArea is number
        NextChrMouse()
    Else If WinArea = D
    {
        If ChrN
            CancelInputChr()
        SendInput {BS}
        GuiControl, +c%ThisChrColor%, Del
        GuiControl, +Redraw, Del
        SetTimer, BS, -650
        KeyWait LButton
        SetTimer, BS, Off
        GuiControl, +c%ChrColor%, Del
        GuiControl, +Redraw, Del
    }
    Else If WinArea = R
    {
        If ChrN
            OKinputChr()
        ThisChr := PrThisChr
        Gosub SendChr
        GuiControl, +c%ThisChrColor%, Repeat
        GuiControl, +Redraw, Repeat
        SetTimer, Repeat, -650
        KeyWait LButton
        SetTimer, Repeat, Off
        GuiControl, +c%ChrColor%, Repeat
        GuiControl, +Redraw, Repeat
    }
    Else If WinArea = M
        Gosub MinMax
    Else If WinArea = C
        ExitApp
    Return

#If

BS:
    SendInput {BS}
    SetTimer, BS, -30
    Return

Repeat:
    ThisChr := PrThisChr
    Gosub SendChr
    SetTimer, Repeat, -30
    Return

DeleteChr:
    If ChrN
        CancelInputChr()
    SendInput {BS}
    GuiControl, +c%ThisChrColor%, Del
    GuiControl, +Redraw, Del
    SetTimer, DelDefColor, -100
    Return

DelDefColor:
    GuiControl, +c%ChrColor%, Del
    GuiControl, +Redraw, Del
    Return

WM_SETTEXT(wParam, lParam, msg, hwnd) {        ; Для управления сообщениями
    Str := StrGet(lParam)                    ; SendMessage, 0xC, , "ChangeBank", , #Input_Num_Text# ahk_class AutoHotkeyGUI
    If Str = NextChr                        ; SendMessage, 0xC, 3, "NextChr", , #Input_Num_Text# ahk_class AutoHotkeyGUI
        NextChr(wParam)
    Else If IsFunc(Str)
        %Str%()
    Return True
}

WM_LBUTTONDOWN()   {      ; Перетаскивание окна
    If WinArea = A
    {
        PostMessage, 0xA1, 2
        KeyWait LButton
        IfWinActive
            SendInput !{Esc}
    }
}

WM_MOUSEMOVE()   {
    WinArea := SubStr(A_GuiControl, 0)
    SetTimer, IsThisGui, -10
}

ChangeSymBank()  {
    ChangeBank(CurBank = "Sym" ? PrCurBank : "Sym")
}

ChangeBank(Bank = "")  {
    SetTimer, SendChr, Off
    ThisChr := "", ChrN := 0, PrCurBank := CurBank
    If Bank
        CurBank := Bank
    Else If CapsMode
        CurBank := CurBank ~= "Num|Sym" ? "bRu"
                : CurBank = "bRu" ? "bEn"
                : CurBank = "bEn" ? "Num"
                : CurBank
    Else
        CurBank := CurBank ~= "Num|Sym" ? "sRu"
                : CurBank = "sRu" ? "sEn"
                : CurBank = "sEn" ? "Num"
                : CurBank
    Loop 10
        WriteHTML(I := A_Index-1, Bank_%CurBank%_%I%)
}

ChangeRegistr()  {
    OKinputChr(), ThisChr := "", ChrN := 0
    CurBank := CurBank = "sRu" ? "bRu"
            : CurBank = "bRu" ? "sRu"
            : CurBank = "bEn" ? "sEn"
            : CurBank = "sEn" ? "bEn"
            : CurBank = "Sym" ? "Num"
            : CurBank = "Num" ? "Sym"
            : CurBank
    CapsMode := CurBank ~= "bRu|bEn" ? 1
        : CurBank ~= "sEn|sRu" ? 0 : CapsMode
    Loop 10
        WriteHTML(I := A_Index-1, Bank_%CurBank%_%I%)
}

NextChrMouse()  {
    If (WinArea != "")
        NextChr(WinArea)
}

NextChr(Area)  {
    If (PrArea != Area)
        WriteHTML(PrArea, Bank_%CurBank%_%PrArea%)
        , PrArea := Area, OKinputChr()
    str := Bank_%CurBank%_%Area%
    ChrN := ChrN = StrLen(str) ? 1 : ChrN+1
    p1 := SubStr(Str, 1, ChrN-1)
    ThisChr := SubStr(Str, ChrN, 1)
    p2 := SubStr(Str, ChrN+1)
    If (CurBank = "Sym" && InStr(str, "Ctrl+"))
        p1 := p2 := "", ThisChr := str
    WriteHTML( Area, p1, ThisChr, p2)
    SetTimer, SendChr, % (p1 = "" && p2 = "") ? -20 : -TimeOut
}

SendChr:
    If (ThisChr = "")
        Return
    PrThisChr := ThisChr
    SendChr := ThisChr = Chr_Carret ? "`n" : ThisChr = Chr_Space ? " "
            : ThisChr = Chr_Tab ? A_Tab : ThisChr
    If StrLen(ThisChr) > 1
        SendInput % VkArr[ThisChr] (SendChr := "")
    Else
        SendInput {Raw}%SendChr%

    ThisChr := "", ChrN := 0
    Area%PrArea%.getElementById("ThisChr").style.color := SendChr != "" ? ChrColor : CtrlColor

    If (IsCaptionShowStr && SendChr != "")
    {
        captiontext .= SendChr = "`n" ? Chr_Carret : SendChr = A_Tab ? "    " : SendChr
        captiontext := SubStr(captiontext, -CaptionStrLen)
        AreaA.getElementById("caption").InnerText := captiontext "|"  
    }

    If (AutoRegistr && ((CurBank = "bRu" || CurBank = "bEn") && !InStr(Bank_NoBig, SendChr)))
        ChangeRegistr()
    Return

OKinputChr()  {
    SetTimer, SendChr, Off
    Gosub SendChr
}

CancelInputChr()  {
    SetTimer, SendChr, Off
    ThisChr := "", ChrN := 0
    Area%PrArea%.getElementById("ThisChr").style.color := ChrColor
}

WriteHTML(Area, p1, ThisChr = "", p2 = "")  {
    sizefont := CurBank = "Num" ? fontsize*1.4
        : (Area > 1) && (CurBank = "sRu" || CurBank = "sEn") ? fontsize*1.2 : fontsize
    colorchr := (CurBank = "Sym") && (Area > 6 || Area = 0) ? CtrlColor : ChrColor

    html =
    ( c
    <body onselectstart='return false' oncontextmenu='return false'>
    <div>%p1%<span id='ThisChr'>%ThisChr%</span>%p2%</div>
    </body>
    <style>
    body {background-color: '#%bgcolor%'; cursor: 'pointer'; overflow: 'hidden';}
    #ThisChr {color: '%ThisChrColor%';}
    div {text-align: 'center'; color: '%colorchr%'; font-size: '%sizefont%';
    font-family: 'Arial';    position: 'relative'; top: '-0.11em'}
    </style>
    )
    Area%Area%.body.innerHTML := html
}

WriteHTMLCaption()   {
    html =
    ( c
    <body onselectstart='return false' oncontextmenu='return false'>
    <p id="caption">&nbsp;</p>
    </body>
    <style>
    body {background-color: '#%bgcolor%'; cursor: 'move'; overflow: 'hidden';}
    #caption {position: 'absolute'; right: '15px'; top: '1px';
    color: '%CaptionFontColor%'; white-space: 'nowrap';
    text-align: 'right'; font-size: '%CaptionFontSize%';}
    </style>
    )
    AreaA.body.innerHTML := html
}

FixIE(Fix)  {
    Static Key := "Software\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION"
    If A_IsCompiled
        ExeName := A_ScriptName
    Else
        SplitPath, A_AhkPath, ExeName
    If Fix
        RegWrite, REG_DWORD, HKCU, %Key%, %ExeName%, 0
    Else
        RegDelete, HKCU, %Key%, %ExeName%
}

MinMax:
    If TrayIcon
    {
        Minimize := !DllCall("IsWindowVisible", "Ptr", hThisGui)
        Gui, Show, % Minimize ? "NA" : "Hide"
        SetTimer, GuiShow, % (Minimize := !Minimize) ? "Off" : "On"
        If !Minimize
            SendInput !{Esc}
        Else
            CancelInputChr()
    }
    Else
        Gui, % Minimize = 1 ? "Show" : "Minimize"
    Return

GuiShow:
    If (!Minimize)
        Gui, Show, NA
    Return

IsThisGui:
    MouseGetPos, , , WinID
    If (hThisGui = WinID)
    {
        IsThisGuiScript := 1
        SetTimer, IsThisGui, -20
    }
    Else
        IsThisGuiScript := 0, WinArea := ""
    Return

GuiSize:
    If A_Eventinfo = 2
        Return
    Minimize := A_Eventinfo
    If (IsStart && Minimize = 0)
        SendInput !{Esc}
    IsStart := 1
    Return

GuiClose:
GuiEscape:
    Gui Destroy
    Loop 10
        I := A_Index-1, Area%I% := ""
    ExitApp

InitConstants:
    Bank_bEn_1 := Bank_sEn_1 := Bank_sRu_1 := Bank_bRu_1 := Bank_Sym_1 := Chr_Space ".,!?%"""
    Bank_bEn_0 := Bank_sEn_0 := Bank_sRu_0 := Bank_bRu_0 := Chr_Carret "+-*:()|"
    Bank_NoBig := Bank_bEn_0 Bank_bEn_1 " `n"
    VkArr := {"Ctrl+C":"^{vk43}","Ctrl+V":"^{vk56}","Ctrl+A":"^{vk41}","Ctrl+Z":"^{vk5A}"}

    Bank_Num_1 := 1
    Bank_Num_2 := 2               , Bank_Sym_2 := "{}<>[]"
    Bank_Num_3 := 3                , Bank_Sym_3 := "+-*:=~"
    Bank_Num_4 := 4                , Bank_Sym_4 := Chr_Carret "|``&'_"
    Bank_Num_5 := 5                , Bank_Sym_5 := "()/\^#$"
    Bank_Num_6 := 6                , Bank_Sym_6 := Chr_Tab "`;@№"
    Bank_Num_7 := 7                , Bank_Sym_7 := "Ctrl+C"
    Bank_Num_8 := 8                , Bank_Sym_8 := "Ctrl+V"
    Bank_Num_9 := 9                , Bank_Sym_9 := "Ctrl+A"
    Bank_Num_0 := 0                , Bank_Sym_0 := "Ctrl+Z"

    Bank_bEn_2 := "ABC"            , Bank_sEn_2 := "abc"
    Bank_bEn_3 := "DEF"            , Bank_sEn_3 := "def"
    Bank_bEn_4 := "GHI"            , Bank_sEn_4 := "ghi"
    Bank_bEn_5 := "JKL"            , Bank_sEn_5 := "jkl"
    Bank_bEn_6 := "MNO"            , Bank_sEn_6 := "mno"
    Bank_bEn_7 := "PQRS"        , Bank_sEn_7 := "pqrs"
    Bank_bEn_8 := "TUV"            , Bank_sEn_8 := "tuv"
    Bank_bEn_9 := "WXYZ"        , Bank_sEn_9 := "wxyz"

    Bank_bRu_2 := "АБВГ"        , Bank_sRu_2 := "абвг"
    Bank_bRu_3 := "ДЕЁЖЗ"        , Bank_sRu_3 := "деёжз"
    Bank_bRu_4 := "ИЙКЛ"        , Bank_sRu_4 := "ийкл"
    Bank_bRu_5 := "МНОП"        , Bank_sRu_5 := "мноп"
    Bank_bRu_6 := "РСТУ"        , Bank_sRu_6 := "рсту"
    Bank_bRu_7 := "ФХЦЧ"        , Bank_sRu_7 := "фхцч"
    Bank_bRu_8 := "ШЩЬЫ"        , Bank_sRu_8 := "шщьы"
    Bank_bRu_9 := "ЪЭЮЯ"        , Bank_sRu_9 := "ъэюя"
    Return
    
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

13

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Да, теперь нормально и скриншот, и шрифт.

14

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Добавил - "Относительный размер клавиатуры" 32 строка.

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


    ;   Виртуальная 10-ти "клавишная" клавиатура
    ;   Автор - serzh82saratov
    ;   http://forum.script-coding.com/viewtopic.php?pid=88135#p88135

#UseHook
#SingleInstance Force
#NoTrayIcon
#NoEnv
SetBatchLines -1
ListLines Off
OnExit GuiClose

TrayIcon := 1                             ;  Иконка только в трее, или только на панели задач
AutoRegistr := 1                        ;  Переключать в нижний регистр, после ввода символа из верхнего

If TrayIcon
{
    Menu, Tray, Icon
    Gui, +Owner
    Menu, Tray, Click, 1
    Menu, Tray, NoStandard
    Menu, Tray, Add, Min/Max, MinMax
    Menu, Tray, Standard
    Menu, Tray, Default, Min/Max
    Menu, Tray, Disable, Min/Max
}
Menu, Tray, UseErrorLevel
Menu, Tray, Icon, Shell32.dll, 174        ;  197 | 174 | accessibilitycpl.dll, 11 | Shell32.dll, 174
Global ChrN := 0, AreaA, ThisChr, Minimize, PrArea, WinArea, PrCurBank, hThisGui, isThisGui, CapsMode

    , Rel := 1.0                        ; Относительный размер клавиатуры
    , CurBank := "Num"                    ;  Стартовая раскладка     bRu | sRu | bEn | sEn | Num | Sym
    , TimeOut := 1500                    ;  Таймаут авто ввода символа после последнего выбора
    , BgColor := "2F4F4F"                ;  Цвет фона  2F4F4F | 2943AF | 95746A | E3C47A | FF8C00 | 9DB5CB | FFDE8A
    , ChrColor := "000000"                ;  Цвет шрифта
    , ThisChrColor := "ffffff"            ;  Цвет выбранного символа
    , CtrlColor := "FF5300"                ;  Цвет надписей кнопок "Ctrl+..."      FF5300 | 2943AF
    , FontSize := 32 * Rel                    ;  Размер шрифта символов

    , IsCaptionShowStr := True            ;  Показывать ли набранный текст в заголовке     True | False
    , CaptionStrLen := 64                ;  Количество символов в заголовке
    , CaptionFontSize := 14 * Rel                ;  Размер шрифта символов в заголовке
    , CaptionFontColor := ThisChrColor        ;  Цвет шрифта символов в заголовке

    , Chr_Tab := Chr(0x2610)            ;  Символ табуляции
    , Chr_Space := Chr(0x25af)            ;  Символ пробела
    , Chr_Carret := Chr(0x21b2)            ;  Символ переноса строки

wKey := 130 * Rel                                ;  Ширина кнопки
hKey := wKey//2                            ;  Высота кнопки
HCaption := hKey//3.1                    ;  Высота заголовка
Margin := 0                                ;  Расстояние между кнопками
Gui, Font, % "w700 s" (4 + (A_ScreenDPI = 120 ? 0 : 2)) * Rel        ;  Параметр шрифта кнопок, из заголовка

Gosub InitConstants
FixIE(0)

Gui, Margin, 0, 0
Gui -DPIScale +AlwaysOnTop +Lastfound -Caption +HWNDhThisGui
Gui, Color, 696969
WinSet, TransColor, 696969 225

Gui, Add, Progress, % "x0 y0 h" HCaption " w" HCaption//0.6 " BackgroundD9952F vAreaD"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor% vDel, DEL

Gui, Add, Progress, % "x+" Margin " y0 h" HCaption " w" HCaption//0.6 " Background44AD24 vAreaS"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor%, SYMB

Gui, Add, Progress, % "x+" Margin " y0 h" HCaption " w" HCaption//0.6 " BackgroundFFFF00 vAreaR"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor% vRepeat, RET

Gui, Add, ActiveX, % "Border x+" Margin " yp h" HCaption " w" (wKey*3+Margin*2)-(HCaption//0.6)*5-Margin*5 " vAreaA", HTMLFile

Gui, Add, Progress, % "x+" Margin " yp h" HCaption " w" HCaption//0.6 " vAreaM Background365DC0"
Gui, Add, Text, Border xp yp hp wp BackgroundTrans +0x201 c%ChrColor%, TURN

Gui, Add, Progress, % "x+" Margin " yp h" HCaption " w" HCaption//0.6 " vAreaC BackgroundEC4D48"
Gui, Add, Text, Border xp yp wp hp BackgroundTrans +0x201 c%ChrColor%, CLOSE

Gui, Add, ActiveX, Border x0 y+%Margin% w%wKey% h%hKey% vArea1, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea2, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea3, HTMLFile

Gui, Add, ActiveX, Border x0 y+%Margin% hp wp vArea4, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea5, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea6, HTMLFile

Gui, Add, ActiveX, Border x0 y+%Margin% hp wp vArea7, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea8, HTMLFile
Gui, Add, ActiveX, Border x+%Margin% hp wp vArea9, HTMLFile

Gui, Add, ActiveX, % "Border xp-" wKey + Margin " y+" Margin " hp wp vArea0", HTMLFile

WriteHTMLCaption()
Loop 10
    WriteHTML(I := A_Index-1, Bank_%CurBank%_%I%)
    
WinGetPos, , Y, , , ahk_class Shell_TrayWnd ahk_exe explorer.exe
Gui, Show, % "NA xCenter y" Y - (hKey * 4) - HCaption - (Margin * 5), Virtual mini keyboard
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0xC, "WM_SETTEXT")
OnMessage(0x200, "WM_MOUSEMOVE")
SetTimer, GuiShow, 250
Return

#If (!Minimize)    ; Если окно скрипта не свёрнуто. Условие для клавиш клавиатуры.

#If IsThisGuiScript

MButton::
    If WinArea = A
        CancelInputChr(), AreaA.getElementById("caption").InnerText := captiontext := ""
    Else If WinArea is number
        ChangeRegistr()
    Return
    
RButton::
    If WinArea = A
        CancelInputChr(), AreaA.getElementById("caption").InnerText := captiontext := ""
    Else If WinArea is number
        OKinputChr()
    Return
    
WheelDown::
    If WinArea is number
        ChrN ? CancelInputChr() : ChangeBank()
    Else If WinArea = D
        Gosub DeleteChr
    Return

WheelUp::
    If WinArea is number
        NextChrMouse()
    Else If WinArea = D
        Gosub DeleteChr
    Return

#If (IsThisGuiScript && WinArea != "A")

LButton::
    If (WinArea = "S" || GetKeyState("RButton", "P"))
        ChangeSymBank()
    Else If WinArea is number
        NextChrMouse()
    Else If WinArea = D
    {
        If ChrN
            CancelInputChr()
        SendInput {BS}
        GuiControl, +c%ThisChrColor%, Del
        GuiControl, +Redraw, Del
        SetTimer, BS, -650
        KeyWait LButton
        SetTimer, BS, Off
        GuiControl, +c%ChrColor%, Del
        GuiControl, +Redraw, Del
    }
    Else If WinArea = R
    {
        If ChrN
            OKinputChr()
        ThisChr := PrThisChr
        Gosub SendChr
        GuiControl, +c%ThisChrColor%, Repeat
        GuiControl, +Redraw, Repeat
        SetTimer, Repeat, -650
        KeyWait LButton
        SetTimer, Repeat, Off
        GuiControl, +c%ChrColor%, Repeat
        GuiControl, +Redraw, Repeat
    }
    Else If WinArea = M
        Gosub MinMax
    Else If WinArea = C
        ExitApp
    Return

#If

BS:
    SendInput {BS}
    SetTimer, BS, -30
    Return

Repeat:
    ThisChr := PrThisChr
    Gosub SendChr
    SetTimer, Repeat, -30
    Return

DeleteChr:
    If ChrN
        CancelInputChr()
    SendInput {BS}
    GuiControl, +c%ThisChrColor%, Del
    GuiControl, +Redraw, Del
    SetTimer, DelDefColor, -100
    Return

DelDefColor:
    GuiControl, +c%ChrColor%, Del
    GuiControl, +Redraw, Del
    Return

WM_SETTEXT(wParam, lParam, msg, hwnd) {        ; Для управления сообщениями
    Str := StrGet(lParam)                    ; SendMessage, 0xC, , "ChangeBank", , #Input_Num_Text# ahk_class AutoHotkeyGUI
    If Str = NextChr                        ; SendMessage, 0xC, 3, "NextChr", , #Input_Num_Text# ahk_class AutoHotkeyGUI
        NextChr(wParam)
    Else If IsFunc(Str)
        %Str%()
    Return True
}

WM_LBUTTONDOWN()   {      ; Перетаскивание окна
    If WinArea = A
    {
        PostMessage, 0xA1, 2
        KeyWait LButton
        IfWinActive
            SendInput !{Esc}
    }
}

WM_MOUSEMOVE()   {
    WinArea := SubStr(A_GuiControl, 0)
    SetTimer, IsThisGui, -10
}

ChangeSymBank()  {
    ChangeBank(CurBank = "Sym" ? PrCurBank : "Sym")
}

ChangeBank(Bank = "")  {
    SetTimer, SendChr, Off
    ThisChr := "", ChrN := 0, PrCurBank := CurBank
    If Bank
        CurBank := Bank
    Else If CapsMode
        CurBank := CurBank ~= "Num|Sym" ? "bRu"
                : CurBank = "bRu" ? "bEn"
                : CurBank = "bEn" ? "Num"
                : CurBank
    Else
        CurBank := CurBank ~= "Num|Sym" ? "sRu"
                : CurBank = "sRu" ? "sEn"
                : CurBank = "sEn" ? "Num"
                : CurBank
    Loop 10
        WriteHTML(I := A_Index-1, Bank_%CurBank%_%I%)
}

ChangeRegistr()  {
    OKinputChr(), ThisChr := "", ChrN := 0
    CurBank := CurBank = "sRu" ? "bRu"
            : CurBank = "bRu" ? "sRu"
            : CurBank = "bEn" ? "sEn"
            : CurBank = "sEn" ? "bEn"
            : CurBank = "Sym" ? "Num"
            : CurBank = "Num" ? "Sym"
            : CurBank
    CapsMode := CurBank ~= "bRu|bEn" ? 1
        : CurBank ~= "sEn|sRu" ? 0 : CapsMode
    Loop 10
        WriteHTML(I := A_Index-1, Bank_%CurBank%_%I%)
}

NextChrMouse()  {
    If (WinArea != "")
        NextChr(WinArea)
}

NextChr(Area)  {
    If (PrArea != Area)
        WriteHTML(PrArea, Bank_%CurBank%_%PrArea%)
        , PrArea := Area, OKinputChr()
    str := Bank_%CurBank%_%Area%
    ChrN := ChrN = StrLen(str) ? 1 : ChrN+1
    p1 := SubStr(Str, 1, ChrN-1)
    ThisChr := SubStr(Str, ChrN, 1)
    p2 := SubStr(Str, ChrN+1)
    If (CurBank = "Sym" && InStr(str, "Ctrl+"))
        p1 := p2 := "", ThisChr := str
    WriteHTML( Area, p1, ThisChr, p2)
    SetTimer, SendChr, % (p1 = "" && p2 = "") ? -20 : -TimeOut
}

SendChr:
    If (ThisChr = "")
        Return
    PrThisChr := ThisChr
    SendChr := ThisChr = Chr_Carret ? "`n" : ThisChr = Chr_Space ? " "
            : ThisChr = Chr_Tab ? A_Tab : ThisChr
    If StrLen(ThisChr) > 1
        SendInput % VkArr[ThisChr] (SendChr := "")
    Else
        SendInput {Raw}%SendChr%

    ThisChr := "", ChrN := 0
    Area%PrArea%.getElementById("ThisChr").style.color := SendChr != "" ? ChrColor : CtrlColor

    If (IsCaptionShowStr && SendChr != "")
    {
        captiontext .= SendChr = "`n" ? Chr_Carret : SendChr = A_Tab ? "    " : SendChr
        captiontext := SubStr(captiontext, -CaptionStrLen)
        AreaA.getElementById("caption").InnerText := captiontext "|"  
    }

    If (AutoRegistr && ((CurBank = "bRu" || CurBank = "bEn") && !InStr(Bank_NoBig, SendChr)))
        ChangeRegistr()
    Return

OKinputChr()  {
    SetTimer, SendChr, Off
    Gosub SendChr
}

CancelInputChr()  {
    SetTimer, SendChr, Off
    ThisChr := "", ChrN := 0
    Area%PrArea%.getElementById("ThisChr").style.color := ChrColor
}

WriteHTML(Area, p1, ThisChr = "", p2 = "")  {
    sizefont := CurBank = "Num" ? fontsize*1.4
        : (Area > 1) && (CurBank = "sRu" || CurBank = "sEn") ? fontsize*1.2 : fontsize
    colorchr := (CurBank = "Sym") && (Area > 6 || Area = 0) ? CtrlColor : ChrColor

    html =
    ( c
    <body onselectstart='return false' oncontextmenu='return false'>
    <div>%p1%<span id='ThisChr'>%ThisChr%</span>%p2%</div>
    </body>
    <style>
    body {background-color: '#%bgcolor%'; cursor: 'pointer'; overflow: 'hidden';}
    #ThisChr {color: '%ThisChrColor%';}
    div {text-align: 'center'; color: '%colorchr%'; font-size: '%sizefont%';
    font-family: 'Arial';    position: 'relative'; top: '-0.11em'}
    </style>
    )
    Area%Area%.body.innerHTML := html
}

WriteHTMLCaption()   {
    html =
    ( c
    <body onselectstart='return false' oncontextmenu='return false'>
    <p id="caption">&nbsp;</p>
    </body>
    <style>
    body {background-color: '#%bgcolor%'; cursor: 'move'; overflow: 'hidden';}
    #caption {position: 'absolute'; right: '15px'; top: '1px';
    color: '%CaptionFontColor%'; white-space: 'nowrap';
    text-align: 'right'; font-size: '%CaptionFontSize%';}
    </style>
    )
    AreaA.body.innerHTML := html
}

FixIE(Fix)  {
    Static Key := "Software\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION"
    If A_IsCompiled
        ExeName := A_ScriptName
    Else
        SplitPath, A_AhkPath, ExeName
    If Fix
        RegWrite, REG_DWORD, HKCU, %Key%, %ExeName%, 0
    Else
        RegDelete, HKCU, %Key%, %ExeName%
}

MinMax:
    If TrayIcon
    {
        Minimize := !DllCall("IsWindowVisible", "Ptr", hThisGui)
        Gui, Show, % Minimize ? "NA" : "Hide"
        SetTimer, GuiShow, % (Minimize := !Minimize) ? "Off" : "On"
        If !Minimize
            SendInput !{Esc}
        Else
            CancelInputChr()
    }
    Else
        Gui, % Minimize = 1 ? "Show" : "Minimize"
    Return

GuiShow:
    If (!Minimize)
        Gui, Show, NA
    Return

IsThisGui:
    MouseGetPos, , , WinID
    If (hThisGui = WinID)
    {
        IsThisGuiScript := 1
        SetTimer, IsThisGui, -20
    }
    Else
        IsThisGuiScript := 0, WinArea := ""
    Return

GuiSize:
    If A_Eventinfo = 2
        Return
    Minimize := A_Eventinfo
    If (IsStart && Minimize = 0)
        SendInput !{Esc}
    IsStart := 1
    Return

GuiClose:
GuiEscape:
    Gui Destroy
    Loop 10
        I := A_Index-1, Area%I% := ""
    ExitApp

InitConstants:
    Bank_bEn_1 := Bank_sEn_1 := Bank_sRu_1 := Bank_bRu_1 := Bank_Sym_1 := Chr_Space ".,!?%"""
    Bank_bEn_0 := Bank_sEn_0 := Bank_sRu_0 := Bank_bRu_0 := Chr_Carret "+-*:()|"
    Bank_NoBig := Bank_bEn_0 Bank_bEn_1 " `n"
    VkArr := {"Ctrl+C":"^{vk43}","Ctrl+V":"^{vk56}","Ctrl+A":"^{vk41}","Ctrl+Z":"^{vk5A}"}

    Bank_Num_1 := 1
    Bank_Num_2 := 2               , Bank_Sym_2 := "{}<>[]"
    Bank_Num_3 := 3                , Bank_Sym_3 := "+-*:=~"
    Bank_Num_4 := 4                , Bank_Sym_4 := Chr_Carret "|``&'_"
    Bank_Num_5 := 5                , Bank_Sym_5 := "()/\^#$"
    Bank_Num_6 := 6                , Bank_Sym_6 := Chr_Tab "`;@№"
    Bank_Num_7 := 7                , Bank_Sym_7 := "Ctrl+C"
    Bank_Num_8 := 8                , Bank_Sym_8 := "Ctrl+V"
    Bank_Num_9 := 9                , Bank_Sym_9 := "Ctrl+A"
    Bank_Num_0 := 0                , Bank_Sym_0 := "Ctrl+Z"

    Bank_bEn_2 := "ABC"            , Bank_sEn_2 := "abc"
    Bank_bEn_3 := "DEF"            , Bank_sEn_3 := "def"
    Bank_bEn_4 := "GHI"            , Bank_sEn_4 := "ghi"
    Bank_bEn_5 := "JKL"            , Bank_sEn_5 := "jkl"
    Bank_bEn_6 := "MNO"            , Bank_sEn_6 := "mno"
    Bank_bEn_7 := "PQRS"        , Bank_sEn_7 := "pqrs"
    Bank_bEn_8 := "TUV"            , Bank_sEn_8 := "tuv"
    Bank_bEn_9 := "WXYZ"        , Bank_sEn_9 := "wxyz"

    Bank_bRu_2 := "АБВГ"        , Bank_sRu_2 := "абвг"
    Bank_bRu_3 := "ДЕЁЖЗ"        , Bank_sRu_3 := "деёжз"
    Bank_bRu_4 := "ИЙКЛ"        , Bank_sRu_4 := "ийкл"
    Bank_bRu_5 := "МНОП"        , Bank_sRu_5 := "мноп"
    Bank_bRu_6 := "РСТУ"        , Bank_sRu_6 := "рсту"
    Bank_bRu_7 := "ФХЦЧ"        , Bank_sRu_7 := "фхцч"
    Bank_bRu_8 := "ШЩЬЫ"        , Bank_sRu_8 := "шщьы"
    Bank_bRu_9 := "ЪЭЮЯ"        , Bank_sRu_9 := "ъэюя"
    Return
    

Не мог бы Ты скинуть свой скриншот раскладки символов, это та что включается при нажатии "SYMB".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

15

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

http://savepic.org/6359623m.png

16

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

YMP пишет:

Часть кнопок в заголовке не отображаются, я так понимаю (на Win7 SP1 x64).

А если на твоём компьютере в блокнот (в код) скопировать эти символы  © ®, отсюда например. Они у тебя будут отображатся?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

17

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

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

18

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Ну а их если скопировать? ? - &larr; ? - &times;

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

19

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

В Блокноте их видно.

20

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Вот оно!
http://savepic.org/6486459m.png

Указал шрифт Times New Roman, для крестика взял код 0xD7 и размер шрифта конкретно для него s12. Имеется в виду первоначальный вариант скрипта.

21

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Ну на конкретном ПК всегда можно допилить, но правильнее - чтобы без доработок.
Ради интереса пытаюсь сделать (как обещался) версию на базе одного HTMLFile. Возможно что символы из "гарантированного набора" HTML будут отображатся везде одинаково.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

22

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

На XP SP2 тоже отображаются.

23 (изменено: serzh82saratov, 2014-11-16 22:21:43)

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Сделал новую версию на базе одного HTMLFile.
Свернуть и закрыть это символы HTML, остальные три кнопки решил оставить надписями, прошлые символы посчитал не в тему.



    ;   Виртуальная 10-ти "клавишная" клавиатура
    ;   Автор - serzh82saratov
    ;   http://forum.script-coding.com/viewtopic.php?pid=88135#p88135

#UseHook
#SingleInstance Force
#NoTrayIcon
#NoEnv
#HotkeyInterval 0
SetBatchLines -1
ListLines Off
OnExit GuiClose
FixIE(0)

Global Relative := 1        ; Относительный размер клавиатуры. Например: "1.2" = +20%
, Bank := "bRu"                ; Стартовая раскладка  -  sRu | bRu | sEn | bEn | Emb | Num
, TimeOut := 1500            ; Таймаут авто ввода символа после последнего выбора
, TrayIcon := 1                ; Иконка только в трее, или только на панели задач
, AutoRegistr := 1            ; Переключать в нижний регистр, после ввода символа из верхнего
, cBg := "2F4F4F"            ; Цвет фона
, cBorder := "767676"        ; Цвет окантовки клавиш
, sBorder := 1                ; Толщина окантовки клавиш
, cChr := "000000"            ; Цвет шрифта
, cSel := "ffffff"            ; Цвет шрифта выбранного символа
, cCtrl := "D9952F"            ; Цвет шрифта кнопок "Ctrl+..."
, wKey := 130 * Relative
, hKey := wKey//2
, hCap := hKey//3

Menu, Tray, UseErrorLevel
Menu, Tray, Icon, Shell32.dll, 174
If TrayIcon
{
    Menu, Tray, Icon
    Menu, Tray, Click, 1
    Menu, Tray, NoStandard
    Menu, Tray, Add, Min/Max, MinMax
    Menu, Tray, Standard
    Menu, Tray, Default, Min/Max
    Menu, Tray, Disable, Min/Max
    Gui, +Owner
}
GoSub Init
Gui, Margin, 0, 0
Gui, -DPIScale -Caption +Lastfound +AlwaysOnTop +HWNDhThisGui
Gui, Add, ActiveX, % "voDoc w" wKey*3 " h" hKey*4+hCap, HTMLFile
oDoc.body.innerHTML := html
Loop 10
    (elem := oDoc.getElementById("p" A_Index)).style.top := [0,0,0,hKey,hKey,hKey,hKey*2,hKey*2,hKey*2,hKey*3][A_Index] + hCap . "px"
    , elem.style.left := [0,wKey,wKey*2,0,wKey,wKey*2,0,wKey,wKey*2,wKey][A_Index] . "px"
WinSet, Region, % "0-0 " wKey*3 "-0 " wKey*3 "-" (t := hKey*3+hCap) " 0-" t " 0-0 "
    . wKey "-" t " " wKey*2 "-" t " " wKey*2 "-" t+hKey " " wKey "-" t+hKey " " wKey "-" t
WinSet, Transparent, 225
OnMessage(0x201, "WM_LBUTTONDOWN"), OnMessage(0xC, "WM_SETTEXT"), OnMessage(0x200, "WM_MOUSEMOVE")
ComObjError(false), Layout(Bank)
WinGetPos, , Y, , , ahk_class Shell_TrayWnd ahk_exe explorer.exe
Gui, Show, % "NA xCenter y" Y - (hKey * 4) - hCap - 1, Virtual mini keyboard
SetTimer, OnTop, 500
Return

    ; _________________________________________________ HotKey _________________________________________________

#If (!Minimize)    ; Если окно скрипта не свёрнуто. Условие для клавиш клавиатуры.

#If IsGuiScript

*WheelDown::
    If Area is number
        Chr.P ? InputCancel() : ChangeBank()
    Return

*WheelUp::
    If Area is number
        NextChr(Area)
    Return

*MButton:: (Chr.P ? Input(1) : 0), ChangeRegistr()

*RButton::
    If Area is number
        Chr.P ? Input() : 0
    Else If Area = Caption
        InputCancel(), oDoc.getElementById("viewinput").InnerText := "", ViewInput := ""
    Return

#If (IsGuiScript && Area != "Caption")

*LButton::
    If (Area = "Sym" || GetKeyState("RButton", "P"))
        InputCancel(), Layout(Bank = "Emb" ? PrBank : "Emb")
    Else If Area is number
        NextChr(Area)
    Else If Area = Del
        Chr.P ? InputCancel() : ClickKey()
    Else If Area = Ret
        ClickKey()
    Else If Area = Turn
        Gosub MinMax
    Else If Area = Close
        ExitApp
    Return

#If

    ; _________________________________________________ Logic _________________________________________________

Layout(b)  {
    Loop 10
        (elem := oDoc.getElementById("p" A_Index)).innerHTML := Ins[b "_" A_Index]
        , elem.style.fontSize := Param[t := Type[b "_" A_Index]][1] . "px"
        , elem.style.paddingTop := Param[t][2] . "em", elem.style.color := Param[t][3]
    PrBank := Bank, Bank := b, Chr.P := ""
    Caps := (t := SubStr(Bank, 1, 1)) = "b" ? 1 : t = "s" ? 0 : Caps
}

ChangeBank()  {
    Layout(Caps ? {"bRu":"bEn","bEn":"Num","Emb":"bRu","Num":"bRu"}[Bank]
        : {"sRu":"sEn","sEn":"Num","Emb":"sRu","Num":"sRu"}[Bank])
}

ChangeRegistr()  {
    Layout({"sRu":"bRu","bRu":"sRu","sEn":"bEn","bEn":"sEn","Emb":"Num","Num":"Emb"}[Bank])
}

NextChr(A)  {
    Chr.E.style.color := Chr.Color
    Chr.P && Chr.P != A ? Input() : 0
    Chr.C := (Chr.P = A ? (++Chr.C > Bank_%Bank%[A].maxindex() ? 1 : Chr.C) : 1)
    Chr.P := A, Chr.Color := Param[t := Type[Bank "_" Chr.P]][3]
    SetTimer, Input, % t = "ctrl" || t = "num" ? -30 : "-" TimeOut
    (Chr.E := oDoc.getElementById("p" Chr.P "c" Chr.C)).style.color := cSel
    Chr.S := Bank_%Bank%[Chr.P][Chr.C]
}

Input(user=0)  {
    SetTimer, Input, Off
    Chr.E.style.color := Chr.Color
    Send((Ex := Send_Exception[Chr.S]) = "" ? "{Raw}" Chr.S : Ex)
    add := Ex = "" ? Chr.S : !InStr(Ex, "{Raw}") ? "" : Chr.E.InnerText
    oDoc.getElementById("viewinput").InnerText := (ViewInput := SubStr(ViewInput add, -96)) . (ViewInput != "" ? "|" : "")
    (AutoRegistr && !user && (Bank = "bEn" || Bank = "bRu") && Chr.P) ? ChangeRegistr() : 0, Chr.P := ""
}

Input:
    Input()
    Return

InputCancel()  {
    SetTimer, Input, Off
    Chr.E.style.color := Chr.Color, Chr.P := ""
}

Send(k)  {
    SendInput %k%
}

ClickKey()  {
    Static Key
    Key := Area
    (Key = "Del" ? Send("{BS}") : Input())
    SetTimer, ClickKey, -650
    oDoc.getElementById(Key).style.color := cSel
    KeyWait LButton
    SetTimer, ClickKey, Off
    oDoc.getElementById(Key).style.color := cChr
    Return

    ClickKey:
        (Key = "Del" ? Send("{BS}") : Input())
        SetTimer, ClickKey, -30
        Return
}

    ; _________________________________________________ Window _________________________________________________

WM_MOUSEMOVE(wp, lp) {
    Area := ((n := (e := oDoc.elementFromPoint(lp & 0xFFFF, lp >> 16)).name) = "child" ? e.parentelement.name : n)
    PrArea = Area ? 0 : (PrArea := Area)
    SetTimer, IsThisGui, -30
}

IsThisGui:
    MouseGetPos, , , WinID
    If (hThisGui = WinID && (IsGuiScript := 1))
        SetTimer, IsThisGui, -50
    Else
        Area := PrArea := Chr.P := "", IsGuiScript := 0
    Return

OnTop:
    If (!Minimize)
        Gui, Show, NA
    Return

GuiSize:
    If A_Eventinfo = 2
        Return
    Minimize := A_Eventinfo
    If (IsStart && !Minimize)
        SendInput !{Esc}
    IsStart := 1
    Return

MinMax:
    If TrayIcon
    {
        Gui, Show, % Minimize ? "NA" : "Hide"
        SetTimer, OnTop, % (Minimize := !Minimize) ? "Off" : "On"
        Minimize ? InputCancel() : Send("!{Esc}")
    }
    Else
        Gui, % Minimize = 1 ? "Show" : "Minimize" InputCancel()
    Return

WM_LBUTTONDOWN()   {      ; Перетаскивание окна
    If Area = Caption
    {
        PostMessage, 0xA1, 2
        KeyWait LButton
        IfWinActive
            SendInput !{Esc}
    }
}

FixIE(Fix)  {
    Static Key := "Software\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION"
    If A_IsCompiled
        ExeName := A_ScriptName
    Else
        SplitPath, A_AhkPath, ExeName
    If Fix
        RegWrite, REG_DWORD, HKCU, %Key%, %ExeName%, 0
    Else
        RegDelete, HKCU, %Key%, %ExeName%
}

GuiClose:
GuiEscape:
    oDoc := ""
    ExitApp

    ; _________________________________________________ Init _________________________________________________

Init:
    Global hThisGui, oDoc, Area, PrArea, PrBank, Caps, ViewInput, Chr := {}, Ins := {}, Type := {}
    , Bank_Num := [[1],[2],[3],[4],[5],[6],[7],[8],[9],[0]]
    , Bank_Chr_1 := ["&rarr;",".","`,","!","?","""","`%"]
    , Bank_Chr_10 := ["&crarr;","+","-","*",":","(",")","|"]
    , Bank_bRu := [Bank_Chr_1,["А","Б","В","Г"],["Д","Е","Ё","Ж","З"],["И","Й","К","Л"],["М","Н","О","П"]
        ,["Р","С","Т","У"],["Ф","Х","Ц","Ч"],["Ш","Щ","Ь","Ы"],["Ъ","Э","Ю","Я"],Bank_Chr_10]
    , Bank_sRu := [Bank_Chr_1,["а","б","в","г"],["д","е","ё","ж","з"],["и","й","к","л"],["м","н","о","п"]
        ,["р","с","т","у"],["ф","х","ц","ч"],["ш","щ","ь","ы"],["ъ","э","ю","я"],Bank_Chr_10]
    , Bank_bEn := [Bank_Chr_1,["A","B","C"],["D","E","F"],["G","H","I"],["J","K","L"]
        ,["M","N","O"],["P","Q","R","S"],["T","U","V"],["W","X","Y","Z"],Bank_Chr_10]
    , Bank_sEn := [Bank_Chr_1,["a","b","c"],["d","e","f"],["g","h","i"],["j","k","l"]
        ,["m","n","o"],["p","q","r","s"],["t","u","v"],["w","x","y","z"],Bank_Chr_10]
    , Bank_Emb := [Bank_Chr_1,["{","}","<",">","`[","`]"],["+","-","*",":","=","_"]
        ,["&crarr;","&","'","|","``","~"],["(",")","/","\","^","#","$"]
        ,["&harr;","`;","@","№"],["Ctrl+C"],["Ctrl+V"],["Ctrl+A"],["Ctrl+Z"]]
    , Send_Exception := {"Ctrl+C":"^{vk43}","Ctrl+V":"^{vk56}","Ctrl+A":"^{vk41}","Ctrl+Z":"^{vk5A}"
        ,"&rarr;":"{Raw}" A_Space,"&crarr;":"{Raw}`n","&harr;":"{Raw}" A_Tab}
    , Param := {big:[hKey/1.91,0.35,cChr], small:[hKey/1.71,0.22,cChr], num:[hKey/1.35,0.08,cChr]
        , emb:[hKey/2.0,0.4,cChr], ctrl:[hKey/1.91,0.35,cCtrl]}

    Loop 10
        p_spans .= "<span name='" A_Index "' class='p' id='p" A_Index "'></span>"
    html := "
    (
    <body onselectstart='return false' oncontextmenu='return false'>" p_spans "
    <span name='Del' class='k' id='Del'>DEL</span>
    <span name='Sym' class='k' id='Sym'>EMB</span>
    <span name='Ret' class='k' id='Ret'>RET</span>
    <span name='Caption' id='Caption'><span name='Caption' id='viewinput'></span></span>
    <span name='Turn' class='k' id='Turn'>&ndash;</span>
    <span name='Close' class='k' id='Close'>&times;</span>
    </body>

    <style>
    body {
        background-color: '#" cBg "';
        overflow: 'hidden';
        white-space: 'nowrap';
        font-family: 'Arial';
        text-align: 'center';
    }
    .p {
        cursor: 'pointer';
        overflow: 'hidden';
        border: " sBorder "px solid #" cBorder "`;
        position: 'absolute';
        width: " wKey "px;
        height: " hKey "px;
    }
    .k {
        cursor: 'default';
        overflow: 'hidden';
        border: " sBorder "px solid #" cBg "`;
        font-size: '" hKey/6 "px';
        font-weight: '900';
        padding-top: '0.3em';
        position: 'absolute';
        width: " hCap//0.6 "px;
        height: " hCap "px;
        top: 0px;
    }
    #Del {background-color: '#D9952F'; left: 0px;}
    #Sym {background-color: '#44AD24'; left: " hCap//0.6 "px;}
    #Ret {background-color: '#FFFF00'; left: " (hCap//0.6)*2 "px;}
    #Turn {background-color: '#365DC0'; left: " (wKey*3) - (hCap//0.6)*2 "px;}
    #Close {background-color: '#EC4D48'; left: " (wKey*3) - (hCap//0.6) "px;}
    #Turn , #Close {font-size: " hKey/4 "px; padding-top: 0.0em;}
    #Caption {
        cursor: 'move';
        position: 'absolute';
        top: 0px;
        left: " (hCap//0.6)*3 "px;
        width: " (wKey*3) - (hCap//0.6)*5 "px;
        height: " hCap "px;
        overflow: hidden;
    }
    #viewinput {
        position: 'absolute';
        right: '1px';
        font-size: '" hKey/4.5 "px';
        color: '#fff';
        padding-top: '0.2em';
    }
    </style>
    )"

    For a, b in ["bRu","sRu","bEn","sEn","Emb","Num"]
        For c, d in Bank_%b%
        {
            Loop % d.maxindex()
                e .= "<span name='child' class='chr' id='p" c "c" A_Index "'>" d[A_Index] "</span>"
            Ins[b "_" c] := e, e := ""
            Type[b "_" c] := (t := SubStr(b, 1, 1)) = "b" ? (InStr(c, "1") ? "Emb" : "big")
                : t = "s" ? (InStr(c, "1") ? "emb" : "small")
                : t = "E" ? (c > 6 ? "ctrl" : "emb") : "num"
        }
    Return

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

24

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Кнопки нормально отображаются.

25

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Осталось добавить менеджер буфера обмена.

26

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Осталось добавить управление сообщениями.
А что такое - "менеджер буфера обмена", какова непосредственная логическая реализация?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

27

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Это наверно как область задач в MS Word. Там в список фрагментов, взятых в буфер обмена за последние 24 раза, и их можно оттуда брать и использовать.

28 (изменено: dredj, 2014-11-16 13:19:23)

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Классический "менеджер буфер обмена" сохраняет  вырезанный или скопированный текст в виде списка для последующей его вставки куда надо.
А вот реализация это на ваше усмотрение, просто мне понравилось то, что при вызове ваша клавиатура не перехватывает на себя фокус ввода т.е. позиция каретки в текущем окне остаётся прежней и я подумал было бы хорошо иметь "менеджер буфер обмена" с такой особенностью, вот и поделился "идеей".

ypppu, Как-то так https://ru.wikipedia.org/wiki/Orfo_Swit … 1.88.D0.B8 только софт этот глюковатый и падает частенько.

29

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

ypppu пишет:

Это наверно как область задач в MS Word. Там в список фрагментов, взятых в буфер обмена за последние 24 раза, и их можно оттуда брать и использовать.

Делал такое для пользования в SciTe.

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

30

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Добавил версию с менеджером буфера обмена.
Панель менеджера выезжает при нажатии средней кнопки мыши над заголовком клавиатуры.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

31

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

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

Еще в режиме цифр "колесо вверх" спамит цифры пропорционально количеству щелчков колеса, поэтому приходится крутить аккуратно. Кмк, лучше отсекать лишние повороты колесика в этом режиме, по времени между ними.

32

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Еще в режиме цифр "колесо вверх" спамит цифры пропорционально количеству щелчков колеса, поэтому приходится крутить аккуратно. Кмк, лучше отсекать лишние повороты колесика в этом режиме, по времени между ними.

Тут Я использую LButton, вроде удобно.

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

Может Я не понял, напиши более развёрнуто.
При старте скрипта, если сразу открыть панель, то в ней первой строкой должно быть содержимое буфера обмена. При копировании новый элемент добавляется вверх списка, если ниже есть такой же, то он удаляется.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

33

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

В том и дело, при старте скрипта в буфере, к примеру "111". Открываю панель - пусто. Копирую в буфер "222", и в панели появляется "222", и ниже "111".

По поводу LButton, это очевидно, и используется по умолчанию. Просто излишне резко провернув колесо вверх над цифровой панелью, получаем в месте редактирования кучу цифр, а это не совсем то, что ожидаешь увидеть. ))

34

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

В том и дело, при старте скрипта в буфере, к примеру "111". Открываю панель - пусто.

Хмм... Это только при запуске х64. На х32 всё норм. Очень интересно - в чём тут может быть дело.

Просто излишне резко провернув колесо вверх над цифровой панелью

Ну я его тут нативно не трогаю. Но колёсиком тоже норм. Просто бывают мыши с не очень хорошим колёсиком. У меня была такая, пять раз провернёшь вверх, а одно-два из них проскочит как вниз. Либо не очень очевидные на ощупь повороты колёсика. Если мышь такая, то конечно следует под себя изменить хоткеи.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

35

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

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

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

36 (изменено: serzh82saratov, 2014-11-23 17:45:35)

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

MButton.
Вообще всё управление принципиально на пяти кнопках мыши.

MButton
LButton
RButton
WheelDown
WheelUp

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

37

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Так в посте в Коллекции надо бы написать, как пользоваться.

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

38

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

По работе скрипта. Какой смысл в том, что набранные символы отображаются в заголовке? По-моему, лишняя информация. Ещё для ускорения можно сделать, чтобы выбор первого символа в группе осуществлялся при наведении курсора. Отсроченный ввод я бы убрал вовсе — к чему он, если правой кнопкой быстрее?

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

39 (изменено: serzh82saratov, 2014-11-23 22:20:13)

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Так в посте в Коллекции надо бы написать, как пользоваться.

Добавил.

Какой смысл в том, что набранные символы отображаются в заголовке? По-моему, лишняя информация.

Набирая текст смотришь на клавиатуру. Если редактор и клавиатура в разных углах экрана, то по моему удобнее.

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

А если потом навёл на другую "клавишу", предыдущее отменять? Или каждый раз нажимать правую кнопку? Неудобно. Правая кнопка в принципе используется для последнего символа, следующего символа на этой же клавише, или при смене раскладки. То есть, выбрал букву, если после выбрал другую или сменил регистр то предыдущая подтвердилась.

Отсроченный ввод я бы убрал вовсе — к чему он, если правой кнопкой быстрее?

Может быть, Я делал по аналогии с телефонной.
18 строка:

, TimeOut := 1500 ; Таймаут авто ввода символа после последнего выбора

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

  • Выдвижение панели в окне без заголовка

  • Работа с окном без его активации

  • История буфера обмена

  • HTML в AutoHotkey

У тебя кстати что с этим:

Irbis пишет:

В том и дело, при старте скрипта в буфере, к примеру "111". Открываю панель - пусто. Копирую в буфер "222", и в панели появляется "222", и ниже "111".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

40

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

serzh82saratov пишет:

А если потом навёл на другую "клавишу", предыдущее отменять?

Не знаю, правильно ли ты меня понял. Я это вижу так: наводишь курсор на кнопку — сразу загорается первый слева символ, далее выбираешь колесом, довертел до нужного — нажимаешь RButton, символ посылается в активное окно. Ввод по таймеру вообще убрать, тогда проблема отмены снимется. Переводишь на другую кнопку — опять сразу загорается первый слева символ и т. д.

У тебя кстати что с этим

Также, как у Irbis'а.

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

41

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Не знаю, правильно ли ты меня понял.

Думаю что правильно. Ты предлагаешь каждый раз подтверждать ввод символа по RButton? По моему это долго - неудобно - шумно. Во всяком случае лично для меня.

Ввод по таймеру вообще убрать, тогда проблема отмены снимется.

Так в чём тут проблема, изредка двинуть WheelDown для отмены? Или проще при каждом вводе символа нажимать RButton?
Ну а задержка регулируется индивидуально, как и всё остальное.
Не думаю что тут есть какой то один вариант метода ввода - удобный и очевидный для всех.

Также, как у Irbis'а.

А на AutoHotkey х32 как?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

42

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Сейчас вот проверил, вроде всё нормально, при старте на всех интерпретаторах текущий буфер обмена.

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

43

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

вроде всё нормально

Когда как повезёт. OnClipboardChange запускается сразу, и иногда ещё до создания окна. Видимо у меня на х64 оно создаётся дольше. Вообщем поправил код.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

44 (изменено: dredj, 2015-01-31 21:26:52)

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

serzh82saratov, не могли бы вы, если это не очень муторно, выложить "менеджер буфер обмена" из вашего скрипта, как отдельно работающий скрипт, который бы запускался по горячей клавише?

45

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Времени нет, тут надо всё переписывать, да и нет смысла писать на HTML только "менеджер буфер обмена", то бишь писать надо всё заново. В коде выделена секция "ClipMan", в ней всё касаемо буфера обмена, начните писать сами под себя, советом помогу. Собственно скрипт был выложен в коллекцию только в качестве одного из примеров работы с неактивным окном, так что всё необходимое у вас есть.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

46

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Увы для меня всё там слишком сложно и запутано. Попробую написать свой костыль потихоньку, если что обращусь).

47

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

У меня есть отдельный довольно навороченный менеджер буфера обмена, если нужно, могу выложить.

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

48 (изменено: stealzy, 2015-02-01 16:35:27)

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Обязательно , а то я как раз думал делать.
Щас пользуюсь CLCL менеджером.
Не хватает "живого" поиска по истории (у меня > 200 записей там).
И историю введенного текста отдельным модулем хочу замутить (обидно, когда теряешь введенное).

0xFFFFFF
0xFF0000
0xFFFFFF

49

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Выложу попозже. Поиска нету. Есть сохранение заранее предустановленного количества «ячеек» между сессиями. Мой вариант напоминает тот, что в Ворде.

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

50 (изменено: dredj, 2015-02-01 19:44:51)

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Да менеджеров этих много, тут главная фишка в том, что окно со списком не перехватывает на себя фокус при вызове.

И историю введенного текста отдельным модулем хочу замутить (обидно, когда теряешь введенное).

Нужная штука.

51

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Выложил.

dredj пишет:

Нужная штука.

Да, наверное, добавил себе тоже.

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

52 (изменено: serzh82saratov, 2015-07-11 16:26:00)

Re: AHK: Виртуальная 10-ти "клавишная" клавиатура

Добавил возможность выбора отдельных строк из окна с содержимым ячейки в истории буфера обмена. Лично для меня удобно при копировании заметки, и далее вставки строк в отдельные поля форм.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui