Клавиатура Unicode Visual Studio WinApi
От: Аноним  
Дата: 13.05.11 07:29
Оценка:
Возникла проблема с вводом с клавиатуры под виндой в винапи, не могу вкурить как получить, что нажали.

WM_KEYDOWN\UP возвращают виртуальный код и какието параметры и для управления подходят более нини.

нашол WM_CHAR\UNICHAR но
WM_CHAR никак не реагирует на русский язык
WM_UNICHAR вообще не как не срабатывает
в MSDN ничего толкового не нашел или не понял
в гуглах инфа а том как послать код в приложение а не получить =\

окно создаю через CreateWindowExW

Итак вопрос: как получить нажатый символ, желательно юникод в WinApi.

#define UNICODE тоже пробовал, результат никакой
toUnicode дает тоже что и WM_CHAR, тоесть латиница без русского языка =(
Re: Клавиатура Unicode Visual Studio WinApi
От: De-Bugger  
Дата: 13.05.11 07:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Возникла проблема с вводом с клавиатуры под виндой в винапи, не могу вкурить как получить, что нажали.


Цикл обработки сообщений какой?
Re[2]: Клавиатура Unicode Visual Studio WinApi
От: MrGobus  
Дата: 13.05.11 07:48
Оценка:
Здравствуйте, De-Bugger, Вы писали:

DB>Здравствуйте, Аноним, Вы писали:


А>>Возникла проблема с вводом с клавиатуры под виндой в винапи, не могу вкурить как получить, что нажали.


DB>Цикл обработки сообщений какой?



Обработка событий LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){
wchar_t buffer[8];
BYTE lpKeyState[256];
switch (message){

case WM_KEYUP:
GetKeyboardState(lpKeyState);
ToUnicode(wParam, HIWORD(lParam)&0xFF, lpKeyState, buffer, 8, 0);
active_scene->on_key_up(lParam,wParam,buffer[0]);
break;
case WM_KEYDOWN:
GetKeyboardState(lpKeyState);
ToUnicode(wParam, HIWORD(lParam)&0xFF, lpKeyState, buffer, 8, 0);
active_scene->on_key_down(lParam,wParam,buffer[0]);
break;

case WM_DESTROY:
gexClose();
break;
}
return DefWindowProc (hWnd, message, wParam, lParam);
}



Создание окна
WNDCLASSEX wc = {
sizeof(WNDCLASSEX),
CS_HREDRAW|CS_VREDRAW,
WindowProc,
0,
0,
GetModuleHandle(NULL),
0,
LoadCursor(NULL, IDC_ARROW),
0,
0,
class_name,
0
};
if (!RegisterClassEx(&wc))
return 1;
gex_system.screen_width=640;
gex_system.screen_height=480;
RECT rect = {0,0,gex_system.screen_width,gex_system.screen_height};//подгоняем размер окна так, чтобы ширина и высота зоны OpenGL была такая как мы задали
AdjustWindowRect(&rect,WS_OVERLAPPEDWINDOW,0);
hWnd = CreateWindowExW (
0,
class_name,
window_title,
WS_OVERLAPPEDWINDOW,
0,
0,
rect.right-rect.left,
rect.bottom-rect.top,
0,
0,
GetModuleHandle(NULL),
0);
if (!hWnd)
return 2;
hdc = GetDC(hWnd);
if (!hdc)
return 3;

//Задаем формат пикселей
PIXELFORMATDESCRIPTOR pfd = {0};
pfd.nSize=sizeof(pfd);
pfd.nVersion=1;
pfd.dwFlags=PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType=PFD_TYPE_RGBA;
pfd.cColorBits=32;
pfd.cDepthBits=24;
int format = ChoosePixelFormat(hdc, &pfd);
if (!format || !SetPixelFormat(hdc, format, &pfd))
return 4;
PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = 0;
hRC = wglCreateContext(hdc);
if (!hRC || !wglMakeCurrent(hdc, hRC))
return 5;
wglCreateContextAttribsARB = reinterpret_cast<PFNWGLCREATECONTEXTATTRIBSARBPROC>(wglGetProcAddress("wglCreateContextAttribsARB"));
wglMakeCurrent(NULL, NULL);
wglDeleteContext(hRC);
if (!wglCreateContextAttribsARB)
return 5;
int attribs[] = {
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 3,
WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
0
};
hRC = wglCreateContextAttribsARB(hdc, 0, attribs);

// если создать контекст не получилось или он не устанавливается для нашего окна
if (!hRC || !wglMakeCurrent(hdc, hRC))
return 5;
glewExperimental=GL_TRUE; //<<-- иначе не будет работать половина функций
if (glewInit()!=GLEW_OK)
return 6;
ShowWindow(hWnd, SW_SHOW); //показываем окно


Главный цикл
while (!close_game_engine){
active_scene->draw();
SwapBuffers(hdc);//выводим буфер на экран
//опрос соощений
while (PeekMessage(&msg,hWnd,0,0,PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Re[3]: Клавиатура Unicode Visual Studio WinApi
От: MrGobus  
Дата: 13.05.11 08:08
Оценка:
Хм заменил в
PeekMessage(&msg,0,0,0,PM_REMOVE)
переменную hWnd на 0
все заработало =\
хехе, спасибо за ответы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.