AutoIt ControlCommand не работает должным образом

Я использую AutoIt, чтобы попытаться создать небольшое приложение с горячими клавишами для работы с Windows Journal, чтобы я мог быстро выбрать разные цвета.

Кажется, я очень близок и все же очень далек от достижения желаемого результата. Я использовал инструмент AutoIt, чтобы найти CommandID панели инструментов и идентификаторы цветов. Вот мой код:

    ControlCommand("[CLASS:JournalApp]","",113,"SendCommandID", 40178)

Моя проблема в том, что цвет не будет выбран. Он будет выбран в той степени, в которой у цвета будут скобки «выбора», но цвет, которым я рисую, все равно будет последним выбранным мной цветом.

Итак, я попытался возиться и обнаружил, что этот код:

    ControlCommand("[CLASS:JournalApp]","",113,"Check","")

Он действительно выберет цвет, но выберет только голубой цвет. Не знаю почему, но всегда выбирают именно этот цвет. Я не нашел способа объединить возможность выбора "SendCommandID" с возможностью проверки "Проверить"

Кроме того, это элемент управления ToolbarWin32.


person Klik    schedule 05.06.2013    source источник


Ответы (1)


Я сам разобрался.

Вот что я узнал:

ControlCommand("[CLASS:JournalApp]","",113,"Check","") 

Имеет серьезный недостаток в том, что нет возможности указать, какая кнопка будет проверяться. Сначала это казалось случайным, но после некоторой игры я заметил, что он делал это с определенной координатой относительно окна клиента. Почему? Я понятия не имею. Но, по крайней мере, это не случайно.

ControlCommand("[CLASS:JournalApp]","",113,"SendCommandID", 40178)

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

Вот мои решения:

Я огляделся и обнаружил, что AutoIt имеет библиотеку специально для работы с классами ToolBarWin32. Это библиотека от GuiToolbar.au3. Благодаря этому я обнаружил, что могу сделать несколько вещей. Во-первых, я мог отправлять щелчки по кнопкам и даже изменять их состояние. Я обнаружил, что изменение состояния кнопок ничего не влияет на запуск события, и щелчок работает, но у него есть слабость, заключающаяся в том, что оно заставляет мышь вздрагивать. Это не сработало, потому что мое перо было рядом с планшетом, поскольку оно имеет приоритет перед движением мыши. Поэтому мне пришлось отрывать перо от планшета, чтобы пользоваться горячими клавишами - не очень удобно. Вот мой код для этого решения:

if WinActive("[CLASS:JournalApp]") Then
    WinActivate("[CLASS:ToolbarWindow32; INSTANCE:2]", "")
    $cmdId = "401"&$hotKeys[$key-1+$shift]
    If $cmdId < 40172 or $cmdId > 40188 Then
        Return
    EndIf
    $hWnd = ControlGetHandle("[CLASS:JournalApp]", "", 113)
    _GUICtrlToolbar_ClickButton($hWnd, $cmdId)
EndIf

После этого я обнаружил, что родная программа AutoIt ControlClick() была намного полезнее, поскольку не заставляла мышь вообще вздрагивать. Он напрямую вызвал событие mouseclick. Так что в сочетании с красивой командой из библиотеки панелей инструментов решение стало намного более чистым. Вот:

if WinActive("[CLASS:JournalApp]") Then
    WinActivate("[CLASS:ToolbarWindow32; INSTANCE:2]", "")
    $cmdId = "401"&$hotKeys[$key-1+$shift]
    If $cmdId < 40172 or $cmdId > 40188 Then
        Return
    EndIf
    ConsoleWrite($hotKeys[$key-1])
    $hWnd = ControlGetHandle("[CLASS:JournalApp]", "", 113)

    ;get the coords of the button and control send a click
    local $btnCoords= _GUICtrlToolbar_GetButtonRect($hWnd, $cmdId)

    ControlClick("[CLASS:JournalApp]", "", "[CLASS:ToolbarWindow32; INSTANCE:2]","left",1,$btnCoords[0]+2,$btnCoords[1]+2)
EndIf
person Klik    schedule 05.06.2013