“INPUT"由于它的保护级别而无法进入

本文关键字:保护 INPUT quot 于它 | 更新日期: 2023-09-27 17:54:38

我试图建立一个小的应用程序,将发送输入到游戏。在搜索了一段时间后,我发现了许多建议使用SendInput的答案。

下面是我正在处理的代码(基本上是做了很多测试来看看什么是有效的,因此很混乱)。我建议您忽略大部分代码,我感兴趣的行,或者我应该说导致构建问题的行是:

public static extern uint SendInput(
    uint nInputs,[MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize);

这给了我错误:

由于其保护级别,'INPUT'无法访问。

我是c#(和Windows编程)的新手,所以我真的不知道我应该做些什么来解决这个问题。

任何帮助都会很感激。

提前感谢。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using WindowsInput;
namespace WindowsFormsApplication1
{
    [Flags]
    public enum KeyFlag
    {
        KeyDown = 0x0000,
        KeyUp = 0x0002,
        Scancode = 0x0008
    }

    internal static class VirtualKeyboard
    {
        public static void KeyDown(System.Windows.Forms.Keys key)
        {
            Console.WriteLine("Sending keybdevent: " + (byte)key);
            //keybd_event((byte)key, 0, 0, 0);
            /*INPUT[] InputData = new INPUT[2];
            Key ScanCode = Microsoft.DirectX.DirectInput.Key.W;
            InputData[0].type = 1; //INPUT_KEYBOARD
            InputData[0].wScan = (ushort)ScanCode;
            InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;
            InputData[1].type = 1; //INPUT_KEYBOARD
            InputData[1].wScan = (ushort)ScanCode;
            InputData[1].dwFlags = (uint)(SendInputFlags.KEYEVENTF_KEYUP | SendInputFlags.KEYEVENTF_UNICODE);
            // send keydown
            if (SendInput(2, InputData, Marshal.SizeOf(InputData[1])) == 0)
            {
                System.Diagnostics.Debug.WriteLine("SendInput failed with code: " +
                Marshal.GetLastWin32Error().ToString());
            }*/
            //InputSimulator.SimulateKeyDown(VirtualKeyCode.VK_E);
            Console.WriteLine("Exit.....");
        }
        [DllImport("user32.dll", SetLastError = true)]
        public static extern uint SendInput(uint nInputs, [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, int cbSize);
        public static void SendKey(short keyCode, KeyFlag keyFlag)
        {
            INPUT[] InputData = new INPUT[1];
            InputData[0].type = 1;
            InputData[0].ki.wScan = keyCode; // 0x14 = T for example
            InputData[0].ki.dwFlags = (int)keyFlag;
            InputData[0].ki.time = 0;
            InputData[0].ki.dwExtraInfo = IntPtr.Zero;
            SendInput(1, InputData, Marshal.SizeOf(typeof(INPUT)));
        }
        public static void PressKey(short key)
        {
            SendKey(key, KeyFlag.KeyDown | KeyFlag.Scancode);
            SendKey(key, KeyFlag.KeyUp | KeyFlag.Scancode);
        }
        public static void KeyUp(System.Windows.Forms.Keys key)
        {
            //keybd_event((byte)key, 0, 0x7F, 0);
        }
    }
}

“INPUT"由于它的保护级别而无法进入

INPUT结构体必须具有更高的访问级别,例如public,以便其他类可以访问它。参见访问修饰符。

public struct INPUT 
{  
   ...
}

在c#中,你必须显式地将struct成员标记为public。在c++中,它们自动为public。因此,您必须将INPUT标记为public