C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Переключение языка, достали глюки XP..
** klen
Отправлено: 08.02.2006, 12:29


Не зарегистрирован







Всю жисть пользовался win2k. в силу нового приобретенного железа пришлось стать жервой XP (лично от себя — ГЛЮК!! может фильмы смотреть и можно на ней, но никак не олаживать софт).

Кроме прочих проблем одна уже достала в конец — мешает код писать. Через какоето время пропадает индикатор раскладок клавиатуры, после чего переключить клаву невозможно. Некоторых шаманских движений удается добится чтоб индикатор раскладок появлялся на десктопе отделной панелькой — которая нахер отделно от таскбара никому не впилась — мешает работь с обычными окнами. После попытки свернуть в трей ситуация повторяется — сворачивается в направлении трех извесных всем букв.

Я долго мучался и решил сам написать переключатель раскладок и вывести его на таскбар.
С канадачка не получилось — нашел только функцию ActivateKeyboardLayout — которая переключет раскладку для элементов управления созданных в потоке в котором она вызвана. Как переключит раскладку в чужом потоке, зная хендл главного окна?
olegenty
Отправлено: 08.02.2006, 14:00


Ветеран

Группа: Модератор
Сообщений: 2412



сижу тоже на XP. плююсь. но этой проблемы не имею. т.е. да, индикатора нет, но у меня стоит Punto Switcher, который никуда никогда не пропадает.
klen
Отправлено: 08.02.2006, 16:34


Машинист паровоза

Группа: Участник
Сообщений: 239



Вопрос для меня уже просто принципиальный кто победит — я или XP. Всеравно нада разобратся как выполняется переключение раскладок одним процессом для другого — вдруг понадобится или кто спроситю

Идеи есть? у меня пока никаких.
olegenty
Отправлено: 08.02.2006, 16:57


Ветеран

Группа: Модератор
Сообщений: 2412



в Win95 хукалось HSHELL_LANGUAGE и можно было чё-нить попробовать колдонуть. в NT такой штуки нет. навскидку — не знаю, в Win32 SDK ничего путного тоже не вижу. прямая дорога на MSDN.microsoft.com
vitavita
Отправлено: 08.02.2006, 22:53


Дежурный стрелочник

Группа: Участник
Сообщений: 59



Как пpи стаpте пpогpаммы включить киpиллицу

// Напишите этот в начале программы:
ActivateKeyboardLayout(LoadKeyboardLayout(IntToHex(MAKELANGID
(LANG_RUSSIAN, SUBLANG_DEFAULT) ,8).c_str(), 0), 0);
Gal
Отправлено: 10.02.2006, 17:20


Станционный диспетчер

Группа: Участник
Сообщений: 124



Я бы сделал так
CODE

void __fastcall TMainForm::FormCreate(TObject *Sender)
{
KeyAtom = GlobalAddAtom( "HotKey" );
if(!RegisterHotKey( Handle, KeyAtom, MOD_CONTROL , VK_SHIFT ))
{
MessageBox(0, "Can't register!", "RegisterHotKey", MB_OK);
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::OnHotKeyPress(TMessage &Message)
{
unsigned char VirtualKey;
UINT ModKey;

ModKey = LOWORD(Message.LParam);
VirtualKey = HIWORD(Message.LParam);

if((ModKey & MOD_CONTROL) & (VirtualKey == VK_SHIFT))
{
// Здесь переклюхение на следующюю раскладку
//Меняю иконку Tray на соответствующую текущему языку
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormDestroy(TObject *Sender)
{
UnregisterHotKey( Handle, KeyAtom );
GlobalDeleteAtom( KeyAtom );
}


В H — файле в классе TForm
CODE

private: // User declarations
ATOM KeyAtom;
void __fastcall OnHotKeyPress(TMessage &Message)

Ну и естественно, что форма при загрузке падает в Tray
Функцию переключения следующей раскладки см. в MSDN

Отредактировано Gal — 10/02/2006, 17:21

Вернуться в Вопросы программирования в C++Builder