由于某种原因,SendInput()Pinvoke不起作用。 SendInput()总是返回0,我试图以管理员身份运行它,仍然没有变化。它在c ++中完美运行。 我一直在找几个小时,请帮帮我。 我正在运行Windows 8 64x位计算机。也许它与我的操作系统有关?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication6
{
class Program
{
[DllImport("User32.dll", SetLastError = true)]
public static extern int SendInput(int nInputs, INPUT[] inputs, int cbSize);
public struct INPUT
{
public int type;
public KEYBDINPUT ki;
}
private static KEYBDINPUT createKeybdInput(ushort wVK, uint flag)
{
KEYBDINPUT i = new KEYBDINPUT();
i.wVk = wVK;
i.wScan = 0;
i.time = 0;
i.dwExtraInfo = IntPtr.Zero;
i.dwFlags = flag;
return i;
}
[StructLayout(LayoutKind.Sequential)]
public struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
public static void sim_type()
{
INPUT[] inp = new INPUT[2];
inp[0].type = 1;
inp[0].ki = createKeybdInput(0x41, 0x0001);
inp[1].type = 1;
inp[1].ki = createKeybdInput(0x41, 0x0002);
if (SendInput(2, inp, Marshal.SizeOf(typeof(INPUT))) == 0)
{
Console.WriteLine("error");
}
}
static void Main(string[] args)
{
Console.ReadLine();
sim_type();
Console.ReadLine();
}
}
}
谢谢!
答案 0 :(得分:0)
问题是您INPUT
的翻译不正确。看看definition from MSDN:
typedef struct tagINPUT {
DWORD type;
union {
MOUSEINPUT mi;
KEYBDINPUT ki;
HARDWAREINPUT hi;
};
} INPUT, *PINPUT;
您对KEYBDINPUT
的定义很好,但MOUSEINPUT
和HARDWAREINPUT
呢?你刚刚忽略了它们。这是一个联盟,所以三个成员都是彼此叠加的。因此,只有当KEYBDINPUT
是三者中最大的一个时,您的声明才有效。聪明的钱说它不是。
因此,请声明MOUSEINPUT
和HARDWAREINPUT
并将其包含在INPUT
的翻译中。您可以从pinvoke.net获得现成的翻译。并确保您注意到API调用返回的错误消息。您已将SetLastError
指定为true
。所以读出价值并注意它。