David Jones <ncic@tadmas.com> wrote:
The following code will illuminate what David said. Run it, and press
keys, and see what comes out.
RSForster, if you're interested in deriving higher-level information
about punctuation-symbols that were SYNTHESISED by the
key-combinations (e.g. shift+7 to get ampersand, or altgr+digits to
get a different symbol), then you need to be even higher-level than
VK_codes. Scan-codes certainly won't help you. For this, you should
read the MSDN topic
"About Keyboard Input"
and in particular lookup the functions "ToAscii" and "ToUnicode".
.......................
#include <windows.h>
#include <tchar.h>
#include <string>
using namespace std;
typedef basic_string<TCHAR> tstring;
HINSTANCE hInstance;
HWND hed,hwnd;
void print(const tstring msg)
{ tstring t=msg+_T("\r\n"); unsigned int len =
GetWindowTextLength(hed); if (len>16000) SetWindowText(hed,_T(""));
int i=GetWindowTextLength(hed);
SendMessage(hed,EM_SETSEL,(WPARAM)i,(LPARAM)i);
SendMessage(hed,EM_REPLACESEL,FALSE,(LPARAM)t.c_st r());
}
void PumpMessages()
{ MSG msg; for (;
{ BOOL res=PeekMessage(&msg,0,0,0,PM_REMOVE); if
(!res||msg.message==WM_QUIT) return;
TranslateMessage(&msg); DispatchMessage(&msg);
}
}
tstring vk_to_string(int vk)
{ switch (vk)
{ case 0x01: return _T("VK_LBUTTON");
case 0x02: return _T("VK_RBUTTON");
case 0x03: return _T("VK_CANCEL");
case 0x04: return _T("VK_MBUTTON");
case 0x05: return _T("VK_XBUTTON1");
case 0x06: return _T("VK_XBUTTON2");
case 0x08: return _T("VK_BACK");
case 0x09: return _T("VK_TAB");
case 0x0C: return _T("VK_CLEAR");
case 0x0D: return _T("VK_RETURN");
case 0x10: return _T("VK_SHIFT");
case 0x11: return _T("VK_CONTROL");
case 0x12: return _T("VK_MENU");
case 0x13: return _T("VK_PAUSE");
case 0x14: return _T("VK_CAPITAL");
case 0x15: return _T("VK_KANA");
case 0x17: return _T("VK_JUNJA");
case 0x18: return _T("VK_FINAL");
case 0x19: return _T("VK_KANJI");
case 0x1B: return _T("VK_ESCAPE");
case 0x1C: return _T("VK_CONVERT");
case 0x1D: return _T("VK_NONCONVERT");
case 0x1E: return _T("VK_ACCEPT");
case 0x1F: return _T("VK_MODECHANGE");
case 0x20: return _T("VK_SPACE");
case 0x21: return _T("VK_PRIOR");
case 0x22: return _T("VK_NEXT");
case 0x23: return _T("VK_END");
case 0x24: return _T("VK_HOME");
case 0x25: return _T("VK_LEFT");
case 0x26: return _T("VK_UP");
case 0x27: return _T("VK_RIGHT");
case 0x28: return _T("VK_DOWN");
case 0x29: return _T("VK_SELECT");
case 0x2A: return _T("VK_PRINT");
case 0x2B: return _T("VK_EXECUTE");
case 0x2C: return _T("VK_SNAPSHOT");
case 0x2D: return _T("VK_INSERT");
case 0x2E: return _T("VK_DELETE");
case 0x2F: return _T("VK_HELP");
case '0': return _T("'0'");
case '1': return _T("'1'");
case '2': return _T("'2'");
case '3': return _T("'3'");
case '4': return _T("'4'");
case '5': return _T("'5'");
case '6': return _T("'6'");
case '7': return _T("'7'");
case '8': return _T("'8'");
case '9': return _T("'9'");
case 'A': return _T("'A'");
case 'B': return _T("'B'");
case 'C': return _T("'C'");
case 'D': return _T("'D'");
case 'E': return _T("'E'");
case 'F': return _T("'F'");
case 'G': return _T("'G'");
case 'H': return _T("'H'");
case 'I': return _T("'I'");
case 'J': return _T("'J'");
case 'K': return _T("'K'");
case 'L': return _T("'L'");
case 'M': return _T("'M'");
case 'N': return _T("'N'");
case 'O': return _T("'O'");
case 'P': return _T("'P'");
case 'Q': return _T("'Q'");
case 'R': return _T("'R'");
case 'S': return _T("'S'");
case 'T': return _T("'T'");
case 'U': return _T("'U'");
case 'V': return _T("'V'");
case 'W': return _T("'W'");
case 'X': return _T("'X'");
case 'Y': return _T("'Y'");
case 'Z': return _T("'Z'");
case 0x5B: return _T("VK_LWIN");
case 0x5C: return _T("VK_RWIN");
case 0x5D: return _T("VK_APPS");
case 0x5F: return _T("VK_SLEEP");
case 0x60: return _T("VK_NUMPAD0");
case 0x61: return _T("VK_NUMPAD1");
case 0x62: return _T("VK_NUMPAD2");
case 0x63: return _T("VK_NUMPAD3");
case 0x64: return _T("VK_NUMPAD4");
case 0x65: return _T("VK_NUMPAD5");
case 0x66: return _T("VK_NUMPAD6");
case 0x67: return _T("VK_NUMPAD7");
case 0x68: return _T("VK_NUMPAD8");
case 0x69: return _T("VK_NUMPAD9");
case 0x6A: return _T("VK_MULTIPLY");
case 0x6B: return _T("VK_ADD");
case 0x6C: return _T("VK_SEPARATOR");
case 0x6D: return _T("VK_SUBTRACT");
case 0x6E: return _T("VK_DECIMAL");
case 0x6F: return _T("VK_DIVIDE");
case 0x70: return _T("VK_F1");
case 0x71: return _T("VK_F2");
case 0x72: return _T("VK_F3");
case 0x73: return _T("VK_F4");
case 0x74: return _T("VK_F5");
case 0x75: return _T("VK_F6");
case 0x76: return _T("VK_F7");
case 0x77: return _T("VK_F8");
case 0x78: return _T("VK_F9");
case 0x79: return _T("VK_F10");
case 0x7A: return _T("VK_F11");
case 0x7B: return _T("VK_F12");
case 0x7C: return _T("VK_F13");
case 0x7D: return _T("VK_F14");
case 0x7E: return _T("VK_F15");
case 0x7F: return _T("VK_F16");
case 0x80: return _T("VK_F17");
case 0x81: return _T("VK_F18");
case 0x82: return _T("VK_F19");
case 0x83: return _T("VK_F20");
case 0x84: return _T("VK_F21");
case 0x85: return _T("VK_F22");
case 0x86: return _T("VK_F23");
case 0x87: return _T("VK_F24");
case 0x90: return _T("VK_NUMLOCK");
case 0x91: return _T("VK_SCROLL");
case 0x92: return _T("VK_OEM_FJ_JISHO");
case 0x93: return _T("VK_OEM_FJ_MASSHOU");
case 0x94: return _T("VK_OEM_FJ_TOUROKU");
case 0x95: return _T("VK_OEM_FJ_LOYA");
case 0x96: return _T("VK_OEM_FJ_ROYA");
case 0xA0: return _T("VK_LSHIFT");
case 0xA1: return _T("VK_RSHIFT");
case 0xA2: return _T("VK_LCONTROL");
case 0xA3: return _T("VK_RCONTROL");
case 0xA4: return _T("VK_LMENU");
case 0xA5: return _T("VK_RMENU");
case 0xA6: return _T("VK_BROWSER_BACK");
case 0xA7: return _T("VK_BROWSER_FORWARD");
case 0xA8: return _T("VK_BROWSER_REFRESH");
case 0xA9: return _T("VK_BROWSER_STOP");
case 0xAA: return _T("VK_BROWSER_SEARCH");
case 0xAB: return _T("VK_BROWSER_FAVORITES");
case 0xAC: return _T("VK_BROWSER_HOME");
case 0xAD: return _T("VK_VOLUME_MUTE");
case 0xAE: return _T("VK_VOLUME_DOWN");
case 0xAF: return _T("VK_VOLUME_UP");
case 0xB0: return _T("VK_MEDIA_NEXT_TRACK");
case 0xB1: return _T("VK_MEDIA_PREV_TRACK");
case 0xB2: return _T("VK_MEDIA_STOP");
case 0xB3: return _T("VK_MEDIA_PLAY_PAUSE");
case 0xB4: return _T("VK_LAUNCH_MAIL");
case 0xB5: return _T("VK_LAUNCH_MEDIA_SELECT");
case 0xB6: return _T("VK_LAUNCH_APP1");
case 0xB7: return _T("VK_LAUNCH_APP2");
case 0xBA: return _T("VK_OEM_1");
case 0xBB: return _T("VK_OEM_PLUS");
case 0xBC: return _T("VK_OEM_COMMA");
case 0xBD: return _T("VK_OEM_MINUS");
case 0xBE: return _T("VK_OEM_PERIOD");
case 0xBF: return _T("VK_OEM_2");
case 0xC0: return _T("VK_OEM_3");
case 0xDB: return _T("VK_OEM_4");
case 0xDC: return _T("VK_OEM_5");
case 0xDD: return _T("VK_OEM_6");
case 0xDE: return _T("VK_OEM_7");
case 0xDF: return _T("VK_OEM_8");
case 0xE1: return _T("VK_OEM_AX");
case 0xE2: return _T("VK_OEM_102");
case 0xE3: return _T("VK_ICO_HELP");
case 0xE4: return _T("VK_ICO_00");
case 0xE5: return _T("VK_PROCESSKEY");
case 0xE6: return _T("VK_ICO_CLEAR");
case 0xE7: return _T("VK_PACKET");
case 0xE9: return _T("VK_OEM_RESET");
case 0xEA: return _T("VK_OEM_JUMP");
case 0xEB: return _T("VK_OEM_PA1");
case 0xEC: return _T("VK_OEM_PA2");
case 0xED: return _T("VK_OEM_PA3");
case 0xEE: return _T("VK_OEM_WSCTRL");
case 0xEF: return _T("VK_OEM_CUSEL");
case 0xF0: return _T("VK_OEM_ATTN");
case 0xF1: return _T("VK_OEM_FINISH");
case 0xF2: return _T("VK_OEM_COPY");
case 0xF3: return _T("VK_OEM_AUTO");
case 0xF4: return _T("VK_OEM_ENLW");
case 0xF5: return _T("VK_OEM_BACKTAB");
case 0xF6: return _T("VK_ATTN");
case 0xF7: return _T("VK_CRSEL");
case 0xF8: return _T("VK_EXSEL");
case 0xF9: return _T("VK_EREOF");
case 0xFA: return _T("VK_PLAY");
case 0xFB: return _T("VK_ZOOM");
case 0xFC: return _T("VK_NONAME");
case 0xFD: return _T("VK_PA1");
case 0xFE: return _T("VK_OEM_CLEAR");
}
TCHAR c[100]; wsprintf(c,_T("VK? 0x%x"),vk);
return tstring(c);
}
LRESULT CALLBACK PlainWndProc(HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam)
{ switch (msg)
{ case WM_CREATE:
{ hed =
CreateWindow(_T("EDIT"),_T(""),WS_CHILD|WS_VISIBLE |WS_HSCROLL|WS_VSCROLL|ES_LEFT|ES_MULTILINE,
0,0,100,100,hwnd,NULL,hInstance,0);
print(_T("Press keyboard keys"));
} break;
case WM_KEYDOWN:
{ tstring s = vk_to_string((int)wParam);
print(s);
}
case WM_SIZE:
{ RECT rc; GetClientRect(hwnd,&rc);
MoveWindow(hed,0,0,rc.right,rc.bottom/2,TRUE);
} break;
case WM_PAINT:
{ PAINTSTRUCT ps; BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
} break;
case WM_DESTROY:
{ PostQuitMessage(0);
} break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE h,HINSTANCE,LPSTR,int)
{ hInstance=h;
//
WNDCLASSEX wcex; ZeroMemory(&wcex,sizeof(wcex)); wcex.cbSize =
sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)PlainWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = _T("PlainClass");
wcex.hIconSm = NULL;
ATOM res=RegisterClassEx(&wcex);
if (res==0) {MessageBox(NULL,_T("Failed to register
class"),_T("Error"),MB_OK); return 0;}
//
hwnd = CreateWindowEx(0,_T("PlainClass"), _T("Plain Window"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 400, 400, NULL, NULL, hInstance,
NULL);
if (hwnd==NULL) {MessageBox(NULL,_T("Failed to create
window"),_T("Error"),MB_OK); return 0;}
ShowWindow(hwnd,SW_SHOW);
//
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
--
Lucian