Witam.
Muszę ogarnąć temat emulowania naciśnięcia klawiatury za pomocą mojej aplikacji. Aplikacja ma sterować animacją wyświetlaną w directx. W sumie próbowałem już wielu sposobów (SendKeys, SendInput, SendMeassage) etc. Wszystko to działa w WinAPI (czyt. na formatkach), nic za to nie działa w DirectX. SendInput niby powinen działać, ale nie wiem czemu, nie działa :( Poniżej kod:
[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
public UInt32 type;
//KEYBDINPUT:
public ushort wVk;
public ushort wScan;
public UInt32 dwFlags;
public UInt32 time;
public UIntPtr dwExtraInfo;
//HARDWAREINPUT:
public UInt32 uMsg;
public ushort wParamL;
public ushort wParamH;
}
enum SendInputFlags
{
KEYEVENTF_EXTENDEDKEY = 0x0001,
KEYEVENTF_KEYUP = 0x0002,
KEYEVENTF_UNICODE = 0x0004,
KEYEVENTF_SCANCODE = 0x0008,
}
[DllImport("user32.dll")]
static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);
public void StrokeR()
{
INPUT[] InputData = new INPUT[1];
ushort ScanCode = 0x13;//Scan code dla R w DirectX
InputData[0].type = 1; //INPUT_KEYBOARD
InputData[0].wScan = (ushort)ScanCode;
InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;
if (SendInput(1, InputData, Marshal.SizeOf(InputData[0])) == 0)
{
String blad = "SendInput failed with code: " + Marshal.GetLastWin32Error().ToString();
System.Diagnostics.Debug.WriteLine(blad);
}
}
Z programów działających w podobny sposób (AutoHotkey, AutoIt) żaden tego nie potrafi. Tylko jeden program to poprawnie obsługuje - GlovePIE (można na nim napisać skrytpt, który wykona to co mnie interesuje, ale niestety okno z programem odpali się, przejmie focus i zminimalizuje animację). W sumie poprawnie też są wysyłane kody z windowsowej klawiatury ekranowej (ost.exe).
Zna ktoś może jakiś projekt, wirtualnego sterownika klawiatury, lub udało się komuś w inny sposób osiągnąć podobny cel?