Автор | Сообщение |
|
| |
Пост N: 1
Зарегистрирован: 16.12.07
|
|
Отправлено: 16.12.07 15:46. Заголовок: Нужна помощь - вывести на консольиндикатор расскладки калавиатуры
Есть ли возможность (пример программы) вывести индикатор какая течущая расскладка клавиатуры. Роботаю в Harbour
|
|
|
Ответов - 44
, стр:
1
2
3
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 326
Зарегистрирован: 09.10.06
|
|
Отправлено: 16.12.07 17:58. Заголовок: Просто Вася пишет: ..
Просто Вася пишет: цитата: | Есть ли возможность (пример программы) вывести индикатор какая течущая расскладка клавиатуры. |
| Есть возможность используя 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
|
|
|
|
| |
Пост N: 2
Зарегистрирован: 16.12.07
|
|
Отправлено: 17.12.07 21:29. Заголовок: Пётр, большое спасиб..
Пётр, большое спасибо за подсказку, но я только начал переход с Сlipper на Harbour Все свои программы (наработки) котрые накопились с 1990 года ставлю на win платформу. Большое спасибо (даже огромное) кто поддерживает этот проект. Я только разобрался как исходные тексты сlippera (Sum87) откампелировать под Harbour + Borland C. Уже разобрался с печатью. Только у меня дальше досовское консольное окно. То что ты написал выше для меня сложно понять. Куда и как всё это лепить. Я не пользуюсь MiniGUI. У меня Harbour beta build 0.99-3 intl версия. Прошу не смеятся, на clipper пишу довольно давно 17 лет, до этого времени написано много задач по управлению базами даных. Если тебя не затруднит мучится с таким нюбом по Harbour как я,(тяжёлое досовское наследие) расскажи поледовательно как и куда чё впихивать. Заранее благодарен. С наступающими тебя праздниками. С уважение Игорь.
|
|
|
|
| постоянный участник
|
Пост N: 378
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.12.07 22:02. Заголовок: Просто Вася пишет: ..
Просто Вася пишет: цитата: | Все свои программы (наработки) котрые накопились с 1990 года ставлю на win платформу. |
| Советую переходить на xHarbour, т.к. он более совместим с Clipper'om Как перенести проект под xXarbour смотри http://www.clipper.fastbb.ru/?1-4-165-00000089-000-0-0-1160258031 И вообще прочитай что тут написано и сразу легче станет
|
|
|
|
| постоянный участник
|
Пост N: 327
Зарегистрирован: 09.10.06
|
|
Отправлено: 18.12.07 03:40. Заголовок: Просто Вася пишет: ..
Просто Вася пишет: цитата: | Куда и как всё это лепить. |
| Всё это надо просто запихнуть в один файл, например 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 функция написанная на языке С - не транслируется, а просто переносится без изменений в результирующий С файл. В данном случае не имеет значения используется GUI или консоль. Но я рекомендую скачать MiniGUI Ex. (ссылку для скачивания можно найти на этом форуме), во-первых в составе Minigui можно найти Harbour Devel build 1.1-1, во-вторых много интересных и полезных примеров, исходников с использованием Win API, которые можно использовать и для GUI или для консоли. Что касается выбора Harbour или xHarbour, то лично я остановился на Harbour и ничуть не жалею. Для меня совместимость с Clipper'om стоит не на первом месте, но единственное преимущество xHb в совместимости - это чуть лучшая реализация TBrowse, а если взять к примеру поддержку оконной системы из CT - xHarbour отдыхает. Просто Вася пишет: цитата: | С наступающими тебя праздниками. |
| Спасибо ! Взаимно !
|
|
|
|
| |
Пост N: 3
Зарегистрирован: 16.12.07
|
|
Отправлено: 19.12.07 20:57. Заголовок: Впихнул значит я энт..
Впихнул значит я энтот код, что ты написал, в свою програму. Вызов этого модуля прописал в модуль опроса клавиатуры. Показал где на экране высвечивать cLang. Откампилирова, пролинковал, загрузил свою прогу. Увидел на екране "EN" но никакой реакции на смену расскладок. В виндовзе расскладка меняется на консоле стоит "EN". Не знаю что делать, а как мало для счастья человека, чтоб значок расскладки на экране менялся. Видать что-то не работает в функции GETKEYBOARDMODE. Пётр - помоги если можешь, проверь правильность работы модуля. Если верхняя часть мне понятна то то, что между #pragma BEGINDUMP .. #pragma ENDDUMP тёмный лес. ПАМАГИТЕ Л Ю Д И................
|
|
|
|
| постоянный участник
|
Пост N: 328
Зарегистрирован: 09.10.06
|
|
Отправлено: 19.12.07 23:03. Заголовок: Не хочу повторяться,..
Не хочу повторяться, но я писал: "Есть возможность используя Win API узнать какая раскладка клавиатуры активна, а как вывести индикатор - это дело техники и вкуса". Как ты себе представляешь мою помощь? GETKEYBOARDMODE работает правильно, но она всего лишь узнает какая раскладка клавиатуры активна в момент вызова функции. Как отслеживать состояние клавиатуры с помощью этой функции - использовать цикл, таймер, background task или MT в xHarbour - это дело техники. Как и куда выводить - дело вкуса. Мой совет - делай то, что умеешь и так, как умеешь. И скачай таки MiniGUI. Там найдешь функции (клас) для работы с таймером.
|
|
|
|
| |
Пост N: 1
Зарегистрирован: 20.12.07
|
|
Отправлено: 20.12.07 09:43. Заголовок: Для проверки я сдела..
Для проверки я сделал маленький модуль по циклу. Может я чегото не понимаю, но индикатор расскладки не меняется. 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); } тоже не покатило..
|
|
|
|
| постоянный участник
|
Пост N: 331
Зарегистрирован: 09.10.06
|
|
Отправлено: 20.12.07 23:18. Заголовок: Да все правильно - т..
Да все правильно - т.е. ничего не правильно К сожалению с консолью этот код не работает, хотя в 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() надо переписать по другому, это я так, на скорую руку набросал. Сегодня уже думать не хочется
|
|
|
|
| |
Пост N: 42
Зарегистрирован: 05.11.05
|
|
Отправлено: 11.02.08 20:53. Заголовок: Да, в консоли GETKEY..
Да, в консоли GETKEYBOARDMODE выдает только 1033. Нет какого-нибудь способа в консоли посмотреть раскладку?
|
|
|
|
| |
Пост N: 47
Зарегистрирован: 27.04.06
|
|
Отправлено: 11.02.08 22:37. Заголовок: Proc Main() ? "..
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
|
|
|
|
| |
Пост N: 10
Зарегистрирован: 10.02.08
|
|
Отправлено: 11.02.08 23:07. Заголовок: Andrey пишет: Совет..
Andrey пишет: Andrey, ссылка нерабочая. А очень хочется почитать, что там было написано, чтобы сразу стало легче. Я ведь тоже, как Игорь, только-только перехожу на xHarbour. Можно ли восстановить эту ссылку? Спасибо!
|
|
|
|
|
| |
Пост N: 43
Зарегистрирован: 05.11.05
|
|
Отправлено: 12.02.08 00:06. Заголовок: saulius пишет: ? ..
saulius пишет: цитата: | ? "GetConsoleCP = ", GetConsoleCP() ? "GetConsoleOutputCP = ", GetConsoleOutputCP() |
| Всегда выдается: 866 866 Могу предположить, что это кодовая страница. Мне нужно знать какой язык у меня включен в настоящее время: русский или английский.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 12.02.08 00:53. Заголовок: Getlangstate(). Если..
Getlangstate(). Если возвращает 0 - русский
|
|
|
|
| постоянный участник
|
Пост N: 478
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.02.08 04:27. Заголовок: TakOj пишет: Andrey..
TakOj пишет: цитата: | Andrey, ссылка нерабочая. А очень хочется почитать, что там было написано, чтобы сразу стало легче. Я ведь тоже, как Игорь, только-только перехожу на xHarbour. Можно ли восстановить эту ссылку? |
| Я в осадке ..... Это что форум урезали, и давно это происходит ????? Я даже не знаю как восстановить ссылку, это к модераторам. Но я тоже надеялся, что с форума ничего не пропадает, а зря....
|
|
|
|
| |
Пост N: 44
Зарегистрирован: 05.11.05
|
|
Отправлено: 12.02.08 05:54. Заголовок: fil пишет: Getlangs..
fil пишет: цитата: | Getlangstate(). Если возвращает 0 - русский |
| А где эту функцию взять? Не нашел такую.
|
|
|
|
| |
Пост N: 832
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.02.08 12:21. Заголовок: Andrey пишет: Я в о..
Andrey пишет: цитата: | Я в осадке ..... Это что форум урезали |
| я ни чего не трогал и не удалял , возможно перенес , но не тёр 100 пудово.
|
|
|
|
| |
Пост N: 13
Зарегистрирован: 10.02.08
|
|
Отправлено: 12.02.08 12:45. Заголовок: Dima Dima! А это в..
Dima Dima! А это ваш сайт "http://spravki.net.ru/clipper/"? Если да, то вопрос по ссылке на "Программа просмотра NG под Windows". Там что то совсем другое.
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 12.02.08 14:43. Заголовок: rvu А где эту функц..
rvu цитата: | А где эту функцию взять? Не нашел такую. |
| давай адрес
|
|
|
|
| постоянный участник
|
Пост N: 68
Зарегистрирован: 27.01.07
|
|
Отправлено: 12.02.08 14:49. Заголовок: fil пишет: давай ад..
fil пишет: Если не трудно: mail.trash(AT)mail.ru
|
|
|
|
| |
Пост N: 45
Зарегистрирован: 05.11.05
|
|
Отправлено: 12.02.08 14:55. Заголовок: rvu@ru.ru Только в ..
rvu@ru.ru Только в теме письма что-нибудь напиши, а то на эту почту столько спама валится
|
|
|
Ответов - 44
, стр:
1
2
3
All
[только новые]
|
|