Turns out I had implemented KEYBDINPUT improperly, and was also sending each keystroke out in a single call to SendInput. The following appears to work for standard and extended virtual keys in my target application:
VOID SimulateKeystroke(USHORT vk, BOOL bExtended)
{
INPUT input = {0};
if(bExtended) input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
input.ki.wVk = vk;
input.type = INPUT_KEYBOARD;
SendInput(1, &input, sizeof(input));
ZeroMemory(&input, sizeof(INPUT));
input.ki.dwFlags = KEYEVENTF_KEYUP;
if( bExtended ) input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
input.ki.wVk = vk;
input.type = INPUT_KEYBOARD;
SendInput(1, &input, sizeof(input));
}