- •«Программирование внешних устройств»
- •Механизм сообщений от клавиатуры.
- •Коды oem, ansi, ascii, виртуальные коды.
- •Виртуальные клавиши.
- •Символьные сообщения.
- •Системные сообщения.
- •Преобразование кодов.
- •Как отличить нажатия совпадающих клавиш.
- •Как узнать ввод строчных и прописных букв.
- •Фокус ввода.
- •Захват и освобождение окном мыши.
- •Обработка сообщений от мыши.
- •Функция таймера.
Символьные сообщения.
//Обработка системных сообщений производится в окне №2.
LRESULT CALLBACK WndProc2(HWND hWnd2, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message)
{case WM_CHAR: //Обработка символьных сообщений. После того как сообщение WM_KEYDOWN было преобразовано TranslateMessage(&msg), WM_CHAR содержит символьный код клавиши, которая была нажата.
step=step+26;
//message
nBufSize=wsprintf(szBuf, L"%s", L"WM_CHAR");
TextOut(hdc, 0, step, szBuf, nBufSize);
//ansi
nBufSize=wsprintf(szBuf, L"%lx", wParam); //в wParam WM_CHAR содержится код ansi
TextOut(hdc, 330, step, szBuf, nBufSize);
break;}
Системные сообщения.
//Обработка системных сообщений производится в окне №2.
LRESULT CALLBACK WndProc2(HWND hWnd2, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message)
{case WM_SYSKEYDOWN://обработка нажатия системных клавиш (Alt, F10)
step=step+26;
//message
nBufSize=wsprintf(szBuf, L"%s", L"WM_SYSKEYDOWN");
TextOut(hdc, 0, step, szBuf, nBufSize);
//vk
nBufSize=wsprintf(szBuf, L"%x", wParam);
TextOut(hdc, 160, step, szBuf, nBufSize);
//keyname
kn=GetKeyNameText(lParam, szKeyName, sizeof(szKeyName)-1);
if (!kn) TextOut(hdc, 390, step, L"Error", 5);
else TextOut(hdc, 390, step, szKeyName, kn);
if(GetKeyState(VK_MENU)<0)
{switch(wParam)
{case 0x32:
KillTimer(hWnd2,sec2);
DestroyWindow(hWnd2);
break;
}break;
break;
case WM_SYSKEYUP: ://обработка отпускания системных клавиш (Alt, F10)
step=step+26;
//message
nBufSize=wsprintf(szBuf, L"%s", L"WM_SYSKEYUP");
TextOut(hdc, 0, step, szBuf, nBufSize);
//vk
nBufSize=wsprintf(szBuf, L"%x", wParam);
TextOut(hdc, 160, step, szBuf, nBufSize);
//keyname
kn=GetKeyNameText(lParam, szKeyName, sizeof(szKeyName)-1);
if (!kn) TextOut(hdc, 400, step, L"Error", 5);
else TextOut(hdc, 400, step, szKeyName, kn);
break;
break;}
break;
Преобразование кодов.
//В данной программе было выполнено преобразование кода в ASCII-код.
LRESULT CALLBACK WndProc2(HWND hWnd2, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message)
{case WM_KEYDOWN:
i=MapVirtualKey(wParam,2); //данная функция преобразует виртуальный код клавиши в ascii.
_itoa_s(i, iBuf, 10); //преобразует данные типа int в тип string
nBufSize=wsprintf(szBuf, L"%d", iBuf);
TextOut(hdc, 240, step, szBuf, nBufSize);
break;
break;}
Как отличить нажатия совпадающих клавиш.
//Чтобы отличить нажатие совпадающих клавиш необходимо вывести их скан коды, т.к они будут различаться.
LRESULT CALLBACK WndProc2(HWND hWnd2, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message)
{case WM_KEYDOWN:
nBufSize=wsprintf(szBuf, L"%lx", lParam>>16); //скан код лежит в lParam и занимает биты 23-16. Поэтому, чтобы извлечь скан код необходимо выполнить побитовый сдвиг на 16 влево.
TextOut(hdc, 210, step, szBuf, nBufSize);
break;
break;}
Как узнать ввод строчных и прописных букв.
//Чтобы узнать ввод строчных и прописных букв необходимо обработать нажатие клавиш Shift, Caps Lock. Если они были нажаты, то буквы прописные, в ином случае - строчные.
LRESULT CALLBACK WndProc2(HWND hWnd2, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message)
{case WM_KEYDOWN:
if (wParam==VK_CAPITAL) TextOut(hdc, 500, step, L"+CAPITAL", 8);
if (wParam==VK_SHIFT) TextOut(hdc, 500, step, L"+SHIFT", 6);
break;
break;}