One more try.
The point is to separate your thinking of the different involved things:
1. key on the keyboard (example is key second row at 4th column)
2. the labels on it (american (3, #, nothing) or german (3, §, ³) or french (", 3, #))
3. the character it would produce in combination with formerly pressed dead keys and currently pressed modifier keys (if no modifier is pressed its in many layouts '3' and on some '"')
1. Would be prefered for many games so they dont need to do some guesswork on backwards-translate what the library forward-translated, because they would test a constant of KEY_ROW2_COLUMN4 or KEY_COLUMN4_ROW2 (or for "convenience" a library may call it KEY_3 if its believed by its creator it would apply to the majority of layouts even though it may mean something else on some layouts). The constants may have much in common with the scan code, but there are quirks.
2. It may in some ways be wanted by a game to know what label to print on screen when the key gets pressed, but it gets ambiguous with the many layouts, though it may be convenient in some situations to get KEY_LABELED_3 event always when any key is pressed that includes that label if its primary, secondary or third class. For example a game shows a list labeled 1 to 10 and wants to know when some key with such a label gets pressed (but for that the text-event may be reused instead as an inferior alternative). I'm not sure but this may be got from the VK_ constants in Windows or other things on other OS.
3. Would be the domain of the character text input event, not the key event. And here you would like to get UTF-32 codes.