Что нового

Переключение раскладки для решения проблемы Send

winkot

Новичок
Сообщения
169
Репутация
0
Как известно, команда Send не работает нормально, если перед запуском скрипта не была включена английская раскладка клавиатуры. Здесь предлагается для этого использовать
Код:
#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>
#include <WinAPIEx.au3>

_FixAccelHotKeyLayout()

HotKeySet("^+e", "_Quit")

$hGUI = GUICreate("Fix for hotkey/Accelerators assign problem", 300, 200)
$nEdit = GUICtrlCreateEdit("", 20, 40, 260, 120)

$nDummy = GUICtrlCreateDummy()
Dim $aAccelKeys[1][2] = [["^a", $nDummy]]
GUISetAccelerators($aAccelKeys)

GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nDummy
            _GUICtrlEdit_SetSel($nEdit, 0, -1)
    EndSwitch
WEnd

Func _Quit()
    Exit
EndFunc

Func _FixAccelHotKeyLayout()
    Static $iKbrdLayout, $aKbrdLayouts
 
    If Execute('@exitMethod') <> '' Then
        Local $iUnLoad = 1
     
        For $i = 1 To Ubound($aKbrdLayouts) - 1
            If Hex($iKbrdLayout) = Hex('0x' & StringRight($aKbrdLayouts[$i], 4)) Then
                $iUnLoad = 0
                ExitLoop
            EndIf
        Next
     
        If $iUnLoad Then
            _WinAPI_UnloadKeyboardLayout($iKbrdLayout)
        EndIf
     
        Return
    EndIf
 
    $iKbrdLayout = 0x0409
    $aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
    _WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)
 
    OnAutoItExitRegister('_FixAccelHotKeyLayout')
EndFunc


а чем он лучше простейшего варианта ?
Код:
_WinAPI_SetKeyboardLayout(WinGetHandle("[ACTIVE]"), 0x0409)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
команда Send не работает нормально, если перед запуском скрипта не была включена английская раскладка клавиатуры
Проблема не в этом.
Функции Send и ControlSend имитируют нажатия клавиш. Следовательно, целевое приложение обработает эти клавиши под свою текущую раскладку. Поэтому, для корректной работы этих функций нужно синхронизировать раскладку скрипта и приложения, то есть сделать их одинаковыми.

Почитайте эту тему
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Проблема не в этом.
Функции Send и ControlSend имитируют нажатия клавиш. Следовательно, целевое приложение обработает эти клавиши под свою текущую раскладку. Поэтому, для корректной работы этих функций нужно синхронизировать раскладку скрипта и приложения, то есть сделать их одинаковыми.
В целом справедливое замечание, но есть нюанс. Если целевое приложение умеет понимать нажатие тех же клавиш в различных раскладках, это всё ещё не означает, что эти функции приведут к результату в различных раскладках (при этом различие в результате по моему опыту стало другим после обновления версии AutoIt). Например, нажатие на <Ctrl>+v копирует из буфера обмена в активное приложение при любой раскладке, а имитация нажатий - отнюдь.
Сообщение автоматически объединено:

Как известно, команда Send не работает нормально, если перед запуском скрипта не была включена английская раскладка клавиатуры.
И не только перед запуском скрипта. Если в скрипте есть переназначения горячих клавиш, то происходит новая синхронизация раскладок. Причём это работает и в полезную сторону. Иногда я этим пользуюсь, когда забываю переключить раскладку перед запуском скрипта, а выходить из него не хочется, если в скрипте у меня есть горячая клавиша для постановки остальных горячих клавиш на паузу. Ставлю на паузу, переключаю раскладку, снимаю с паузы. Перед снятием с паузы бывает полезно нажать какую-либо нейтральную клавишу (например, стрелку), если раскладка переключалась клавишами-модификаторами. Если этого не сделать, то клавиша-модификатор может не успеть выключиться.
 
Последнее редактирование:
Автор
W

winkot

Новичок
Сообщения
169
Репутация
0
для корректной работы этих функций нужно синхронизировать раскладку скрипта и приложения
Не уверен. Например, в Notepad я работаю с русской раскладкой. не меняя ее нажимаю Ctrl+S и все прекрасно сохраняется. Хотя раскладки не синхронизированы.

А в отношении различных способов переключения клавиатуры есть какие-нибудь мысли? В чем их достоинства и недостатки?
Сообщение автоматически объединено:

Если в скрипте есть переназначения горячих клавиш
Что значит "переназначения горячих клавиш"?
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
а чем он лучше простейшего варианта ?
Например тем, что если у меня русская раскладка по умолчанию я хотел бы её иметь, а не англ., а потом ещё исправлять то, что напечатал.
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Что значит "переназначения горячих клавиш"?
Можно не только переназначать, а даже вовсе сбрасывать ранее установленные горячие клавиши. В справке об этом сказано.
Код:
HotKeySet()
Например, я в скриптах часто использую горячую клавишу, ставящую на паузу остальные горячие клавиши, чтобы временно высвободить клавиатуру под другие нужды. Эта особая горячая клавиша инвертирует флаг состояния, в зависимости от значения которого либо устанавливает функции на остальные горячие клавиши, либо сбрасывает. Функцию установки вызываю в начале скрипта напрямую без горячей клавиши. Очень удобно. Так вот, если скрипт уже работает, а имеется конфликт с раскладкой (который был либо в начале работы скрипта, либо появился во время одной из таких пауз), то на дополнительной паузе проблема устраняется.
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Ничего не понял
если я знаю что у меня русский язык в раскладке, я запускаю программу начинаю писать на русском языке смотря на клавиатуру, а потом выясняется что автор программы просто поменял язык на англиский, чтобы зарегистрировать горячие клавиши. А что мешает вернуть язык на то, который пользователь включил? Ведь если я напишу абзац на русском языке в английской раскладке я не буду этому рад. Поэтому я хотел бы чтобы автор программы не просто переключил язык ради себя, а ещё и вернул его обратно в тот, который был текущим. Ваш код этого не решает.
И если что - раньше не было это функции. Естественно проще когда она есть.
 
Верх