Автор Тема: Обход проблемы с HotKeySet/Accelerators при разных раскладках клавиатуры  (Прочитано 21476 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Известно что при использований HotKeySet или GUISetAccelerators, нужно полагаться на текущую раскладку клавиатуры, т.е если мы к примеру задаём HotKeySet("^!s", "_Func"), то работать оно будет только если перед запуском скрипта раскладка клавиатуры по умолчанию была английская.
Следующий пример показывает как это можно обойти. Идея в том, чтобы на этапе запуска скрипта, раскладка клавиатуры для нашего приложения поменялась на английскую, тогда у нас не будет проблем, даже если мы переключили раскладку на русскую (или любую другую раскладку), заданные клавиши будут работать в любом случае.

Код: AutoIt [Выделить]
#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

« Последнее редактирование: Май 05, 2016, 03:23:15 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR,
В библиотеке WinAPIEx.au3 есть функция с таким же названием. ИМХО, имеет смысл переименовать Вашу очень полезную функцию.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808

  • Автор темы
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
madmasles  [?]
Цитировать
имеет смысл переименовать Вашу очень полезную функцию
Спасибо, переименовал.

Оффлайн agikon [?]

  • Новичок
  • *
  • Сообщений: 789
  • Репутация: 16
    • Награды
  • Версия AutoIt: 3.3.12.0
а что если два скрипта одновременно работают вот с этой функцией то проблем не будет? или что-то изменять надо?

а то ж получается что эти строчки в двух скриптах одинаковые.
Код: AutoIt [Выделить]
Local  $aRet = DllCall("user32.dll", "long", "LoadKeyboardLayoutW", "wstr", Hex($sLayoutID, 8), "int", 0)

DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $aRet[0])


или не надо ничего изменять?

Русское сообщество AutoIt


Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808

  • Автор темы
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
agikon  [?]
Цитировать
а что если два скрипта одновременно работают вот с этой функцией то проблем не будет?
Не должно быть.

Оффлайн agikon [?]

  • Новичок
  • *
  • Сообщений: 789
  • Репутация: 16
    • Награды
  • Версия AutoIt: 3.3.12.0
понятно.

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

обьясните пожалуйста.

Оффлайн Ganibal95 [?]

  • GreenBytes
  • AutoIt Гуру
  • *****
  • Сообщений: 865
  • Репутация: 236
  • Пол: Мужской
  • GreenBytes
    • GreenBytes
    • Награды
  • Версия AutoIt: 3.3.14.0
Помоему только для скрипта английская...  :)

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808

  • Автор темы
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
agikon
Меняется раскладка только для текущего скрипта, в этом и вся идея (и это кстати написано в первом сообщений темы).

Лучше 100 раз проверить, глядишь и вопросы отпадут ;)

Русское сообщество AutoIt


Оффлайн agikon [?]

  • Новичок
  • *
  • Сообщений: 789
  • Репутация: 16
    • Награды
  • Версия AutoIt: 3.3.12.0

Оффлайн madcrow [?]

  • Новичок
  • *
  • Сообщений: 1
  • Репутация: 0
  • Пол: Мужской
    • Награды
а для обратного перехода с английской на русскую раскладку клавиатуры, использовать ту же команду?(бывает что и такое надобоно)) :stars:

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808

  • Автор темы
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
madcrow  [?]
Цитировать
а для обратного перехода с английской на русскую раскладку клавиатуры, использовать ту же команду?
Да:
Код: AutoIt [Выделить]
_WinAPI_LoadKeyboardLayoutEx(0x0419)


Оффлайн Dima1337 [?]

  • Новичок
  • *
  • Сообщений: 154
  • Репутация: 17
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Доброго времени суток.
Опишу проблему: У меня две раскладки, русская и французская.
При запуске в языковое меню добавляется английская раскладка. И после завершения работы скрипта не исчезает  (Только при перезагрузке). Как сделать что бы она исчезала после завершения скрипта?

Правильный вопрос - полдела!

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808

  • Автор темы
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Dima1337  [?]
Цитировать
При запуске в языковое меню добавляется английская раскладка. И после завершения работы скрипта не исчезает  (Только при перезагрузке). Как сделать что бы она исчезала после завершения скрипта?
Хороший вопрос... ещё интереснее, так это почему она там появляется...

Оффлайн Dima1337 [?]

  • Новичок
  • *
  • Сообщений: 154
  • Репутация: 17
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
ещё интереснее, так это почему она там появляется...
Ну вопрос не ко мне, я запустил скрипт из шапки темы ничего не меняя...

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7808

  • Автор темы
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Как вариант:

Код: AutoIt [Выделить]

Но если в системе не установлена английская раскладка, то ввод будет тот же что установлен по умолчанию в системе.
Соответственно г.клавиши не сработают.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
18 Ответов
19771 Просмотров
Последний ответ Ноябрь 20, 2014, 14:29:02
от Crusaderman
11 Ответов
9587 Просмотров
Последний ответ Январь 16, 2017, 11:04:47
от Garrett
12 Ответов
6953 Просмотров
Последний ответ Сентябрь 19, 2011, 12:13:28
от Trans
11 Ответов
6073 Просмотров
Последний ответ Июль 27, 2012, 13:08:55
от AZJIO
14 Ответов
4901 Просмотров
Последний ответ Январь 22, 2013, 13:39:01
от CreatoR
5 Ответов
2641 Просмотров
Последний ответ Апрель 04, 2013, 18:58:36
от InnI
18 Ответов
9119 Просмотров
Последний ответ Апрель 22, 2013, 18:14:54
от Yashied
5 Ответов
2909 Просмотров
Последний ответ Октябрь 08, 2013, 15:41:07
от CreatoR
2 Ответов
1364 Просмотров
Последний ответ Март 29, 2014, 03:09:59
от agikon
0 Ответов
1049 Просмотров
Последний ответ Апрель 02, 2015, 16:13:06
от madmasles