Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Экранная клавиатура 
:(
    Опции темы
zheka0906
Дата 25.3.2011, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 24.3.2011

Репутация: нет
Всего: нет



Доброго времени суток! Пишу нечто вроде Экранной Клавиатуры на WinApi в VS8. Cуть проблемы состоит в следующем:
допустим, есть два сторонних окна,например офис и блокнот. В офисе раскладка стоит русская, в блокноте - английская.
Если мы будем щелкать поочереди на эти окна, в моем приложении должна меняться раскладка с русской на английскую, и наоборот.
Обрабатываю сообщения WM_KILLFOCUS,WM_ACTIVATE,WM_ACTIVATEAPP, но нужного результата не наблюдается. Раскладка определяется только после того как кликну на свое приложение...И вместо положенных символов на кнопках выводится аброкадабра...очень прошу помочь, это мой курсач, сроки поджимают...Вот собственно код:

Код

//свое окно создаю вот так:
    hWnd=CreateWindowExA(WS_EX_TOPMOST | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW , szProgName,"Virtua",/*WS_OVERLAPPEDWINDOW|*/WS_VISIBLE | DS_SETFONT |
        DS_MODALFRAME | DS_SETFOREGROUND| DS_3DLOOK | DS_FIXEDSYS|WS_CAPTION |WS_POPUPWINDOW| WS_SYSMENU,80,100,700,250,(HWND)NULL,(HMENU)NULL,    hInstance,    (LPSTR)TRUE);


char *  eng="`QWERTYUIOP[]|ASDFGHJKL;'ZXCVBNM,./";//МАССИВЫ СОЗДАЮ РУЧКАМИ
char * rus="ЁЙЦУКЕНГШЩЗХЪ|ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ.";

   case WM_ACTIVATEAPP:
   case WM_ACTIVATE:
   case WM_KILLFOCUS:
        
        hWndLast=GetForegroundWindow();//определяю активное окно
          if(hWndLast!=hWnd)//hWnd - мое приложение
           SetForegroundWindow(hWndLast);
dwThreadId = GetWindowThreadProcessId(hWndLast, 0);//определяю поток,которым было создано текущее активное окно
lay = GetKeyboardLayout(dwThreadId);//и запоминаю раскладку

switch ((DWORD)lay)
{
case 0x4190419/*RU*/:
{

for (int i=0;i<=33;i++)
{
    SetWindowTextA(but[i],&rus[i]);
}
break;
}


case 0x4090409/*EN*/:
{

for (int j=0;j<=33;j++)
{
    SetWindowTextA(but[j],&eng[j]);
}
break;
}
}



Это сообщение отредактировал(а) GremlinProg - 28.3.2011, 10:09
PM MAIL   Вверх
ИванМ
Дата 29.4.2011, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: нет
Всего: 23



zheka0906, как вариант создать отдельный поток, который будет постоянно определять активное окно и в зависимости от этого посылать сообщение основному основному окну приложения, которое уже будет менять раскладку.
PM MAIL   Вверх
zheka0906
Дата 2.5.2011, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 24.3.2011

Репутация: нет
Всего: нет



спасибо большое,ИванМ , к сожалению не работал с потоками никогда, поэтому придется довольствоваться тем что есть...и сроки уже подошли..на днях будет защита...еще раз спасибо за внимание
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0377 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.