I am not to sure about C# sending input, I never managed to get it working decently whilst the anti hack ran at the same time.
All anti hacks that I know of will block the SendInput api's.
See some links here for analysis on anti hacks.

The chat in Twelve Sky & Twelve Sky 2 is just using normal windows text field input. WM Message sending is enough to emulate keys for this one.
Anti hack won't prevent this to my knowldge and even the C# SendKeys or Key.Send or w/e it was will work to type chat messages.
Using WASD to move, skill keys, pill use keys etc are all using Dinput (Direct input)
Dinput is a part of direct x of course, essentially it works like this.
There is a buffer that stores values I think it was 256 long or maybe 210 or something.
The values are like 80 or 0. Or maybe it was 64 and 0 anyway, its designed to handle input in this buffer for variable pressure of keys but basically all keyboards are either, you press the key or you don't.
In the game loop there is a call to dinput to update this buffer with the key states. Eg pressed or not pressed.
It is possible to directly manipulate this buffer to simulate keys. But not able to be 100% relied on unless you can get it in sync with the game loop function.
If you can hook draw indexed primitive through the vtable you could modify the buffer for the next frame

.
I have done this previously to simulate key presses and read keys on Twelve Sky 2 Aeria, but I had more success with just calling game functions to do the desired action.
When you press a key, lets say I to open inventory.
The game has some sort of code that goes
if I has been pressed then call this function or do this code etc...
If you can find that function you can just call it and then the inventory opens.
This game engine also has a boolean value for the visible (open/closed) state of each window dialog/button etc.
If you can find that you can set it to 1 and inventory is open etc.
It is possible to open and close inventory and a few other dialog in the game just by setting the corresponding boolean to a 1 in the games memory. I have done this with a C++ dll after I moved away from using C#.
Who knows C# can probably read/write memory or make a dll to be injected but I found it easier with C++.
I think my dinput hook code is long gone from years of changing computers/formats etc.
I will have a look when I get home though, maybe it will be of some use.