簡體   English   中英

SendInput() PInvoke 不起作用,我不知道為什么

[英]SendInput() PInvoke doesn't work, i don't know why

由於某種原因 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();

        }


    }
}

謝謝!

問題是您對INPUT的翻譯不正確。 看看MSDN定義

typedef struct tagINPUT {
  DWORD type;
  union {
    MOUSEINPUT    mi;
    KEYBDINPUT    ki;
    HARDWAREINPUT hi;
  } DUMMYUNIONNAME;
} INPUT, *PINPUT, *LPINPUT;

您對KEYBDINPUT定義很好,但是MOUSEINPUTHARDWAREINPUT呢? 你只是忽略了他們。 這是一個工會,因此所有三個成員都放在一起。 因此,只有當KEYBDINPUT是三個中最大的一個時,您的聲明才能起作用。 聰明的錢說它不是。

因此,聲明MOUSEINPUTHARDWAREINPUT並將它們包含在您的INPUT翻譯中。 您可以從pinvoke.net獲得現成的翻譯。 並確保您注意 API 調用返回的錯誤消息。 您將SetLastError指定為true 因此,請讀出該值並注意它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM