In msdn,
typedef struct tagKEYBDINPUT {
WORD wVk;
WORD wScan;
DWORD dwFlags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT, *LPKEYBDINPUT;
wVk
Type: WORD
A virtual-key code. The code must be a value in the range 1 to 254. If the dwFlags member specifies KEYEVENTF_UNICODE, wVk must be 0.
Keyboard drivers do convert virtual key codes to scan codes. But why do winapi functions require scan codes? Is it because the API directly tells OS and doesn't rely on keyboard drivers?
One benefit has been explained in the following Remarks.