It's simpler than it seems, although you do not believe it is possible to control the whole system with the windows API, I leave a simple example in C ++ which you mention, since C # is not my type ...
First of all everything depends on what you want to send the message (it is called message in windows send a command either key pressed or action),
Example: You have windows, which windows have windows which we can call subwindows, which those windows can be controls,
Example with a notepad:
// Obtenemos el handle de la ventana principal por el titulo de la ventana:
HWND handx = FindWindow(NULL, L"Sin título: Bloc de notas");
// ok, ahora obtenemos el handle del control EDIT, el cual es que usamos en el bloc de notas (gracias al handle padre o handle principal que obtuvimos anteriormente), si hay mas de uno de acuerdo a la documentación en MSDN se obtendrá el primero que se encuentre,
// Clase Edit del estándar de microsoft, ya que no sabemos el nombre de la ventana pero si el nombre del control...
HWND handy = FindWindowEx(handx, NULL, L"Edit", NULL);
// ok, Procedemos a enviar el mensaje,
// ingresamos el handle, el tipo de key/evento dependiendo, se pueden enviar hasta las keys del sistema, en este caso envió la key F1, en lparam sería el scan code, pero no es necesario por ahora...
PostMessage(handy, WM_KEYDOWN, VK_F1, 0);
// ahora enviaré una key tipo char de acuerdo a la tabla ascii
// En este caso 0x41 el cual es el numero 65 en decimal el cual corresponde a la A mayúscula en la tabla ascii..
PostMessage(handy, WM_CHAR, 0x41, 0);
You can try it, which would be:
#include <Windows.h>
int main()
{
HWND handx = FindWindow(NULL, L"Sin título: Bloc de notas");
HWND handy = FindWindowEx(handx, NULL, L"Edit", NULL);
PostMessage(handy, WM_KEYDOWN, VK_F1, 0);
PostMessage(handy, WM_CHAR, 0x41, 0);
return 0;
}