The last entry of the key tables in u_dzVclUtils that THotkey_GetHotkey uses is wrong:
EXT_KEYS: TExtKeyArr = (VK_LEFT, ..., VK_NUMLOCK, VK_PAUSE, VK_PRINT,
VK_DIVIDE);
STD_KEYS: TExtKeyArr = (VK_NUMPAD4, ..., VK_NUMLOCK, VK_PAUSE, VK_PRINT,
Ord('/'));
Ord('/') is a character code, $2F, and as a virtual key that is VK_HELP. Until [bugs:#50] (r2413) THotkey_GetHotkey threw the mapped key away, so the entry had no effect. Since then, a THotKey that holds VK_DIVIDE without hkExt gives $2F:
hk.HotKey := ShortCut(VK_DIVIDE, [ssCtrl]); // the HotKey setter clears hkExt
sc := THotkey_GetHotkey(hk); // Ctrl+$2F instead of Ctrl+VK_DIVIDE
THotkey_SetHotkey followed by THotkey_GetHotkey is not affected: SetHotkey sets hkExt for VK_DIVIDE, and VK_DIVIDE is not in STD_KEYS.
Expected: VK_DIVIDE stays VK_DIVIDE, like VK_NUMLOCK, VK_PAUSE and VK_PRINT in the same tables. The main keyboard key with the same scan code depends on the layout (VK_OEM_2 on US, Shift+7 on German), so there is no fixed twin, and VK_DIVIDE is only produced by the numeric keypad anyway.
Found by a code review.
Fixed in revision #2475.
The last entry of STD_KEYS is now VK_DIVIDE, so THotkey_GetHotkey leaves VK_DIVIDE unchanged with or without hkExt, like VK_NUMLOCK, VK_PAUSE and VK_PRINT. New tests in VclUtils.