1 (изменено: Dr.Jekyll, 2014-02-21 01:51:09)

Тема: AHK: OSD Remote menu

Добрый день ВСЕМ!

Хочу сделать красивое OSD меню для запуска приложений с помощью ИК пульта.

Нашел на буржуйском форуме интересный скрипт:


#NoEnv
#SingleInstance   force
SetBatchLines -1
; #Persistent

WinWide := 500
TextWide := 250
TxtX := 60
SelectedBtn := ""
SelectedTxt := ""

Gui, Color, White
Gui, Font, cBlue s18 Bold, Verdana
Gui, Add, Text, x0 y30 w%WinWide% h30 Center , Header!
Gui, Font, s16 Normal
Gui, Add, Radio, x%TxtX% y80 w%TextWide% h30 gRA1 vRA1 Checked, First choice (&1)
Gui, Add, Radio, yp+30 w%TextWide% h30 gRA2 vRA2, Second choice (&2)
Gui, Add, Radio, yp+30 w%TextWide% h30 gRA3 vRA3, Third choice (&3)
Gui, Add, Radio, yp+30 w%TextWide% h30 gRA4 vRA4, Fourth choice (&4)
Gui, Add, Button, yp+60 w100 gButtOK Default, &OK!
Gui, Show, x130 y100 h400 w%WinWide%, Radio button press test
Gosub, RA1 ; initialize selection
Return

GuiEscape:
GuiClose:
ExitApp

RA1:
RA2:
RA3:
RA4:
   If (SelectedBtn) {
      Gui, Font, cBlue s16 Normal
      GuiControl, Font, %SelectedBtn%
   }
   SelectedBtn := A_ThisLabel
   GuiControlGet, SelectedTxt, , %A_ThisLabel%, Text
   Gui, Font, cRed s16 Bold
   GuiControl, Font, %SelectedBtn%
Return

ButtOK:
   Gui Destroy
   MsgBox Butt OK is pressed! `n`nSelection: %SelectedBtn% = %SelectedTxt%
ExitApp

Возможно ли сделать нечто подобное из этого?:


CustomColor = EEAA99
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow
Gui, Color, %CustomColor%
Gui, Font, s30 Bold, Cambria
Gui, Add, Text, cBlue gLaunchCalc, Нажать для запуска калькулятора.
Gui, Add, Text, cBlue gLaunchNotepad, Нажать для запуска текстового редактора.
WinSet, TransColor, %CustomColor% 150
Gui, Show, x450 y0 NoActivate, Watch
return

LaunchCalc:
Run calc
return

LaunchNotepad:
Run notepad
return


Задача такая:

1. Вместо
Gui, Add, Radio, ...
использовать
Gui, Add, Text, cBlue gLaunchXXXXX, ...

2. Сделать навигацию по меню с использованием клавиш <Up> и <Down>

3. Сделать запуск приложений по нажатию <Enter> на пункте меню, находящимся в фокусе


... Да поможет мне teadrinker

Лучше день потерять, потом за пять минут долететь!

2

Re: AHK: OSD Remote menu

А в чём главная фишка, чтобы шрифт менялся при нажатии?

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

3 (изменено: Dr.Jekyll, 2014-02-21 02:08:33)

Re: AHK: OSD Remote menu

Просто убрать кнопки Radio и использовать вместо них Gui, Add, Text, cBlue gLaunchCalc, ...

Во втором варианте нет запуска по <Enter> и навигация невозможна с помощью клавиш <Up> <Down>, только с помощью кликов мыши, а надо клаву заюзать ... Естественно не теряя функционала первого скрипта ....

Возможно ли это сделать? Или можно использовать только кнопки Radio?

Лучше день потерять, потом за пять минут долететь!

4

Re: AHK: OSD Remote menu

CurrentChoice := 1   ; выбранная строка
MaxChoice := 2       ; общее количество строк

CustomColor = EEAA99
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow
Gui, Color, %CustomColor%
Gui, Font, s30 Bold, Cambria
Gui, Add, Text, vText1 cRed gStr1, Нажать для запуска калькулятора.
Gui, Add, Text, vText2 cBlue gStr2, Нажать для запуска текстового редактора.
WinSet, TransColor, %CustomColor% 150
Gui, Show, x450 y0 NoActivate, Watch
return

Str1:
Str2:
   if !PressEnter
   {
      SetFont("cBlue", "Text" CurrentChoice)
      CurrentChoice := SubStr(A_GuiControl, 0)
      SetFont("cRed", "Text" CurrentChoice)
   }
   PressEnter := ""
   
   if (A_ThisLabel = "Str1")
      Run calc
   else if (A_ThisLabel = "Str2")
      Run notepad
   return

#IfWinExist, Watch ahk_class AutoHotkeyGUI
Up::
Down::
   SetFont("cBlue", "Text" CurrentChoice)

   CurrentChoice += (A_ThisHotkey = "Up" ? -1 : 1)
   CurrentChoice := (CurrentChoice > MaxChoice ? 1 : CurrentChoice = 0 ? MaxChoice : CurrentChoice)
   
   SetFont("cRed", "Text" CurrentChoice)
   return
   
Enter::
   PressEnter := 1
   goto, Str%CurrentChoice%
   return
   
SetFont(Options, Control)
{
   Gui, Font, % Options
   GuiControl, Font, % Control
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: OSD Remote menu

.... не перестаю удивляться! teadrinker, Вы - ТАЛАНТИЩЕ!

... А можно еще добавить изменение размера пункта меню, находящегося в фокусе? Как в первом скрипте ...

Лучше день потерять, потом за пять минут долететь!

6

Re: AHK: OSD Remote menu

Dr.Jekyll пишет:

.... не перестаю удивляться! teadrinker, Вы - ТАЛАНТИЩЕ!

... А можно еще добавить изменение размера пункта меню, находящегося в фокусе? Как в первом скрипте ...

Считайте это домашним заданием

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

7

Re: AHK: OSD Remote menu

ОК! Дальше сам попробую разобраться ... а то совсем обленюсь.

БОЛЬШУЩЕЕ БЛАГОДАРЮ за помощь!

Лучше день потерять, потом за пять минут долететь!

8

Re: AHK: OSD Remote menu

Отредактировал, чтобы шрифт менялся при клике по строчке.

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

9 (изменено: Dr.Jekyll, 2014-02-21 12:11:20)

Re: AHK: OSD Remote menu

Изменил эти строки:

SetFont("s30 cBlue", "Text" CurrentChoice)

SetFont("s40 cRed", "Text" CurrentChoice)

Пришлось изменить и это:

Gui, Font, s40 Bold, Cambria

Если оставить как было s30 , то при выборе строки и увеличении шрифта, получается строка обрезана. Типа "Нажать для запу" .

В общем, это работает на уменьшение не выбранного пункта, а не на увеличение выбранного ...

... или я что-то не так делаю?

Лучше день потерять, потом за пять минут долететь!

10 (изменено: Dr.Jekyll, 2014-02-21 17:31:01)

Re: AHK: OSD Remote menu

Похоже, сделал!

Вот, что наваял:

#NoEnv
#NoTrayIcon
#Persistent
#SingleInstance, Force

CurrentChoice := 1    ; выбранная строка
MaxChoice := 6         ; общее количество строк

CustomColor = 000000
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow
Gui, Color, %CustomColor%
Gui, Font, s46 Bold, Cambria
Gui, Add, Text, Center y+88 w1684 h92 vOSD1 cRed gStr1, J.River Media Center
Gui, Add, Text, Center w1684 h92 vOSD2 cYellow gStr2, DVB Dream
Gui, Add, Text, Center w1684 h92 vOSD3 cYellow gStr3, Daum PotPlayer
Gui, Add, Text, Center w1684 h92 vOSD4 cYellow gStr4, RadioTime RedButton
Gui, Add, Text, Center w1684 h92 vOSD5 cYellow gStr5, Открыть DVD привод
Gui, Add, Text, Center w1684 h92 vOSD6 cYellow gStr6, Выключить компьютер
Gui, Show, Center h920 w1800 NoActivate, OSD Remote Menu
WinSet, Region, 0-0 h920 w1800 R160-160, OSD Remote Menu
WinSet, Transparent, 200, OSD Remote Menu
return

Str1:
Str2:
Str3:
Str4:
Str5:
Str6:
    if !PressEnter
        {
        SetFont("s46 cYellow", "OSD" CurrentChoice)
        CurrentChoice := SubStr(A_GuiControl, 0)
        SetFont("s56 cRed", "OSD" CurrentChoice)
        }
    PressEnter := ""
    
    if (A_ThisLabel = "Str1")
        {
        Run, calc
        }
    else if (A_ThisLabel = "Str2")
        {
        Run, notepad
        }
    else if (A_ThisLabel = "Str3")
        {
        Run, notepad
        }
    else if (A_ThisLabel = "Str4")
        {
        Run, notepad
        }
    else if (A_ThisLabel = "Str5")
        {
        Run, notepad
        }
    else if (A_ThisLabel = "Str6")
        {
        Run, notepad
        }
        
Loop, 100
    {
    TransFade := 200 - A_Index
    WinSet, Transparent, %TransFade%, OSD Remote Menu
    Sleep, 1
    }
    
GuiClose:
ExitApp

#IfWinExist, OSD Remote Menu ahk_class AutoHotkeyGUI
Up::
Down::
    SetFont("s46 cYellow", "OSD" CurrentChoice)
    
    CurrentChoice += (A_ThisHotkey = "Up" ? -1 : 1)
    CurrentChoice := (CurrentChoice > MaxChoice ? 1 : CurrentChoice = 0 ? MaxChoice : CurrentChoice)
    
    SetFont("s56 cRed", "OSD" CurrentChoice)
    return
    
Enter::
    PressEnter := 1
    goto, Str%CurrentChoice%
    return
    
SetFont(Options, Control)
    {
    Gui, Font, % Options
    GuiControl, Font, % Control
    }

Размеры подогнал под свой монитор с разрешением 1920 X 1080. Осталось только команды на запуск программ прописать.

Вроде, симпатично получилось ... жаль, что нельзя сделать непрозрачный текст на полупрозрачном фоне!   Пришлось фон менее прозрачным сделать, чтобы читабельно было.

Лучше день потерять, потом за пять минут долететь!

11

Re: AHK: OSD Remote menu

Обидно ... вся эта конструкция почему-то не хочет работать с пультом. Через клаву прокрутка по меню идет без проблем, а на пульт WinLIRC не реагирует. Хотя во всех программах пульт работает - и эмуляция всех клавиш идет нормально .... Что может быть?

Лучше день потерять, потом за пять минут долететь!

12

Re: AHK: OSD Remote menu

Не, с пультом не работал, не подскажу.

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

13 (изменено: Dr.Jekyll, 2014-02-22 03:52:49)

Re: AHK: OSD Remote menu

... Вдруг мысль пришла: а что если попробовать повесить эти три кнопки не на клаву, а напрямую - на кнопки IR пульта?
Я ведь управление настраиваю тоже на AHK - WinLIRC Client, взятый из стандартной справки ...  получается двойная эмуляция.

Возможно и заработает  .... вот только как это лучше сделать? Может есть мысли?

Выложу свой вариант WinLIRC Client адаптированный к AVerLIRC ( тот-же WinLIRC для тюнеров AVer )

#NoEnv
SendMode Input

; Запуск программы от имени Админа
If not A_IsAdmin
{
Run *RunAs "%A_ScriptFullPath%"
ExitApp
}

Process, Priority,, HIGH ; Установить приоритет процесса скрипта в High (высокий).

DelayBetweenButtonRepeats = 200

; Specify AVerLIRC's address and port. The most common are 127.0.0.1 (localhost) and 8765.
AVerLIRC_Address = 127.0.0.1
AVerLIRC_Port = 666

; Do not change the following two lines. Skip them and continue below.
Gosub AVerLIRC_Init
return

; ----------------------------------------------------
; Назначение действий для кнопок пульта AVerMedia-H831
; ----------------------------------------------------
; J.River Media Center
;--------------------------------------------------
Source:
return
;--------------------------------------------------
Power:
Run, OSD-RemoteMenu.ahk
return
;--------------------------------------------------
Full_screen:
Run, mc19.exe /mcc 22000`,2
GoTo UpdateTime
return
;--------------------------------------------------
Record:
Send {vk26} ; <Up>
;Run, mc19.exe /mcc 27000`,38
return
;--------------------------------------------------
; Кнопка для всех программ
Audio:
Process, Exist, Watch.exe
    {
    If ! ErrorLevel
        {
        Run, Watch.exe
        }
        Else
            {
            Process, Close, Watch.exe
            }
    }
return
;--------------------------------------------------
Rewind:
Run, mc19.exe /mcc 27000`,37
return
;--------------------------------------------------
Play/Pause:
Send {vkD} ; <Enter>
;Run, mc19.exe /mcc 27000`,13
return
;--------------------------------------------------
Forward:
Run, mc19.exe /mcc 27000`,39
return
;--------------------------------------------------
Display:
Run, mc19.exe /mcc 10009
return
;--------------------------------------------------
Stop:
Send {vk28} ; <Down>
;Run, mc19.exe /mcc 27000`,40
return
;--------------------------------------------------
EPG:
Run, mc19.exe /mcc 10008
return
;--------------------------------------------------
; Кнопка для всех программ
Vol+:
Send {vkAF}
SoundSet +2
return
;--------------------------------------------------
Ch+:
Run, mc19.exe /mcc 10003
return
;--------------------------------------------------
; Кнопка для всех программ
Vol-:
Send {vkAE}
SoundSet -2
return
;--------------------------------------------------
Ch-:
Run, mc19.exe /mcc 10004
return
;--------------------------------------------------
1:
Run, mc19.exe /mcc 27000`,97
return
;--------------------------------------------------
2:
Run, mc19.exe /mcc 27000`,98
return
;--------------------------------------------------
3:
Run, mc19.exe /mcc 27000`,99
return
;--------------------------------------------------
4:
Run, mc19.exe /mcc 27000`,100
return
;--------------------------------------------------
5:
Run, mc19.exe /mcc 27000`,101
return
;--------------------------------------------------
6:
Run, mc19.exe /mcc 27000`,102
return
;--------------------------------------------------
7:
Run, mc19.exe /mcc 27000`,103
return
;--------------------------------------------------
8:
Run, mc19.exe /mcc 27000`,104
return
;--------------------------------------------------
9:
Run, mc19.exe /mcc 27000`,105
return
;--------------------------------------------------
Ch_Return:
return
;--------------------------------------------------
0:
Run, mc19.exe /mcc 27000`,96
return
;--------------------------------------------------
; Кнопка для всех программ
Mute:
Send {vkAD}
return
;--------------------------------------------------
; Sub - обновление часов
UpdateTime:

Process, Exist, Watch.exe
    {
    If ErrorLevel
        {
        Process, Close, Watch.exe
        Sleep, 500
        Run, Watch.exe
        }
    }
return
;--------------------------------------------------

; ----------------------------
; END OF CONFIGURATION SECTION
; ----------------------------
; Do not make changes below this point unless you want to change the core
; functionality of the script.

AVerLIRC_Init:
OnExit, ExitSub  ; For connection cleanup purposes.

; Launch AVerLIRC if it isn't already running:
Process, Exist, averlirc.exe
if ! ErrorLevel  ; No PID for AVerLIRC was found.
{
    MsgBox, 0x30, AVerLIRC Client, Похоже`, AVerLIRC не запущен.`n`nПытаюсь подключить сервер., 2
    RunWait, net start averlirc, , Hide
}

; Connect to AVerLIRC (or any type of server for that matter):
socket := ConnectToAddress(AVerLIRC_Address, AVerLIRC_Port)
if socket = -1  ; Connection failed (it already displayed the reason).
    ExitApp

; Find this script's main window:
Process, Exist  ; This sets ErrorLevel to this script's PID (it's done this way to support compiled scripts).
DetectHiddenWindows On
ScriptMainWindowId := WinExist("ahk_class AutoHotkey ahk_pid " . ErrorLevel)
DetectHiddenWindows Off

; When the OS notifies the script that there is incoming data waiting to be received,
; the following causes a function to be launched to read the data:
NotificationMsg = 0x5555  ; An arbitrary message number, but should be greater than 0x1000.
OnMessage(NotificationMsg, "ReceiveData")

; Set up the connection to notify this script via message whenever new data has arrived.
; This avoids the need to poll the connection and thus cuts down on resource usage.
FD_READ = 1     ; Received when data is available to be read.
FD_CLOSE = 32   ; Received when connection has been closed.
if DllCall("Ws2_32\WSAAsyncSelect", "UInt", socket, "UInt", ScriptMainWindowId, "UInt", NotificationMsg, "Int", FD_READ|FD_CLOSE)
{
    MsgBox % "WSAAsyncSelect() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError")
    ExitApp
}
return



ConnectToAddress(IPAddress, Port)
; This can connect to most types of TCP servers, not just AVerLIRC.
; Returns -1 (INVALID_SOCKET) upon failure or the socket ID upon success.
{
    VarSetCapacity(wsaData, 400)
    result := DllCall("Ws2_32\WSAStartup", "UShort", 0x0002, "UInt", &wsaData) ; Request Winsock 2.0 (0x0002)
    ; Since WSAStartup() will likely be the first Winsock function called by this script,
    ; check ErrorLevel to see if the OS has Winsock 2.0 available:
    if ErrorLevel
    {
        MsgBox WSAStartup() could not be called due to error %ErrorLevel%. Winsock 2.0 or higher is required.
        return -1
    }
    if result  ; Non-zero, which means it failed (most Winsock functions return 0 upon success).
    {
        MsgBox % "WSAStartup() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError")
        return -1
    }

    AF_INET = 2
    SOCK_STREAM = 1
    IPPROTO_TCP = 6
    socket := DllCall("Ws2_32\socket", "Int", AF_INET, "Int", SOCK_STREAM, "Int", IPPROTO_TCP)
    if socket = -1
    {
        MsgBox % "socket() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError")
        return -1
    }

    ; Prepare for connection:
    SizeOfSocketAddress = 16
    VarSetCapacity(SocketAddress, SizeOfSocketAddress)
    InsertInteger(2, SocketAddress, 0, AF_INET)   ; sin_family
    InsertInteger(DllCall("Ws2_32\htons", "UShort", Port), SocketAddress, 2, 2)   ; sin_port
    InsertInteger(DllCall("Ws2_32\inet_addr", "Str", IPAddress), SocketAddress, 4, 4)   ; sin_addr.s_addr

    ; Attempt connection:
    if DllCall("Ws2_32\connect", "UInt", socket, "UInt", &SocketAddress, "Int", SizeOfSocketAddress)
    {
        MsgBox % "connect() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") . ". Is AVerLIRC running?"
        return -1
    }
    return socket  ; Indicate success by returning a valid socket ID rather than -1.
}



ReceiveData(wParam, lParam)
; By means of OnMessage(), this function has been set up to be called automatically whenever new data
; arrives on the connection.  It reads the data from AVerLIRC and takes appropriate action depending
; on the contents.
{
    Critical  ; Prevents another of the same message from being discarded due to thread-already-running.
    socket := wParam
    ReceivedDataSize = 4096  ; Large in case a lot of data gets buffered due to delay in processing previous data.

    VarSetCapacity(ReceivedData, ReceivedDataSize, 0)  ; 0 for last param terminates string for use with recv().
    ReceivedDataLength := DllCall("Ws2_32\recv", "UInt", socket, "Str", ReceivedData, "Int", ReceivedDataSize, "Int", 0)
    if ReceivedDataLength = 0  ; The connection was gracefully closed, probably due to exiting AVerLIRC.
        ExitApp  ; The OnExit routine will call WSACleanup() for us.
    if ReceivedDataLength = -1
    {
        WinsockError := DllCall("Ws2_32\WSAGetLastError")
        if WinsockError = 10035  ; WSAEWOULDBLOCK, which means "no more data to be read".
            return 1
        if WinsockError <> 10054 ; WSAECONNRESET, which happens when AVerLIRC closes via system shutdown/logoff.
            ; Since it's an unexpected error, report it.  Also exit to avoid infinite loop.
            MsgBox % "recv() indicated Winsock error " . WinsockError
        ExitApp  ; The OnExit routine will call WSACleanup() for us.
    }
    ; Otherwise, process the data received. Testing shows that it's possible to get more than one line
    ; at a time (even for explicitly-sent IR signals), which the following method handles properly.
    ; Data received from AVerLIRC looks like the following example (see the AVerLIRC docs for details):
    ; 0000000000eab154 00 NameOfButton NameOfRemote
    Loop, parse, ReceivedData, `n, `r
    {
        if A_LoopField in ,BEGIN,SIGHUP,END  ; Ignore blank lines and AVerLIRC's start-up messages.
            continue
        ButtonName =  ; Init to blank in case there are less than 3 fields found below.
        Loop, parse, A_LoopField, %A_Space%  ; Extract the button name, which is the third field.
            if A_Index = 3
                ButtonName := A_LoopField
        global DelayBetweenButtonRepeats  ; Declare globals to make them available to this function.
        static PrevButtonName, PrevButtonTime, RepeatCount  ; These variables remember their values between calls.
        if (ButtonName != PrevButtonName || A_TickCount - PrevButtonTime > DelayBetweenButtonRepeats)
        {
            if IsLabel(ButtonName)  ; There is a subroutine associated with this button.
                Gosub %ButtonName%  ; Launch the subroutine.
            else ; Since there is no associated subroutine, briefly display which button was pressed.
            {
                if (ButtonName == PrevButtonName)
                    RepeatCount += 1
                else
                    RepeatCount = 1
                SplashTextOn, 150, 20, Button from AVerLIRC, %ButtonName% (%RepeatCount%)
                SetTimer, SplashOff, 3000  ; This allows more signals to be processed while displaying the window.
            }
            PrevButtonName := ButtonName
            PrevButtonTime := A_TickCount
        }
    }
    return 1  ; Tell the program that no further processing of this message is needed.
}



SplashOff:
SplashTextOff
SetTimer, SplashOff, Off
return



InsertInteger(pInteger, ByRef pDest, pOffset = 0, pSize = 4)
; The caller must ensure that pDest has sufficient capacity.  To preserve any existing contents in pDest,
; only pSize number of bytes starting at pOffset are altered in it.
{
    Loop %pSize%  ; Copy each byte in the integer into the structure as raw binary data.
        DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1, "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF)
}



ExitSub:  ; This subroutine is called automatically when the script exits for any reason.
; MSDN: "Any sockets open when WSACleanup is called are reset and automatically
; deallocated as if closesocket was called."
DllCall("Ws2_32\WSACleanup")
ExitApp


Может здесь лучше использовать #Include OSD-RemoteMenu.ahk или непосредственно "вшить" в этот скрипт? Какие предложения?

... Собсна, названия кнопок, на которые надо повесить, с закомментированными названиями клавиш.

Лучше день потерять, потом за пять минут долететь!

14

Re: AHK: OSD Remote menu

Вопрос не совсем в тему: можно ли на одну клавишу повесить несколько действий?
Например, нажимаешь клавишу <A> один раз - откроется calc.exe, нажимаешь два раза подряд - откроется notepad.exe, нажмешь три раз подряд - откроется mspaint.exe ... и так далее.

Есть мысль - повесить таким образом на одну клавишу IR пульта запуск разных приложений ... Конечно, это будет не столь эффектно, как OSD меню, но это тоже выход ....

Лучше день потерять, потом за пять минут долететь!

15 (изменено: Dr.Jekyll, 2014-02-22 11:35:56)

Re: AHK: OSD Remote menu

Заработало! ... "Вшил" скрипт в AVerLIRC Client и посадил напрямую на кнопки IR пульта. Вот только теперь перемотка работает только вниз на обеих клавишах <Up> и <Down> пульта. Как это исправить?

Вот код скрипта, где внес изменения:

#IfWinExist, OSD Remote Menu ahk_class AutoHotkeyGUI
OSD_Up:
OSD_Down:
    SetFont("s46 cYellow", "OSD" CurrentChoice)
    
    CurrentChoice += (A_ThisHotkey = "OSD_Up" ? -1 : 1)
    CurrentChoice := (CurrentChoice > MaxChoice ? 1 : CurrentChoice = 0 ? MaxChoice : CurrentChoice)
    
    SetFont("s56 cRed", "OSD" CurrentChoice)
    return
    
OSD_Enter:
    PressEnter := 1
    goto, Str%CurrentChoice%
    return
    
SetFont(Options, Control)
    {
    Gui, Font, % Options
    GuiControl, Font, % Control
    }
Лучше день потерять, потом за пять минут долететь!

16

Re: AHK: OSD Remote menu

CurrentChoice += (A_ThisHotkey = "OSD_Up" ? -1 : 1)

На первый взгляд, заменить A_ThisHotkey на A_ThisLabel.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: Dr.Jekyll, 2014-02-23 00:42:40)

Re: AHK: OSD Remote menu

О-оо! Какие люди! ...   
Теперь все заработало корректно. Спасибо, serzh82saratov! Просто я еще "не догнал", что в этих двух строках кода teadrinker наколдовал, но так и предполагал, что копать надо в эту сторону.

CurrentChoice += (A_ThisLabel = "OSD_Up" ? -1 : 1)
CurrentChoice := (CurrentChoice > MaxChoice ? 1 : CurrentChoice = 0 ? MaxChoice : CurrentChoice)

- рабочий вариант! Это для интеграции в WinLIRC клиент, если кому понадобится. ... На всякий случай выложу код меню, работающей от клавы:

#NoEnv
#NoTrayIcon
#Persistent
#SingleInstance, Force

CurrentChoice := 1    ; выбранная строка
MaxChoice := 6         ; общее количество строк

CustomColor = 000000
Gui +LastFound +AlwaysOnTop -Caption +ToolWindow
Gui, Color, %CustomColor%
Gui, Font, s46 Bold, Cambria
Gui, Add, Text, Center y+88 w1684 h92 vOSD1 cRed gStr1, J.River Media Center
Gui, Add, Text, Center w1684 h92 vOSD2 cYellow gStr2, DVB Dream
Gui, Add, Text, Center w1684 h92 vOSD3 cYellow gStr3, Daum PotPlayer
Gui, Add, Text, Center w1684 h92 vOSD4 cYellow gStr4, RadioTime RedButton
Gui, Add, Text, Center w1684 h92 vOSD5 cYellow gStr5, Открыть DVD привод
Gui, Add, Text, Center w1684 h92 vOSD6 cYellow gStr6, Выключить компьютер
Gui, Show, Center h920 w1800 NoActivate, OSD Remote Menu
WinSet, Region, 0-0 h920 w1800 R160-160, OSD Remote Menu
WinSet, Transparent, 200, OSD Remote Menu
return

Str1:
Str2:
Str3:
Str4:
Str5:
Str6:
    if !PressEnter
        {
        SetFont("s46 cYellow", "OSD" CurrentChoice)
        CurrentChoice := SubStr(A_GuiControl, 0)
        SetFont("s56 cRed", "OSD" CurrentChoice)
        }
    PressEnter := ""
    SetFont("s46 cGreen", "OSD" CurrentChoice)
    
    if (A_ThisLabel = "Str1")
        {
        Run, notepad
        }
    else if (A_ThisLabel = "Str2")
        {
        Run, notepad
        }
    else if (A_ThisLabel = "Str3")
        {
        Run, notepad
        }
    else if (A_ThisLabel = "Str4")
        {
        Run, notepad
        }
    else if (A_ThisLabel = "Str5")
        {
        Run, notepad
        }
    else if (A_ThisLabel = "Str6")
        {
        Run, notepad
        }
        
Loop, 100
    {
    TransFade := 200 - A_Index
    WinSet, Transparent, %TransFade%, OSD Remote Menu
    Sleep, 1
    }
    
GuiClose:
ExitApp

#IfWinExist, OSD Remote Menu ahk_class AutoHotkeyGUI
Up::
Down::
    SetFont("s46 cYellow", "OSD" CurrentChoice)
    
    CurrentChoice += (A_ThisHotkey = "Up" ? -1 : 1)
    CurrentChoice := (CurrentChoice > MaxChoice ? 1 : CurrentChoice = 0 ? MaxChoice : CurrentChoice)
    
    SetFont("s56 cRed", "OSD" CurrentChoice)
    return
    
Enter::
    PressEnter := 1
    goto, Str%CurrentChoice%
    return
    
SetFont(Options, Control)
    {
    Gui, Font, % Options
    GuiControl, Font, % Control
    }

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

Всем большущее благодарю за помощь!

Вопрос решен.

Лучше день потерять, потом за пять минут долететь!