追記: HookからVKとるには次のようにする

LPKBDLLHOOKSTRUCT pKey = (LPKBDLLHOOKSTRUCT) lParam;
pKey->vkCode でとれる
書き換えるトキは、pKey->scanCodeも一緒に書き換えないとだめ

サンプル:

LRESULT CALLBACK MyKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode < 0 || nCode != HC_ACTION)
		return CallNextHookEx(hHook, nCode, wParam, lParam);

	LPKBDLLHOOKSTRUCT pKey = (LPKBDLLHOOKSTRUCT) lParam;

	LPCTSTR event[5] = { _T(""), _T("KD"), _T("KU"), _T("SD"), _T("SU") };

	int i = 0;
	if(wParam == WM_KEYDOWN) i = 1;
	if(wParam == WM_KEYUP) i = 2;
	if(wParam == WM_SYSKEYDOWN) i = 3;
	if(wParam == WM_SYSKEYUP) i = 4;

        // Fn + カーソルで PgDn, PgUp, Home, End にすげかえ
	switch( pKey->vkCode)
	{
		case 0x14: return TRUE; //CAPS Lockしね;
		case 0xB1: pKey->vkCode = 0x24; pKey->scanCode = 0x47; break;
		case 0xB0: pKey->vkCode = 0x23; pKey->scanCode = 0x4f; break;
		case 0xB2: pKey->vkCode = 0x21; pKey->scanCode = 0x49; break;
		case 0xB3: pKey->vkCode = 0x22; pKey->scanCode = 0x51; break;
	}

	CString str;
	str.Format(_T("%s [%x %x], %x, f:%x, e:%x"), event[i], pKey->vkCode, pKey->scanCode, pKey->time,  pKey->flags, pKey->dwExtraInfo );
//	AfxMessageBox(str);
SetWindowText(g_hwnd, str);


	return CallNextHookEx(hHook, nCode, wParam, lParam);
//	return TRUE;
}