Форум » [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 Только в теме письма что-нибудь напиши, а то на эту почту столько спама валится

fil: rvu и PSP к ночи из дома перешлю на работе инет подох

PSP: Ok. Пасиб.

rvu: Спасибо!

rvu: Не могу разобраться. Насколько я понял, нужно это прописать в программе: DLL32 FUNCTION GetLangState() AS _INT ; PASCAL LIB "SUPP\Langenru.DLL" Компилятор выдает "syntax error at 'FUNCTION'".

fil: rvu В любом .prg Вашего проекта вне всяких процедур. Тока SUPP\ убрать(это путь где лежит DLL)

rvu: fil пишет: В любом .prg Вашего проекта вне всяких процедур. Тока SUPP\ убрать(это путь где лежит DLL) Так и делал. Не пойму почему не работает. При компиляции пишет: Error E0030 Syntax error: "syntax error at 'FUNCTION'"

Петр: Вызов функции из dll в стиле FWH #include "hbdll.ch" делали?

rvu: Петр, спасибо! Я догадывался что чего-то не хватает, только не знал чего.

rvu: fil пишет: Getlangstate(). Если возвращает 0 - русский Возвращает и при английском и при русском 1. Может она тоже в консоли не работает?

fil: rvu Не знаю, в консоли не работал

fil: rvu Смотри регисстр HKEY_CURRENT_USER PowerCfg sLanguage RUS/ENG

Dima: Петр пишет: #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 Действительно что то не то ;) Можешь нормально эту функцию написать ?

Loach: Изините, а мона своих 2 копейки? У мну вот так работает: HB_FUNC( SMENKL ) { TCHAR m_PreviousLayout[KL_NAMELENGTH] ; LPSTR szMsg = ""; GetKeyboardLayoutName(m_PreviousLayout); if( PCOUNT() ) { szMsg = _parc( 1 ); if ( ( *(szMsg) == 'R' ) { LoadKeyboardLayout( "00000419", KLF_ACTIVATE ) ; } else if ( ( *(szMsg) == 'E' ) { LoadKeyboardLayout( "00000409", KLF_ACTIVATE ) ; } } _retc(m_PreviousLayout); } Правда переключаю только RUS-ENG, но мну больше и не надо...

Dima: Loach пишет: У мну вот так работает у мну это собрать не получилось.....

Loach: Dima пишет: у мну это собрать не получилось.. Ооойй... посыпаю голову пеплом... Как-то скушался кусок кода... Вот так должно собраться: #PRAGMA BEGINDUMP #include "Windows.h" #include "ClipApi.h" HB_FUNC( SMENKL ) { TCHAR m_PreviousLayout[KL_NAMELENGTH] ; LPSTR szMsg = ""; GetKeyboardLayoutName(m_PreviousLayout); if( PCOUNT() ) { szMsg = _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 ) ; } } _retc(m_PreviousLayout); } #PRAGMA ENDDUMP А вызываю функцию примерно так: if !(smenkl()=='00000419') smenkl("RUS") endif

Dima: Loach Собралось. Применение ей пока не вижу. У меня в фоне крутится функция , откуда я и думал вызывать SMENKL Хотелось бы находясь в любом месте задачи при смене раскладки клавы отображать ее статус (rus/eng) , с помощью SMENKL я не вижу пока способа реализации.

Loach: Знасицца так. По поводу применения, так я применяю ету штуку несколько для другого: У меня бровзится база, в которой например 2 поля, если конкретно, то код болезни (латиница) и наименование заболевания (рус). Я пользую эту функцию, чтобы при смене сортировки для пользователя сразу менялась раскладка клавиатуры (для последующего seekа). Все для народа... По поводу Вашей задачи, то вызывая Smenkl() без параметров, обратно получаете текущую раскладку: если '00000419', то русская, если '00000409', - более английская. Ну и соответственно, вызываете из фоновой функции периодически Smenkl и отображаете полученное.... Или я чего-то не понял в постановке задачи...

Dima: Loach пишет: По поводу Вашей задачи, то вызывая Smenkl() без параметров Так и сделал , все время кажет 00000409

Pasha: Dima пишет: Хотелось бы находясь в любом месте задачи при смене раскладки клавы отображать ее статус (rus/eng) , Дима, а зачем дублировать функции windows ? Пусть она сама и показывает раскладку. А программу запускать не в полноэкранном, а в оконном режиме, чтобы была видна нижняя строка taskbar

Dima: Pasha Дело в том что программа консольная и запускается на мини ноуте , экран там очень маленький (ноты фирмы ASUS) Если еще и в окне сделать то будет мелковато ;) Да и не каждому объяснишь как настроить окно как надо. Впрочем подумаю , спасибо !!!

Loach: Dima пишет: Так и сделал , все время кажет 00000409 Ну не знаю, у меня все работает и на W98, и на W2k и есесенно на XP... Пы.Сы. У меня xHarbour 0.99.51+FWH 2.5 Может в этом дело? Хотя это же Сишная функция...

Dima: Loach Вот попробуй. Proc main() HB_IdleAdd({ @Test(), 100} ) SET BACKGROUND TASKS ON wait return *********** Func Test() LOCAL nOldRow := Row() LOCAL nOldCol := Col() @ 24,0 SAY smenkl() SetPos( nOldRow, nOldCol ) RETURN PS Возможно я что то делаю не так........

Loach: Dima пишет: Вот попробуй. Попробовал... Действительно нэ работает... Очевидно, все дело в консоли... Даже и не знаю что предложить...

rvu: Новых идей по теме не появилось?



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