Emulacja naciśnięcia przycisku, sterownik wirtualnej klawiatury

Odpowiedz Nowy wątek
Kuba548
2012-08-19 23:32
Kuba548
0

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?

Pozostało 580 znaków

2012-08-21 10:50

Rejestracja: 16 lat temu

Ostatnio: 1 minuta temu

0

static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);
brzydki ten kod...

static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);

ushort ScanCode = 0x13;//Scan code dla R w DirectX
skąd ta wartość?
http://msdn.microsoft.com/en-us/library/windows/desktop/ee418641(v=vs.85).aspx

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0