** 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 |
|