为什么AutoIt成功向directx应用程序发送输入而SendInput / SendMessage没有?

时间:2014-07-25 17:26:07

标签: c# windows api directx autoit

最近,我制作了一个程序,将按键发送到DirectX应用程序中。 当用户单击某个键时,应用程序会更改光标。当我用C#代码(Window API)尝试它时它没有用,但是当我用AutoIt尝试它时它运行得很好。

我想知道为什么它不适用于C#。使用的代码(C#和AutoIt)有什么不同?

我认为AutoIt是一个易于使用的Win API包装器,但结果并没有显示出来,那么这些函数是如何构建的呢?

我希望你们能帮助我更彻底地理解它,谢谢。

这是我的代码。

C#:

[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll")]
internal static extern uint SendInput(uint nInputs,[MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,int cbSize);

的AutoIt:

Send("{F1 down}")
Sleep(300)
Send("{F1 up}")

当C#代码不起作用时,AutoIt代码有效。为什么呢?

1 个答案:

答案 0 :(得分:0)

我从未在C#中使用SendInput()SendMessage()方法。

我是AutoIt和C#用户,因此我用来替换C#中AutoIt的Send()Sleep()函数的函数将是keybd_eventSystem.Threading.Thread.Sleep()

以下是keybd_event方法:

[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

....
keybd_event(0x52, 0, 1 | 0, 0);
keybd_event(0x52, 0, 1 | 2, 0);

检查MSDN以查找table of virtual key codes and their values