You can send Unicode characters using KEYEVENTF_UNICODE
.
k.type = (int)InputType.INPUT_KEYBOARD;
k.ki.wScan = 'ö';
k.ki.wVk = 0;
k.ki.dwFlags = (int)KEYEVENTF.UNICODE | (int)KEYEVENTF.KEYDOWN;
k.ki.dwExtraInfo = GetMessageExtraInfo();
This is more portable than your solution of using Oem3
et al, whose assigned character would vary according to the culture of the platform on which your application is executing.
(Rest of P/Invoke signatures can be found in my other answer.)