Что нового

Добавить Checkbox'ы выбора

zelich

Новичок
Сообщения
149
Репутация
0
Добрый вечер!
Есть очень простой скрипт, который при нажатии F6 эмулирует нажатие клавиш.
Какие клавиши- указывается при нажатие Shift+F6

Код:
#include <GuiConstants.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
TraySetToolTip('Script')

HotKeySet('+{Esc}', '_Exit')

HotKeySet('{F6}', 'ReS')
HotKeySet('+{F6}', 'ReSChange')

Global  $ReSCommand = "aaaaa"

$hWnd = GUICreate("")
GUIRegisterMsg($WM_HOTKEY, 'WM_HOTKEY')

$GUI = GUICreate("", 60, 60, 1890, 42, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_TRANSPARENT, $WS_EX_LAYERED))
GUISetBkColor(0x00B510)
_WinAPI_SetLayeredWindowAttributes($GUI, 0x00B510, 0, $LWA_COLORKEY)
GUICtrlCreateLabel("•", 0, 0, 30, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetColor(-1, 0x527887)
GUICtrlSetFont(-1, 40)
GUISetState()

While 1
    Sleep(10)
WEnd

Func ReS()
      Send($ReSCommand)
EndFunc

Func ReSChange()                         ; ~ Изменение
   $tempRe = $ReSCommand
   $ReSCommand = InputBox('Выражение 1:', "Выражение:", $ReSCommand, '', 150, 120)
   If $ReSCommand = '' Then
      $ReSCommand = $tempRe
      EndIf
EndFunc


Func _Exit()
   Exit
 EndFunc

Хочу "усложнить". Чтоб были заданые варианты и поле ввода. И выбирать RadioBox

2022-05-21_22h18_46.png

Помогите пожалуйста, как это можно организовать?
 
Последнее редактирование:

Oki

Продвинутый
Сообщения
452
Репутация
62
Смотри справку по вот этой функции.
Код:
GUICtrlCreateRadio()
Только жаль портить такой хороший скрипт, меняя широкий выбор на узкий. Когда у меня возникало желание сделать подобное изменение в похожем скрипте, приходило в голову параллельно оставить две возможности: и выбор набором, и выбор из списка.
 
Автор
zelich

zelich

Новичок
Сообщения
149
Репутация
0
Вообще мой полный скрипт такой:
Код:
#include <GuiConstants.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
TraySetToolTip('Revit_20/05')

HotKeySet('+{Esc}', '_Exit')

HotKeySet('{`}', 'ZoomE')   ;~ Зум
HotKeySet('{F1}', 'Empty')        ;~ Заглушка

HotKeySet('{F4}', 'Remem')

HotKeySet('{F6}', 'ReSite')   ;~ Переименование "копия 1" в "сайт"
HotKeySet('+{F6}', 'ReSiteChange')

HotKeySet('{F7}', 'DelCopy')        ;~ Удаление "... копия "
HotKeySet('+{F7}', 'DelCopyChange')

HotKeySet('{F8}', 'Duplicate')  ;~ Копирование с детализацией
HotKeySet('+{F8}', 'DuplicateChange')

HotKeySet('{F9}', 'NextZE') ;~ Ctrl+Tab и ZE
HotKeySet('+{F9}', 'NextZEChange')

HotKeySet('^{w}', 'Empty')  ;~ Блок Ctrl+W

Global  $zX, $zY, $ReSiteCommnd, $DupCommand, $DelCopyCommand, $timesZE
$r = 0
$r2 =0

$hWnd = GUICreate("")
GUIRegisterMsg($WM_HOTKEY, 'WM_HOTKEY')

$GUI = GUICreate("", 60, 60, 1890, 42, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_TRANSPARENT, $WS_EX_LAYERED))
GUISetBkColor(0x00B510)
_WinAPI_SetLayeredWindowAttributes($GUI, 0x00B510, 0, $LWA_COLORKEY)
GUICtrlCreateLabel("•", 0, 0, 30, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetColor(-1, 0x527887)
GUICtrlSetFont(-1, 40)
GUISetState()

While 1
    Sleep(10)
    If $r2 = 0 Then
      Start()
      $r2 = 1
   EndIf
WEnd

Func Start()
   $ReSiteCommnd =FileReadLine('Revit_Text.txt', 1)
   $DelCopyCommand = FileReadLine('Revit_Text.txt', 2)
   $DupCommand = FileReadLine('Revit_Text.txt', 3)
   $timesZE = FileReadLine('Revit_Text.txt', 4)

   MsgBox(0, "Содержимое 4-x строк", $ReSiteCommnd&@CRLF&$DelCopyCommand&@CRLF&$DupCommand&@CRLF&$timesZE,4)
EndFunc

Func ZoomE()
   If WinActive('Autodesk Revit') Then
      Send("ze") ;~ Эмулирует нажатие Z - E
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'ZoomE')
   EndIf
EndFunc



Func Empty()
    If WinActive('Autodesk Revit') Then
      Beep(200,150)
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'Empty')
   EndIf
EndFunc

Func Remem()
    If WinActive('Autodesk Revit') Then
      MsgBox(4096, "Revit_Export", "  '                  ====> Эмуляция Z - E"&@CRLF&"F4                 ====> Напоминание"&@CRLF&"    "&@CRLF&"Shift+F6      ====> Изменение F6"&@CRLF&"F6                 ====> Переименование 'копия №' в 'сайт'"&@CRLF&"    "&@CRLF&"Shift+F7      ====> Изменение F7"&@CRLF&"F7                 ====> Удаление '.. копия ..'"&@CRLF&"    "&@CRLF&"Shift+F8      ====> Изменение F8"&@CRLF&"F8                 ====> Скопир с детализацией (НАВЕСТИ)"&@CRLF&"    "&@CRLF&"Shift+F9      ====> Изменение кол-во F9"&@CRLF&"F9                 ====> Объект по центу + Переключение"&@CRLF&"    "&@CRLF&"F1 и Ctrl+W    ====> Заблокированны")
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'Empty')
   EndIf

EndFunc

Func ReSite()
   If WinActive('Autodesk Revit') Then
      Send($ReSiteCommnd);
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'ReSite')
   EndIf
EndFunc

Func ReSiteChange()                         ; ~ Изменение Удаление
   If WinActive('Autodesk Revit') Then
      $tempRe = $ReSiteCommnd
      $ReSiteCommnd = InputBox('Выражение 1:', "Выражение:", $ReSiteCommnd, '', 550, 120)
      If $ReSiteCommnd = '' Then
         $ReSiteCommnd = $tempRe
      EndIf
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'ReSiteChange')
   EndIf
EndFunc

Func DelCopy()                         ; ~ Удаление "... копия "
   If WinActive('Autodesk Revit') Then
      Send($DelCopyCommand);
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'DelCopy')
   EndIf
EndFunc

Func DelCopyChange()                         ; ~ Изменение Удаление
   If WinActive('Autodesk Revit') Then
      $tempDel = $DelCopyCommand
      $DelCopyCommand = InputBox('Выражение 2:', "Выражение:", $DelCopyCommand, '', 550, 120)
      If $DelCopyCommand = '' Then
         $DelCopyCommand = $tempDel
      EndIf
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'DelCopyChange')
   EndIf
EndFunc

Func Duplicate()
   If WinActive('Autodesk Revit') Then
      MouseClick('LEFT')
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'Duplicate')
   EndIf
EndFunc

Func DuplicateChange()
   If WinActive('Autodesk Revit') Then
      $tempDupl = $DupCommand
      $DupCommand = InputBox('Выражение 3:', "Выражение:", $DupCommand, '', 550, 120)
      If $DupCommand = '' Then
        $DupCommand = $tempDupl
      EndIf
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'DuplicateChange')
   EndIf
EndFunc

Func CtrlW()                     ; Не нужная
   If WinActive('Autodesk Revit') Then
      Beep(1,100)
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'CtrlW')
   EndIf
EndFunc

Func Discover()            ;~    Открытие выделеного вида
    Send("{ENTER}")
    $aMousePos = MouseGetPos()
    $zX = $aMousePos[0]
    $zY = $aMousePos[1]
    MouseMove($zX,$zY+18)
    MouseClick('LEFT')
EndFunc

Func NextZE()
   $tempZE = 0
   While $tempZE < $timesZE
      Send("ze") ;~ Эмулирует нажатие Z - E
      Send("^{TAB}")
      Sleep(100)
      Send("ze") ;~ Эмулирует нажатие Z - E
   $tempZE = $tempZE + 1
   WEnd
EndFunc

Func NextZEChange()
   If WinActive('Autodesk Revit') Then
      $tempZE = $timesZE
      $timesZE = InputBox('Выражение 4:', "Выражение:", $timesZE, '', 100, 120)
      If $timesZE = '' Then
        $timesZE = $tempZE
      EndIf
   Else
      HotKeySet(@HotKeyPressed)
      Send(@HotKeyPressed)
      HotKeySet(@HotKeyPressed, 'DuplicateChange')
   EndIf
EndFunc

Func FirstText ()
   $hFile = FileOpen('Revit_Text.txt', 2)
   If $hFile = -1 Then
       MsgBox(4096, "Ошибка", "Невозможно открыть файл.")
       Exit
   EndIf
   If $r = 0 Then
      FileWrite($hFile, $ReSiteCommnd&@CRLF)
      FileWrite($hFile, $DelCopyCommand&@CRLF)
      FileWrite($hFile, $DupCommand&@CRLF)
      FileWrite($hFile, $timesZE)
      $r = 1
   EndIf
   FileClose($hFile)
EndFunc

Func _Exit()
   FirstText ()
   Exit
 EndFunc

на RadioBox в нем вообще и намёка нет.
Нету. Потому-что в RadioBox'е не смог разобратся...

Сам попробовал, вот код:
Код:
#include <GuiConstants.au3>
#include <WinAPISys.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
TraySetToolTip('Script')

HotKeySet('+{Esc}', '_Exit')

HotKeySet('{F6}', 'ReS')
HotKeySet('+{F6}', 'ReSChange')

Global  $ReSCommand = "aaaaa"

$hWnd = GUICreate("")
GUIRegisterMsg($WM_HOTKEY, 'WM_HOTKEY')

$GUI = GUICreate("", 60, 60, 1890, 42, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_TRANSPARENT, $WS_EX_LAYERED))
GUISetBkColor(0x00B510)
_WinAPI_SetLayeredWindowAttributes($GUI, 0x00B510, 0, $LWA_COLORKEY)
GUICtrlCreateLabel("•", 0, 0, 30, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetColor(-1, 0x527887)
GUICtrlSetFont(-1, 40)
GUISetState()

While 1
    Sleep(10)
WEnd

Func ReS()
      Send($ReSCommand)
EndFunc

Func ReSChange()                         ; ~ Изменение
;~    $tempRe = $ReSCommand
;~    $ReSCommand = InputBox('Выражение 1:', "Выражение:", $ReSCommand, '', 150, 120)aaaaa
;~    If $ReSCommand = '' Then
;~       $ReSCommand = $tempRe
;~    EndIf
$hGUI = GUICreate("Выражение 1:", 200, 150)

$nCh1 = GUICtrlCreateRadio("  aaaaa", 10, 10, 180, 20)
$nCh2 = GUICtrlCreateRadio("  bbbbb", 10, 40, 180, 20)
$nCh3 = GUICtrlCreateRadio("", 10, 70, 15, 15)

$iCount3 = GUICtrlCreateInput("ccccc", 30, 68, 160, 20)
GUICtrlSetState($iCount3, $GUI_DISABLE)


GUICtrlSetState($nCh1, $GUI_CHECKED)
$iOK_Button = GUICtrlCreateButton("OK", 20, 100, 80, 20)
$iCancel_Button = GUICtrlCreateButton("Отмена", 110, 100, 80, 20)
GUISetState(@SW_SHOW, $hGUI)
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nCh1
        (GUICtrlRead($nCh3)=1)?GUICtrlSetState($iCount3,320):GUICtrlSetState($iCount3,128)
        Case $nCh2
        (GUICtrlRead($nCh3)=1)?GUICtrlSetState($iCount3,320):GUICtrlSetState($iCount3,128)
        Case $nCh3
        (GUICtrlRead($nCh3)=1)?GUICtrlSetState($iCount3,320):GUICtrlSetState($iCount3,128)
        Case $iOK_Button
            $textplus = GUICtrlRead($iCount3)
            $count = GUICtrlRead($iCount3)
            Exit
         Case $iCancel_Button
            Exit
    EndSwitch
EndFunc


Func _Exit()
   Exit
 EndFunc
 
Последнее редактирование:

Norm

Продвинутый
Сообщения
279
Репутация
74
Возьмите пример из справки и посмотрите, как там всё работает и так с каждым новым / не изученным элементом.
 

Norm

Продвинутый
Сообщения
279
Репутация
74
Код:
error: WM_HOTKEY(): undefined function.
GUIRegisterMsg($WM_HOTKEY, 'WM_HOTKEY')
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

Не находи функцию WM_HOTKEY


Код:
: error: Statement cannot be just an expression.
(GUICtrlRead($nCh3)=1)? GUICtrlSetState($iCount3,320): GUICtrlSetState($iCount3,128)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

Вот так правильно:
Код:
GUICtrlSetState($iCount3,((GUICtrlRead($nCh3)) ? 320 : 128))


Что конкретно не понятно с Radio?
Распишите немного понятнее, что Вы хотите получить, точнее что должно происходить, например при выборе Radio (аааа)
что при (bbbb) и что при (cccc)
Что должно конкретно произойти при нажатии на F6 и т.д.
 
Последнее редактирование:
Автор
zelich

zelich

Новичок
Сообщения
149
Репутация
0
Суть скрипта:
При нажатие на F6-F9 эмулировать нажатие различных клавиш.
Сейчас эти наборы клавиш хранится в отдельном файле и загружаются в скрипт при старте.
При нажатие Shift+F6 - Shift+F9 – Отображается окно ввода, где можно поменять строку которая будет эмулироватся.
Что я хочу:
Чтоб при нажатие Shift+F6 отображалось GUI окно. С 3-я Radio. 2-а из них с конкретными значениями, а 3-е с Input'ом.
И после выбора какого-то из них, при нажатие F6 эмулировалось нажатие этой "комбинации"
 

Norm

Продвинутый
Сообщения
279
Репутация
74
Это лишь рабочий вариант примера по Вашим условиям.
Вам лишь нужно встроить его в Ваш скрипт.
Для удобства тестирования я поменял F-клавиши
F3 - запускает окно настройки
F6 - вызывает функцию для высылаемого сообщения
Esc - завершает работу скрипта
Кнопки [X] и [Отмена] только закрывают окно настроек, не изменяя сделаных ранее настроек
При этом, если были изменены какие-то настройки Радио, то они вернутся на сохраненные ранее.
Изменение настроки сохраняются только при нажатии на [OK]

Код:
#include <GuiConstants.au3>

HotKeySet('{F3}', '_SET')
HotKeySet('{F6}', '_SEND')
HotKeySet('{Esc}', '_Exit')

Global $Send[3] = ["aaaaa", "aaaaa", 0]

Global $hGUI = GUICreate("Выражение 1:", 200, 150)
Global $aRadio[3][2] = [[GUICtrlCreateRadio("  aaaaa", 10, 10, 180, 20), "aaaaa"]]
GUICtrlSetState(-1, $GUI_CHECKED)
$aRadio[1][0] = GUICtrlCreateRadio("  bbbbb", 10, 40, 180, 20)
$aRadio[1][1] = "bbbbb"
$aRadio[2][0] = GUICtrlCreateRadio("", 10, 70, 15, 15)
$aRadio[2][1] = "ccccc"
$Input = GUICtrlCreateInput($aRadio[2][1], 30, 68, 160, 20)
GUICtrlSetState(-1, $GUI_DISABLE)
$iOK_Button = GUICtrlCreateButton("OK", 20, 100, 80, 20)
$iCancel_Button = GUICtrlCreateButton("Отмена", 110, 100, 80, 20)
GUISetState(@SW_HIDE, $hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $iCancel_Button
            $Send[1] = $Send[0]
            ControlCommand($hGUI,"", $aRadio[$Send[2]][0], "Check", "")
            GUISetState(@SW_HIDE, $hGUI)
        Case $aRadio[0][0], $aRadio[1][0]
            GUICtrlSetState($Input, $GUI_DISABLE)
        Case $aRadio[2][0]
            GUICtrlSetState($Input, $GUI_ENABLE)
         Case $iOK_Button
            For $nN = 0 To 2
                If GUICtrlRead($aRadio[$nN][0]) = $GUI_CHECKED Then
                    $Send[1] = ($nN = 2) ? (GUICtrlRead($Input)) : $aRadio[$nN][1]
                    $Send[0] = $Send[1]
                    $Send[2] = $nN
                    ExitLoop
                EndIf
            Next
            GUISetState(@SW_HIDE, $hGUI)
    EndSwitch
WEnd


Func _SET()
    GUISetState(@SW_SHOW, $hGUI)
EndFunc

Func _SEND()
    MsgBox(0,Default,$Send[1])
EndFunc

Func _Exit()
   Exit
EndFunc
 
Последнее редактирование:
Автор
zelich

zelich

Новичок
Сообщения
149
Репутация
0
Спасибо!
Буду встраивать!
 

Norm

Продвинутый
Сообщения
279
Репутация
74
Если не разобрались, то вот более удобный, для понимания, вариант.
Вам нужно только загнать Выши значения комбинаций клавиш в Массив $aRadio, а дальше всё само вставляется в окно настроек.
Код:
#include <GuiConstants.au3>

HotKeySet('{F3}', '_SET')
HotKeySet('{F6}', '_SEND')
HotKeySet('{Esc}', '_Exit')

Global $aRadio[3][2]
; Здесь присваюваются значения комбинаций клавиш из прочитанных файлов.
; ==================================  Например посредством For .. To ...
$aRadio[0][1] = "aaaaa"
$aRadio[1][1] = "bbbbb"
$aRadio[2][1] = "ccccc"
; ==================================

Global $Send[3] = [$aRadio[0][1], $aRadio[0][1], 0]
Global $hGUI = GUICreate("Выражение 1:", 200, 150)
$aRadio[0][0] = GUICtrlCreateRadio("  "& $aRadio[0][1], 10, 10, 180, 20)
GUICtrlSetState(-1, $GUI_CHECKED)
$aRadio[1][0] = GUICtrlCreateRadio("  "& $aRadio[1][1], 10, 40, 180, 20)
$aRadio[2][0] = GUICtrlCreateRadio("", 10, 70, 15, 15)
Global $Input = GUICtrlCreateInput($aRadio[2][1], 30, 68, 160, 20)
GUICtrlSetState(-1, $GUI_DISABLE)
Global $iOK_Button = GUICtrlCreateButton("OK", 20, 100, 80, 20)
Global $iCancel_Button = GUICtrlCreateButton("Отмена", 110, 100, 80, 20)
GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $iCancel_Button
            $Send[1] = $Send[0]
            ControlCommand($hGUI,"", $aRadio[$Send[2]][0], "Check", "")
            GUISetState(@SW_HIDE, $hGUI)
        Case $aRadio[0][0], $aRadio[1][0]
            GUICtrlSetState($Input, $GUI_DISABLE)
        Case $aRadio[2][0]
            GUICtrlSetState($Input, $GUI_ENABLE)
        Case $iOK_Button
            For $nN = 0 To 2
                If GUICtrlRead($aRadio[$nN][0]) = $GUI_CHECKED Then
                    $Send[1] = ($nN = 2) ? (GUICtrlRead($Input)) : $aRadio[$nN][1]
                    $Send[0] = $Send[1]
                    $Send[2] = $nN
                    ExitLoop
                EndIf
            Next
            GUISetState(@SW_HIDE, $hGUI)
    EndSwitch
WEnd


Func _SET()
    GUISetState(@SW_SHOW, $hGUI)
EndFunc

Func _SEND()
    MsgBox(0,Default,$Send[1])
EndFunc

Func _Exit()
   Exit
EndFunc
 
Последнее редактирование:
Автор
zelich

zelich

Новичок
Сообщения
149
Репутация
0
Спасибо!
Смог разобратся по первому варианту, а 2-й ещё понятнее!
 
Верх