/* * Microsoft Confidential * Copyright (C) Microsoft Corporation 1991 * All Rights Reserved. * * * PIFHOT.C * User interface routines for hot-keys * * History: * Created 21-Dec-1992 5:30pm by Jeff Parsons (based on old PIFEDIT code) * Rewritten 25-Dec-1993 by Raymond Chen */ #include "shellprv.h" #pragma hdrstop /* * Values for the second argument to MapVirtualKey, mysteriously * missing from windows.h. */ #define MVK_OEMFROMVK 0 #define MVK_VKFROMOEM 1 /* * BEWARE! Converting a VK to a scan code and back again does not * necessarily get you back where you started! The main culprit * is the numeric keypad, since (for example) VK_LEFT and VK_NUMPAD4 * both map to scan code 0x4B. We catch the numeric keypad specially * for exactly this purpose. * * The following table converts VK codes VK_NUMPAD0 through VK_NUMPAD9 * to the corresponding VK_ code if NumLock is off. * * Note that this table and the loop that accesses it assume that the * scan codes VK_NUMPAD0 through VK_NUMPAD9 are consecutive. */ WORD mpvkvk[10] = { VK_INSERT, /* VK_NUMPAD0 */ VK_END, /* VK_NUMPAD1 */ VK_DOWN, /* VK_NUMPAD2 */ VK_NEXT, /* VK_NUMPAD3 */ VK_LEFT, /* VK_NUMPAD4 */ VK_CLEAR, /* VK_NUMPAD5 */ VK_RIGHT, /* VK_NUMPAD6 */ VK_HOME, /* VK_NUMPAD7 */ VK_UP, /* VK_NUMPAD8 */ VK_PRIOR, /* VK_NUMPAD9 */ }; /** HotKeyWindowsFromOem - Convert OEM hotkey into Windows hotkey * * INPUT * lppifkey -> PIFKEY describing OEM Hotkey * * OUTPUT * Windows hotkey value corresponding to lpwHotkey. */ WORD HotKeyWindowsFromOem(LPCPIFKEY lppifkey) { WORD wHotKey = 0; if (lppifkey->Scan) { wHotKey = (WORD) MapVirtualKey(lppifkey->Scan, MVK_VKFROMOEM); if (lppifkey->Val & 2) { WORD vk; for (vk = VK_NUMPAD0; vk <= VK_NUMPAD9; vk++) { if (wHotKey == mpvkvk[vk - VK_NUMPAD0]) { wHotKey = vk; break; } } ASSERTTRUE(vk <= VK_NUMPAD9); /* Buggy PIF; do what we can */ } if (lppifkey->Val & 1) wHotKey |= (HOTKEYF_EXT << 8); if (lppifkey->ShVal & (fPIFSh_RShf | fPIFSh_LShf)) wHotKey |= (HOTKEYF_SHIFT << 8); if (lppifkey->ShVal & (fPIFSh_LCtrl|fPIFSh_RCtrl|fPIFSh_Ctrl)) wHotKey |= (HOTKEYF_CONTROL << 8); if (lppifkey->ShVal & (fPIFSh_LAlt|fPIFSh_RAlt|fPIFSh_Alt)) wHotKey |= (HOTKEYF_ALT << 8); } return wHotKey; } /** HotKeyOemFromWindows - Convert Windows hotkey into OEM hotkey * * INPUT * lppifkey -> struct PIF_Key to receive OEM hotkey * wHotKey = Windows hotkey * * OUTPUT * lppifkey filled with hotkey info */ void HotKeyOemFromWindows(LPPIFKEY lppifkey, WORD wHotKey) { lppifkey->Scan = 0; lppifkey->ShVal = 0; lppifkey->ShMsk = 0; lppifkey->Val = 0; if (wHotKey) { lppifkey->Scan = (WORD) MapVirtualKey(LOBYTE(wHotKey), MVK_OEMFROMVK); lppifkey->ShMsk = fPIFSh_RShf | fPIFSh_LShf | fPIFSh_Ctrl | fPIFSh_Alt; if (wHotKey & (HOTKEYF_EXT << 8)) lppifkey->Val |= 1; /* Assumes that VK_NUMPAD0 through VK_NUMPAD9 are consecutive */ if ((wHotKey - VK_NUMPAD0) < 10) lppifkey->Val |= 2; if (wHotKey & (HOTKEYF_SHIFT << 8)) lppifkey->ShVal |= fPIFSh_RShf | fPIFSh_LShf; if (wHotKey & (HOTKEYF_CONTROL << 8)) lppifkey->ShVal |= fPIFSh_Ctrl; if (wHotKey & (HOTKEYF_ALT << 8)) lppifkey->ShVal |= fPIFSh_Alt; } }