Форум » GUI » Программная смена языка ввода (раскладки) » Ответить

Программная смена языка ввода (раскладки)

rolt: Надо сделать чтобы на момент активации окошка для программы была активна украинская раскладка искал по форуму - нашол несколько тем по переключеню раскладки, но всё под консоль единственная в тему - http://clipper.borda.ru/?1-20-0-00000503-000-0-0-1137493600 но там готового решения нет смотрел HKL hRus = LoadKeyboardLayout('00000419', 0); SetActiveKeyboardLayout(hRus); но MiniGUI что такое SetActiveKeyboardLayout понятия не имеет :(

Ответов - 8

fil: http://clipper.borda.ru/?1-4-0-00000260-000-20-0

alex_II: На русскую я переключаюсь вот таким образом, думаю переделать на украинскую не составит труда ... IF !(smenkl()=='00000419') smenkl("RUS") ENDIF ... HB_FUNC(SMENKL) { TCHAR m_PreviousLayout[KL_NAMELENGTH] ; LPSTR szMsg = ""; GetKeyboardLayoutName(m_PreviousLayout); if( hb_pcount() ) { szMsg = hb_parc( 1 ); if ((*(szMsg) == 'R') && (*(m_PreviousLayout+7)!='1' )) { LoadKeyboardLayout("00000419", KLF_ACTIVATE) ; } else if ((*(szMsg) == 'E') && (*(m_PreviousLayout+7)!='0')) { LoadKeyboardLayout("00000409", KLF_ACTIVATE) ; } } hb_retc(m_PreviousLayout); } #pragma ENDDUMP

rolt: вот такой блок кода язык переключает, но не нахожу такой файлик ClipApi.h #PRAGMA BEGINDUMP #include "Windows.h" HB_FUNC(SMENKL) { TCHAR m_PreviousLayout[KL_NAMELENGTH] ; LPSTR szMsg = ""; GetKeyboardLayoutName(m_PreviousLayout); if( hb_pcount() ) { szMsg = hb_parc( 1 ); if ((*(szMsg) == 'R') && (*(m_PreviousLayout+7)!='1' )) { LoadKeyboardLayout("00000419", KLF_ACTIVATE) ; } else if ((*(szMsg) == 'E') && (*(m_PreviousLayout+7)!='0')) { LoadKeyboardLayout("00000409", KLF_ACTIVATE) ; } } hb_retc(m_PreviousLayout); } #pragma ENDDUMP и при линковке валятся предупреждения Warning W8065 main.prg 10: Call to function 'hb_pcount' with no prototype in function HB_FUN_SMENKL Warning W8065 main.prg 12: Call to function 'hb_parc' with no prototype in function HB_FUN_SMENKL Warning W8069 main.prg 12: Nonportable pointer conversion in function HB_FUN_SMENKL Warning W8065 main.prg 22: Call to function 'hb_retc' with no prototype in function HB_FUN_SMENKL Warning W8004 main.prg 6: 'szMsg' is assigned a value that is never used in function HB_FUN_SMENKL работаю с MiniGUI + ликновка BCC55


Pasha: rolt пишет: но не нахожу такой файлик ClipApi.h Вместо #include "clipapi.h" надо использовать #include "hbapi.h"

rolt: модифицировал под себя: #PRAGMA BEGINDUMP #include "Windows.h" HB_FUNC(UKR) { LoadKeyboardLayout("00020422", KLF_ACTIVATE) ; } HB_FUNC(RUS) { LoadKeyboardLayout("00000419", KLF_ACTIVATE) ; } HB_FUNC(ENG) { LoadKeyboardLayout("00000409", KLF_ACTIVATE) ; } HB_FUNC(RASKLADKA) { TCHAR m_PreviousLayout[KL_NAMELENGTH] ; GetKeyboardLayoutName(m_PreviousLayout); hb_retc(m_PreviousLayout); } #pragma ENDDUMP Переключаю теперь функциями rus() ukr() eng() В принципе можно было обойтись одной и ей в качестве аргумента передавать код раскладки, но так визуально понятнее. Для случая когда непонятно как звучит код нужной мне раскладки - замечательно идёт RASKLADKA() и без проблем при линковке :)

rolt: с hbapi.h количество предупреждений сократилось до двух, но вариант HB_FUNC(UKR) { LoadKeyboardLayout("00020422", KLF_ACTIVATE) ; } мне представляется лучше, хоть и переключает без проверки что сейчас включено Warning W8075 main.prg 13: Suspicious pointer conversion in function HB_FUN_SMENKL Warning W8004 main.prg 7: 'szMsg' is assigned a value that is never used in function HB_FUN_SMENKL #PRAGMA BEGINDUMP #include "Windows.h" #include "hbapi.h" HB_FUNC(SMENKL) { TCHAR m_PreviousLayout[KL_NAMELENGTH] ; LPSTR szMsg = ""; GetKeyboardLayoutName(m_PreviousLayout); if( hb_pcount() ) { szMsg = hb_parc( 1 ); if ((*(szMsg) == 'R') && (*(m_PreviousLayout+7)!='1' )) { LoadKeyboardLayout("00000419", KLF_ACTIVATE) ; } else if ((*(szMsg) == 'E') && (*(m_PreviousLayout+7)!='0')) { LoadKeyboardLayout("00000409", KLF_ACTIVATE) ; } else if ((*(szMsg) == 'U') && (*(m_PreviousLayout+7)!='2')) { LoadKeyboardLayout("00020422", KLF_ACTIVATE) ; } } hb_retc(m_PreviousLayout); } #pragma ENDDUMP

Григорьев Владимир: rolt пишет: Warning W8075 main.prg 13: Suspicious pointer conversion in function HB_FUN_SMENKL Warning W8004 main.prg 7: 'szMsg' is assigned a value that is never used in function HB_FUN_SMENKL #PRAGMA BEGINDUMP #include "Windows.h" #include "hbapi.h" HB_FUNC(SMENKL) { TCHAR m_PreviousLayout[KL_NAMELENGTH] ; LPSTR szMsg = ""; GetKeyboardLayoutName(m_PreviousLayout); if( hb_pcount() ) { szMsg = hb_parc( 1 ); if ((*(szMsg) == 'R') && (*(m_PreviousLayout+7)!='1' )) { LoadKeyboardLayout("00000419", KLF_ACTIVATE) ; } else if ((*(szMsg) == 'E') && (*(m_PreviousLayout+7)!='0')) { LoadKeyboardLayout("00000409", KLF_ACTIVATE) ; } else if ((*(szMsg) == 'U') && (*(m_PreviousLayout+7)!='2')) { LoadKeyboardLayout("00020422", KLF_ACTIVATE) ; } } hb_retc(m_PreviousLayout); } #pragma ENDDUMP Смысл предупреждения "Warning W8004 main.prg 7: 'szMsg' is assigned a value that is never used in function HB_FUN_SMENKL " довольно прозрачен. Вы объявляете указатель в строке LPSTR szMsg = ""; и присваиваете ему адрес строкового литерала. А далее значение этого указателя сразу же изменяете szMsg = hb_parc( 1 ); То есть инициализирующее значение указателя у вас нигде не используется, так что никакого смысла в его задании нет. Поэтому проще написать объявление этого указателя без инициализации его адресом строкового литерала. LPSTR szMsg; Что касается первого предупреждения компилятора, то, я думаю, оно относится к предложению szMsg = hb_parc( 1 );. Здесь надо смотреть объявление функции hb_parc, какой тип возвращаемого значения. Возможно, он отличен от LPSTR.

Григорьев Владимир: Также я хотел бы отметить: раз вы объявляете символьные массивы с помощью типа TCHAR, как, например, TCHAR m_PreviousLayout[KL_NAMELENGTH] ; то скорей всего в выражениях подобных следующему if ((*(szMsg) == 'R') && (*(m_PreviousLayout+7)!='1' )) следует писать if ((*(szMsg) == TEXT( 'R' ) ) && (*(m_PreviousLayout+7)!=TEXT( '1' ) ) )



полная версия страницы