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

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

Оффлайн CreatoR [?]

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

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

Код: 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 $aKbrdLayouts[0]
            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



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


AutoIt is simple, subtle, elegant.


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


Мои работы

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


Оффлайн Dima1337 [?]

  • Осваивающий
  • **
  • Сообщений: 180
  • Репутация: 21
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
CreatoR,
Большое спасибо  :)

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

Оффлайн Skif_off [?]

  • Новичок
  • *
  • Сообщений: 173
  • Репутация: 12
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR
AutoIt 3.3.8.1: если завершать скрипт с помощью Exit, то вылезает сообщение об ошибке в строке
Код: AutoIt [Выделить]
For $i = 1 To $aKbrdLayouts[0]

что $aKbrdLayouts[0] - не массив. Как можно пофиксить?


Добавлено: Ноябрь 03, 2015, 01:27:09
Если возможно, заодно сделать универсальной, заменив
Код: AutoIt [Выделить]
$iKbrdLayout = 0x0409

на полученный с помощью _WinAPI_GetKeyboardLayout()?
« Последнее редактирование: Ноябрь 03, 2015, 01:27:45 от Skif_off »

Оффлайн CreatoR [?]

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

  • Автор темы
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Skif_off  [?]
Цитировать
Как можно пофиксить?
Заменить
Код: AutoIt [Выделить]
Static $iKbrdLayout, $aKbrdLayouts

на
Код: AutoIt [Выделить]
Global $iKbrdLayout, $aKbrdLayouts


[?]
Цитировать
Если возможно, заодно сделать универсальной, заменив
Идея в том, чтобы загружать английскую раскладку, а не ту что установлена в системе.

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


Оффлайн Skif_off [?]

  • Новичок
  • *
  • Сообщений: 173
  • Репутация: 12
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR
Спасибо, так заработало.

Идея в том, чтобы загружать английскую раскладку, а не ту что установлена в системе.
Но в конце функции возвращается русская, если была включена
Код: AutoIt [Выделить]
$iKbrdLayout = 0x0409
$aKbrdLayouts = _WinAPI_GetKeyboardLayoutList()
_WinAPI_LoadKeyboardLayout($iKbrdLayout, $KLF_ACTIVATE)

А если в ОС нет русского 0x0409, а есть, например, греческий 0x0408? В этом смысле универсальная. Либо я просто не понял, как работает функция :)


Добавлено: Ноябрь 03, 2015, 02:23:53
Прошу прощения, дошло: 0x0409 - это и есть английский, переклинило с 0x0419.

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


 

Похожие темы

  Тема / Автор Ответов Последний ответ
18 Ответов
21073 Просмотров
Последний ответ Ноябрь 20, 2014, 14:29:02
от Crusaderman
11 Ответов
10489 Просмотров
Последний ответ Январь 16, 2017, 11:04:47
от Garrett
12 Ответов
7432 Просмотров
Последний ответ Сентябрь 19, 2011, 12:13:28
от Trans
0 Ответов
2076 Просмотров
Последний ответ Июль 21, 2012, 12:46:38
от madmasles
11 Ответов
6851 Просмотров
Последний ответ Июль 27, 2012, 13:08:55
от AZJIO
5 Ответов
2987 Просмотров
Последний ответ Апрель 04, 2013, 18:58:36
от InnI
18 Ответов
10340 Просмотров
Последний ответ Апрель 22, 2013, 18:14:54
от Yashied
5 Ответов
3162 Просмотров
Последний ответ Октябрь 08, 2013, 15:41:07
от CreatoR
2 Ответов
1546 Просмотров
Последний ответ Март 29, 2014, 03:09:59
от agikon
0 Ответов
1193 Просмотров
Последний ответ Апрель 02, 2015, 16:13:06
от madmasles