?? s3c6410_layout.cpp
字號:
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
};
#endif
static ScanCodeToVKeyData scvkEngExtUS =
{
0xe000,
ScanCodeTableExtFirst,
ScanCodeTableExtLast,
ScanCodeToVKeyExtTable
};
static ScanCodeToVKeyData *rgscvkMatrixEngUSTables[] =
{
&scvkEngUS,
&scvkEngExtUS
};
struct VirtualKeyMapping
{
UINT32 uiVk;
UINT32 uiVkGenerated;
};
static const VirtualKeyMapping g_rgvkMapFn[] =
{
{ '1', VK_F1 },
{ '2', VK_F2 },
{ '3', VK_F3 },
{ '4', VK_F4 },
{ '5', VK_F5 },
{ '6', VK_F6 },
{ '7', VK_F7 },
{ '8', VK_F8 },
{ '9', VK_F9 },
{ '0', VK_F10 },
{ VK_HYPHEN, VK_NUMLOCK },
{ VK_EQUAL, VK_CANCEL },
{ 'P', VK_INSERT },
{ VK_LBRACKET, VK_PAUSE },
{ VK_RBRACKET, VK_SCROLL },
{ VK_SEMICOLON, VK_SNAPSHOT },
{ VK_APOSTROPHE, VK_SNAPSHOT },
{ VK_LEFT, VK_HOME },
{ VK_UP, VK_PRIOR},
{ VK_DOWN, VK_NEXT },
{ VK_RIGHT, VK_END },
};
static const VirtualKeyMapping g_rgvkMapNumLock[] =
{
{ '7', VK_NUMPAD7 },
{ '8', VK_NUMPAD8 },
{ '9', VK_NUMPAD9 },
{ '0', VK_MULTIPLY },
{ 'U', VK_NUMPAD4 },
{ 'I', VK_NUMPAD5 },
{ 'O', VK_NUMPAD6 },
{ 'P', VK_SUBTRACT },
{ 'J', VK_NUMPAD1 },
{ 'K', VK_NUMPAD2 },
{ 'L', VK_NUMPAD3 },
{ VK_SEMICOLON, VK_ADD },
{ 'M', VK_NUMPAD0 },
{ VK_PERIOD, VK_DECIMAL },
{ VK_SLASH, VK_DIVIDE },
};
// Find a virtual key mapping in the given array.
static
const VirtualKeyMapping *
FindRemappedKey(
UINT32 uiVk,
const VirtualKeyMapping *pvkMap,
DWORD cvkMap
)
{
const VirtualKeyMapping *pvkMapMatch = NULL;
UINT ui;
if(pvkMap == NULL)
{
DEBUGMSG(ZONE_ERROR, (_T("FindRemappedKey: pvkMap error\r\n")));
return NULL;
}
for (ui = 0; ui < cvkMap; ++ui)
{
if (pvkMap[ui].uiVk == uiVk)
{
pvkMapMatch = &pvkMap[ui];
break;
}
}
return pvkMapMatch;
}
#define IS_NUMLOCK_ON(ksf) (ksf & KeyShiftNumLockFlag)
// Remapping function for the matrix keyboard
static
UINT
WINAPI
MatrixUsRemapVKey(
const KEYBD_EVENT *pKbdEvents,
UINT cKbdEvents,
KEYBD_EVENT *pRmpKbdEvents,
UINT cMaxRmpKbdEvents
)
{
SETFNAME(_T("MatrixUsRemapVKey"));
static BOOL fFnDown = FALSE;
UINT cRmpKbdEvents = 0;
UINT ui;
if (pRmpKbdEvents == NULL)
{
// 1 to 1 mapping
if (cMaxRmpKbdEvents != 0)
{
DEBUGMSG(ZONE_ERROR, (_T("%s: cMaxRmpKbdEvents error!\r\n"), pszFname));
}
return cKbdEvents;
}
if (pKbdEvents == NULL)
{
DEBUGMSG(ZONE_ERROR, (_T("%s: pKbdEvents error!\r\n"), pszFname));
}
if (cMaxRmpKbdEvents < cKbdEvents)
{
DEBUGMSG(ZONE_ERROR, (_T("%s: Buffer is not large enough!\r\n"), pszFname));
return 0;
}
for (ui = 0; ui < cKbdEvents; ++ui)
{
const KEYBD_EVENT *pKbdEventCurr = &pKbdEvents[ui];
KEYBD_EVENT *pKbdEventRmpCurr = &pRmpKbdEvents[cRmpKbdEvents];
// Copy the input key event to our remapped list
pKbdEventRmpCurr->uiVk = pKbdEventCurr->uiVk;
pKbdEventRmpCurr->uiSc = pKbdEventCurr->uiSc;
pKbdEventRmpCurr->KeyStateFlags = pKbdEventCurr->KeyStateFlags;
const VirtualKeyMapping *pvkMap = NULL;
BOOL fKeyDown = (pKbdEventCurr->KeyStateFlags & KeyStateDownFlag) != 0;
UINT32 uiVkCurr = pKbdEventCurr->uiVk;
if (uiVkCurr == VK_MATRIX_FN)
{
fFnDown = fKeyDown;
// Fn virtual key does not get sent to the system so
// do not increment cRmpKbdEvents.
DEBUGMSG(ZONE_DEVICELAYOUT, (_T("%s: Fn key is now %s\r\n"),
pszFname, (fFnDown ? _T("DOWN") : _T("UP"))));
}
else
{
// We have one key event
++cRmpKbdEvents;
if (fKeyDown)
{
// Handle key down
if (fFnDown)
{
// Fn key is on
if (IS_NUMLOCK_ON(pKbdEventCurr->KeyStateFlags))
{
pvkMap = FindRemappedKey(uiVkCurr, g_rgvkMapNumLock, dim(g_rgvkMapNumLock));
}
if (pvkMap == NULL)
{
// NumLock did not effect this key. See if the
// Fn key by itself does.
pvkMap = FindRemappedKey(uiVkCurr, g_rgvkMapFn, dim(g_rgvkMapFn));
}
}
}
else
{
// Handle key up
if (fFnDown)
{
// Fn key is on
if (IS_NUMLOCK_ON(pKbdEventCurr->KeyStateFlags))
{
pvkMap = FindRemappedKey(uiVkCurr, g_rgvkMapNumLock, dim(g_rgvkMapNumLock));
}
if (pvkMap == NULL)
{
// NumLock did not effect this key. See if the
// Fn key by itself does.
pvkMap = FindRemappedKey(uiVkCurr, g_rgvkMapFn, dim(g_rgvkMapFn));
}
}
}
if (pvkMap != NULL)
{
// This combination generates a different virtual key
if (pvkMap->uiVkGenerated == NULL)
{
DEBUGMSG(ZONE_ERROR, (_T("%s: pvkMap->uiVkGenerated error!\r\n"), pszFname));
}
pKbdEventRmpCurr->uiVk = pvkMap->uiVkGenerated;
}
}
}
return cRmpKbdEvents;
}
static DEVICE_LAYOUT dlMatrixEngUs =
{
sizeof(DEVICE_LAYOUT),
MATRIX_PDD,
rgscvkMatrixEngUSTables,
dim(rgscvkMatrixEngUSTables),
MatrixUsRemapVKey,
};
extern "C"
BOOL
Matrix(
PDEVICE_LAYOUT pDeviceLayout
)
{
SETFNAME(_T("Matrix"));
BOOL fRet = FALSE;
if (pDeviceLayout == NULL)
{
DEBUGMSG(ZONE_ERROR, (_T("%s: pDeviceLayout error!\r\n"), pszFname));
return FALSE;
}
if (pDeviceLayout->dwSize != sizeof(DEVICE_LAYOUT))
{
DEBUGMSG(ZONE_ERROR, (_T("Matrix: data structure size mismatch\r\n")));
goto leave;
}
// Make sure that the Sc->Vk tables are the sizes that we expect
if (dim(ScanCodeToVKeyTable) != (1 + ScanCodeTableLast - ScanCodeTableFirst))
{
DEBUGMSG(ZONE_ERROR, (_T("%s: ScanCodeToVKeyTable error!\r\n"), pszFname));
}
*pDeviceLayout = dlMatrixEngUs;
fRet = TRUE;
leave:
return fRet;
}
#ifdef DEBUG
// Verify function declaration against the typedef.
static PFN_DEVICE_LAYOUT_ENTRY v_pfnDeviceLayout = Matrix;
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -