Форум » [x]Harbour » Нужна помощь - вывести на консольиндикатор расскладки калавиатуры » Ответить

Нужна помощь - вывести на консольиндикатор расскладки калавиатуры

Просто Вася: Есть ли возможность (пример программы) вывести индикатор какая течущая расскладка клавиатуры. Роботаю в Harbour

Ответов - 44, стр: 1 2 3 All

Петр: Просто Вася пишет: Есть ли возможность (пример программы) вывести индикатор какая течущая расскладка клавиатуры. Есть возможность используя Win API узнать какая раскладка клавиатуры активна, а как вывести индикатор - это дело техники и вкуса Можно использовать, как образец, пример Григория Филатова LangIndicator из поставки MiniGUI Ex. Фрагменты кода взяти именно оттуда: Local nNewMode := GetKeyboardMode() if nNewMode != nOldMode nOldMode := nNewMode DO CASE CASE nNewMode == 1049 // Russian CASE nNewMode == 1033 // English CASE nNewMode == 1058 // Ukrainian CASE nNewMode == 1031 // German CASE nNewMode == 1034 // Spanish CASE nNewMode == 1036 // French CASE nNewMode == 1045 // Polish OTHERWISE ENDCASE Т.е. с помощью GetKeyboardMode() получаем текущий режим клавиатуры для foreground окна ( окна с которым работает пользователь) и решаем что с этим делать. А вот и реализация функции GetKeyboardMode() #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" HB_FUNC( GETKEYBOARDMODE ) { HKL kbl; HWND CurApp; DWORD idthd; int newmode; CurApp=GetForegroundWindow(); idthd=GetWindowThreadProcessId(CurApp,NULL); kbl=GetKeyboardLayout(idthd); newmode=(int)LOWORD(kbl); hb_retnl(newmode); } #pragma ENDDUMP

Просто Вася: Пётр, большое спасибо за подсказку, но я только начал переход с Сlipper на Harbour Все свои программы (наработки) котрые накопились с 1990 года ставлю на win платформу. Большое спасибо (даже огромное) кто поддерживает этот проект. Я только разобрался как исходные тексты сlippera (Sum87) откампелировать под Harbour + Borland C. Уже разобрался с печатью. Только у меня дальше досовское консольное окно. То что ты написал выше для меня сложно понять. Куда и как всё это лепить. Я не пользуюсь MiniGUI. У меня Harbour beta build 0.99-3 intl версия. Прошу не смеятся, на clipper пишу довольно давно 17 лет, до этого времени написано много задач по управлению базами даных. Если тебя не затруднит мучится с таким нюбом по Harbour как я,(тяжёлое досовское наследие) расскажи поледовательно как и куда чё впихивать. Заранее благодарен. С наступающими тебя праздниками. С уважение Игорь.

Andrey: Просто Вася пишет: Все свои программы (наработки) котрые накопились с 1990 года ставлю на win платформу. Советую переходить на xHarbour, т.к. он более совместим с Clipper'om Как перенести проект под xXarbour смотри http://www.clipper.fastbb.ru/?1-4-165-00000089-000-0-0-1160258031 И вообще прочитай что тут написано и сразу легче станет


Петр: Просто Вася пишет: Куда и как всё это лепить. Всё это надо просто запихнуть в один файл, например keyblayout.prg и откомпилировать /* keyblayout.prg */ PROCEDURE main() LOCAL nMode := GetKeyboardMode() LOCAL cLang SWITCH nMode CASE 1049 cLang := "RU" EXIT CASE 1033 cLang := "EN" EXIT CASE 1058 cLang := "UA" EXIT OTHERWISE cLang := "??" END SWITCH ? "Текущая раскладка: ", cLang RETURN #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" HB_FUNC( GETKEYBOARDMODE ) { HKL kbl; HWND CurApp; DWORD idthd; int newmode; CurApp=GetForegroundWindow(); idthd=GetWindowThreadProcessId(CurApp,NULL); kbl=GetKeyboardLayout(idthd); newmode=(int)LOWORD(kbl); hb_retnl(newmode); } #pragma ENDDUMP /* end-of-file */ Чуть позже появится понимание, как это работает Если коротко и без деталей - то Harbour транслирует свой код в соответствующий C код и записывает его в *.с файл (keyblayout.с), который потом обрабатывается (компилируется, линкуется) используемым С-компилятором ( в данном случае bcc32 ). Код, который находится в prg файле между директивами #pragma BEGINDUMP .. #pragma ENDDUMP функция написанная на языке С - не транслируется, а просто переносится без изменений в результирующий С файл. Я не пользуюсь MiniGUI В данном случае не имеет значения используется GUI или консоль. Но я рекомендую скачать MiniGUI Ex. (ссылку для скачивания можно найти на этом форуме), во-первых в составе Minigui можно найти Harbour Devel build 1.1-1, во-вторых много интересных и полезных примеров, исходников с использованием Win API, которые можно использовать и для GUI или для консоли. Что касается выбора Harbour или xHarbour, то лично я остановился на Harbour и ничуть не жалею. Для меня совместимость с Clipper'om стоит не на первом месте, но единственное преимущество xHb в совместимости - это чуть лучшая реализация TBrowse, а если взять к примеру поддержку оконной системы из CT - xHarbour отдыхает. Просто Вася пишет: С наступающими тебя праздниками. Спасибо ! Взаимно !

Просто Вася: Впихнул значит я энтот код, что ты написал, в свою програму. Вызов этого модуля прописал в модуль опроса клавиатуры. Показал где на экране высвечивать cLang. Откампилирова, пролинковал, загрузил свою прогу. Увидел на екране "EN" но никакой реакции на смену расскладок. В виндовзе расскладка меняется на консоле стоит "EN". Не знаю что делать, а как мало для счастья человека, чтоб значок расскладки на экране менялся. Видать что-то не работает в функции GETKEYBOARDMODE. Пётр - помоги если можешь, проверь правильность работы модуля. Если верхняя часть мне понятна то то, что между #pragma BEGINDUMP .. #pragma ENDDUMP тёмный лес. ПАМАГИТЕ Л Ю Д И................

Петр: Не хочу повторяться, но я писал: "Есть возможность используя Win API узнать какая раскладка клавиатуры активна, а как вывести индикатор - это дело техники и вкуса". Как ты себе представляешь мою помощь? GETKEYBOARDMODE работает правильно, но она всего лишь узнает какая раскладка клавиатуры активна в момент вызова функции. Как отслеживать состояние клавиатуры с помощью этой функции - использовать цикл, таймер, background task или MT в xHarbour - это дело техники. Как и куда выводить - дело вкуса. Мой совет - делай то, что умеешь и так, как умеешь. И скачай таки MiniGUI. Там найдешь функции (клас) для работы с таймером.

Простo Вас: Для проверки я сделал маленький модуль по циклу. Может я чегото не понимаю, но индикатор расскладки не меняется. PROCEDURE MAIN() i=0 DO WHILE .T. DO keyblayout IF i=27 && Выход из цикла EXIT ENDIF i=INKEY() ENDDO RETURN PROCEDURE keyblayout() LOCAL nMode := GETKEYBOARDMODE() LOCAL cLang SWITCH nMode CASE 1049 cLang := "RU" EXIT CASE 1033 cLang := "EN" EXIT CASE 1058 cLang := "UA" EXIT OTHERWISE cLang := "??" END SWITCH ? "Текущая раскладка: ", cLang RETURN #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" HB_FUNC( GETKEYBOARDMODE ) { HKL kbl; HWND CurApp; DWORD idthd; int newmode; CurApp=GetForegroundWindow(); idthd=GetWindowThreadProcessId(CurApp,NULL); kbl=GetKeyboardLayout(idthd); newmode=(int)LOWORD(kbl); hb_retnl(newmode); } #pragma ENDDUMP *............................... может я чего-то не дописал, функция работает постоянно в цикле, но реакции на смену расскладки нет. Ещё интересно что я заметил, иногда на старте высвечивается расскладка "EN" иногда "RU". Пробовал функцию HB_FUNC( GETKEYBOARDLAYOUTNAME ) { char sBuff[KL_NAMELENGTH]; GetKeyboardLayoutName( (LPTSTR)sBuff ); hb_retc(sBuff); } тоже не покатило..

Петр: Да все правильно - т.е. ничего не правильно К сожалению с консолью этот код не работает, хотя в GUI все Ок. Если для тебя так важно вывести этот индикатор в консоли то надо поступать по другому. К примеру так #define KL_PREV 0 #define KL_NEXT 1 PROCEDURE main() LOCAL i := 0 LOCAL sVar := space(20) CLEAR SCREEN DO WHILE .T. keyblayout( i := INKEY() ) IF i == 27 && Выход из цикла EXIT ENDIF ENDDO RETURN PROCEDURE keyblayout( key ) STATIC nLayout := 0 LOCAL cLang IF key == -1 //F2 nLayout := ActivateKeyboardLayout(KL_NEXT) ELSEIF key == -2 //F3 nLayout := ActivateKeyboardLayout(KL_PREV) ENDIF nLayout := ActivateKeyboardLayout(KL_NEXT) ActivateKeyboardLayout(KL_PREV) SWITCH nLayout CASE 1049 cLang := "RU" EXIT CASE 1033 cLang := "EN" EXIT CASE 1058 cLang := "UA" EXIT OTHERWISE cLang := "??" END SWITCH ? "Текущая раскладка: ", cLang RETURN #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" HB_FUNC( ACTIVATEKEYBOARDLAYOUT ) { HKL kbl; kbl = ActivateKeyboardLayout( (HKL) hb_parni(1), 0 ); hb_retni(LOWORD(kbl)); } #pragma ENDDUMP Сразу предупреждаю, что код не совсем рабочий - просто для примера и ActivateKeyboardLayout() надо переписать по другому, это я так, на скорую руку набросал. Сегодня уже думать не хочется

rvu: Да, в консоли GETKEYBOARDMODE выдает только 1033. Нет какого-нибудь способа в консоли посмотреть раскладку?

saulius: Proc Main() ? "GetConsoleCP = ", GetConsoleCP() ? "GetConsoleOutputCP = ", GetConsoleOutputCP() Return #pragma BEGINDUMP #include <windows.h> HB_FUNC( GETCONSOLECP ) { hb_retnl( GetConsoleCP() ); } HB_FUNC( GETCONSOLEOUTPUTCP ) { hb_retnl( GetConsoleOutputCP() ); } #pragma ENDDUMP

TakOj: Andrey пишет: Советую переходить на xHarbour, т.к. он более совместим с Clipper'om Как перенести проект под xXarbour смотри http://www.clipper.fastbb.ru/?1-4-165-00000089-000-0-0-1160258031 И вообще прочитай что тут написано и сразу легче станет Andrey, ссылка нерабочая. А очень хочется почитать, что там было написано, чтобы сразу стало легче. Я ведь тоже, как Игорь, только-только перехожу на xHarbour. Можно ли восстановить эту ссылку? Спасибо!

rvu: saulius пишет: ? "GetConsoleCP = ", GetConsoleCP() ? "GetConsoleOutputCP = ", GetConsoleOutputCP() Всегда выдается: 866 866 Могу предположить, что это кодовая страница. Мне нужно знать какой язык у меня включен в настоящее время: русский или английский.

fil: Getlangstate(). Если возвращает 0 - русский

Andrey: TakOj пишет: Andrey, ссылка нерабочая. А очень хочется почитать, что там было написано, чтобы сразу стало легче. Я ведь тоже, как Игорь, только-только перехожу на xHarbour. Можно ли восстановить эту ссылку? Я в осадке ..... Это что форум урезали, и давно это происходит ????? Я даже не знаю как восстановить ссылку, это к модераторам. Но я тоже надеялся, что с форума ничего не пропадает, а зря....

rvu: fil пишет: Getlangstate(). Если возвращает 0 - русский А где эту функцию взять? Не нашел такую.

Dima: Andrey пишет: Я в осадке ..... Это что форум урезали я ни чего не трогал и не удалял , возможно перенес , но не тёр 100 пудово.

TakOj: Dima Dima! А это ваш сайт "http://spravki.net.ru/clipper/"? Если да, то вопрос по ссылке на "Программа просмотра NG под Windows". Там что то совсем другое.

fil: rvu А где эту функцию взять? Не нашел такую. давай адрес

PSP: fil пишет: давай адрес Если не трудно: mail.trash(AT)mail.ru

rvu: rvu@ru.ru Только в теме письма что-нибудь напиши, а то на эту почту столько спама валится



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