首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用InputSimulator

使用InputSimulator
EN

Stack Overflow用户
提问于 2015-09-30 08:13:32
回答 3查看 2.6K关注 0票数 3

尝试使用InputSimulator模拟键盘输入。除了使用sim.Keyboard.ModifiedKeyStroke模拟ASCII字符的输入之外,一切都工作得很好。

我尝试使用以下两种不同的方式来模拟Alt down + numpad1 + numpad4 + numpad7 + Alt up

代码语言:javascript
复制
    sim.Keyboard.ModifiedKeyStroke(VirtualKeyCode.LMENU, new[] { VirtualKeyCode.NUMPAD1, VirtualKeyCode.NUMPAD4, VirtualKeyCode.NUMPAD7});

代码语言:javascript
复制
    sim.Keyboard.KeyDown(VirtualKeyCode.LMENU);
    sim.Keyboard.KeyDown(VirtualKeyCode.NUMPAD1);
    sim.Keyboard.KeyUp(VirtualKeyCode.NUMPAD1);
    sim.Keyboard.KeyDown(VirtualKeyCode.NUMPAD4);
    sim.Keyboard.KeyUp(VirtualKeyCode.NUMPAD4);
    sim.Keyboard.KeyDown(VirtualKeyCode.NUMPAD7);
    sim.Keyboard.KeyUp(VirtualKeyCode.NUMPAD7);
    sim.Keyboard.KeyUp(VirtualKeyCode.LMENU);

这两样都不管用。我试着打印出控制台中的键状态,真正的按键和模拟按键都给出了相同的结果:

代码语言:javascript
复制
   LMenu key down
   NumPad1 key down
   NumPad1 key up
   NumPad4 key down
   NumPad4 key up
   NumPad7 key down
   NumPad7 key up
   LMenu key up

我认为应该是库的一些问题:问题1。有人能帮我一下吗?还有别的办法吗?

更新1

我发现"Alt+Tab“也没有在Win8中工作。我想这可能是同样的原因,所以我试着先解决这个问题。事实证明,它们是两个不同的问题:

  1. 要使"Alt+Tab“起作用,我需要在"app.manifest”中设置uiAccess=true,并使用测试数字签名对".exe“文件进行签名;
  2. 模拟ASCII字符的输入仍然不能工作。
EN

回答 3

Stack Overflow用户

发布于 2016-08-26 10:02:21

使用keybd_eventMapVirtualKey或如果使用SendInput添加到输入的扫描MapVirtualKey

下面是两者的例子,

代码语言:javascript
复制
using System;
using System.Threading;
using System.Runtime.InteropServices;

namespace kbd_events_example
{
    static class Program
    {
        #pragma warning disable 649
        internal struct INPUT
        {
            public UInt32 Type;
            public KEYBOARDMOUSEHARDWARE Data;
        }
        [StructLayout(LayoutKind.Explicit)]
        //This is KEYBOARD-MOUSE-HARDWARE union INPUT won't work if you remove MOUSE or HARDWARE
        internal struct KEYBOARDMOUSEHARDWARE
        {
            [FieldOffset(0)]
            public KEYBDINPUT Keyboard;
            [FieldOffset(0)]
            public HARDWAREINPUT Hardware;
            [FieldOffset(0)]
            public MOUSEINPUT Mouse;
        }
        internal struct KEYBDINPUT
        {
            public UInt16 Vk;
            public UInt16 Scan;
            public UInt32 Flags;
            public UInt32 Time;
            public IntPtr ExtraInfo;
        }
        internal struct MOUSEINPUT
        {
            public Int32 X;
            public Int32 Y;
            public UInt32 MouseData;
            public UInt32 Flags;
            public UInt32 Time;
            public IntPtr ExtraInfo;
        }
        internal struct HARDWAREINPUT
        {
            public UInt32 Msg;
            public UInt16 ParamL;
            public UInt16 ParamH;
        }
        #pragma warning restore 649
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
        static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint extraInfo);
        [DllImport("user32.dll", SetLastError = true)]
        static extern int MapVirtualKey(uint uCode, uint uMapType);
        [DllImport("user32.dll", SetLastError = true)]
        static extern UInt32 SendInput(UInt32 numberOfInputs, INPUT[] inputs, Int32 sizeOfInputStructure);
        enum VK
        {
            MENU = 0x12,
            NUMPAD0 = 0x60,
            NUMPAD1 = 0x61,
            NUMPAD2 = 0x62,
            NUMPAD3 = 0x63,
            NUMPAD4 = 0x64,
            NUMPAD5 = 0x65,
            NUMPAD6 = 0x66,
            NUMPAD7 = 0x67,
            NUMPAD8 = 0x68,
            NUMPAD9 = 0x69
        }
        const uint KEYEVENTF_KEYUP = 0x0002;
        public const int INPUT_KEYBOARD = 1;
        [STAThread]
        static void Main()
        {
            Thread.Sleep(5000); //wait 5 seconds, so you can focus the Notepad
            keybd_event((int)VK.MENU, (byte)MapVirtualKey((uint)VK.MENU, 0), 0, 0); //Alt Press  
            keybd_event((int)VK.NUMPAD1, (byte)MapVirtualKey((uint)VK.NUMPAD1, 0), 0, 0); // N1 Press  
            keybd_event((int)VK.NUMPAD1, (byte)MapVirtualKey((uint)VK.NUMPAD1, 0), KEYEVENTF_KEYUP, 0); // N1 Release  
            keybd_event((int)VK.MENU, (byte)MapVirtualKey((uint)VK.MENU, 0), KEYEVENTF_KEYUP, 0); // Alt Release    
            Thread.Sleep(2000); //wait 2 seconds
            INPUT[] inputs = new INPUT[] {
                new INPUT {Type = INPUT_KEYBOARD, Data = new KEYBOARDMOUSEHARDWARE { Keyboard = new KEYBDINPUT { Vk = (ushort)VK.MENU, Flags = 0, Scan = (ushort)MapVirtualKey((uint)VK.MENU, 0), ExtraInfo = IntPtr.Zero, Time = 0}}},
                new INPUT {Type = INPUT_KEYBOARD, Data = new KEYBOARDMOUSEHARDWARE { Keyboard = new KEYBDINPUT { Vk = (ushort)VK.NUMPAD2, Flags = 0, Scan = (ushort)MapVirtualKey((uint)VK.NUMPAD2, 0), ExtraInfo = IntPtr.Zero, Time = 0}}},
                new INPUT {Type = INPUT_KEYBOARD, Data = new KEYBOARDMOUSEHARDWARE { Keyboard = new KEYBDINPUT { Vk = (ushort)VK.NUMPAD2, Flags = 2, Scan = (ushort)MapVirtualKey((uint)VK.NUMPAD2, 0), ExtraInfo = IntPtr.Zero, Time = 0}}},
                new INPUT {Type = INPUT_KEYBOARD, Data = new KEYBOARDMOUSEHARDWARE { Keyboard = new KEYBDINPUT { Vk = (ushort)VK.MENU, Flags = 2, Scan = (ushort)MapVirtualKey((uint)VK.MENU, 0), ExtraInfo = IntPtr.Zero, Time = 0}}}
            };
            SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(INPUT)));
        }
    }
}

至于InputSimulator,您需要使用SendInput或带有MapVirtualKeykeybd_event编写自己的类来处理输入.

票数 0
EN

Stack Overflow用户

发布于 2022-06-23 23:23:59

你用的是什么版本的InputSimulator。版本1.0.4有ModifiedKeyStroke(IEnumerable modifierKeyCodes,IEnumerable keyCodes)方法,它应该允许以下内容:

代码语言:javascript
复制
sim.Keyboard.ModifiedKeyStroke(new[] { VirtualKeyCode.LMENU }, new[] { VirtualKeyCode.NUMPAD1, VirtualKeyCode.NUMPAD4, VirtualKeyCode.NUMPAD7 });
票数 0
EN

Stack Overflow用户

发布于 2022-11-26 23:19:22

代码语言:javascript
复制
    using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;
using System.Threading;
using WindowsInput;
 


namespace WindowsMacros
{
    class Program
    {
        
        // import function in your class
        [DllImport("User32.dll")]
        static extern int SetForegroundWindow(IntPtr point);

        static string programnamepath = @"C:\Users\Murzic2\Desktop\Resize.exe — ярлык.lnk";
        static string FolderDeafault = @"C:\Users\Murzic2\Desktop\Resize";
        static void Main(string[] args)
        {
            MethodResizezing();
        }// End Main

        private static void MethodResizezing()
        {
            if (!Directory.Exists(FolderDeafault))
            {
                Directory.CreateDirectory(FolderDeafault);

            }
            Process process = Process.Start(programnamepath);

            Process[] processes = Process.GetProcessesByName("Resize"); // Programm Name
            Process resize = new Process();
            foreach (Process str in processes)
            {
                if (str.ProcessName.Contains("Resize"))
                {
                    resize = str;
                    Console.WriteLine(resize.ProcessName);
                }
                
            }
            if (resize != null)
            {
                Console.WriteLine("Begin programm into focus ...");
                IntPtr h = resize.MainWindowHandle;
                SetForegroundWindow(h);

               

                Console.WriteLine("Getting Out Of Programm");

                InputSimulator isim = new InputSimulator(); // From Library  InputSimulator
                if (resize.StartInfo.CreateNoWindow)
                {
                    Console.WriteLine(resize.StartTime);
                }


                Thread.Sleep(3000);// After need write according process stoped                      

                MouseMove(isim, 222, 83); // Move Mouse to Open Folder Window

                isim.Mouse.LeftButtonClick(); // Open  Directory Window Window 

                MouseMove(isim, 297, 269); // 

                isim.Mouse.LeftButtonClick();

                Thread.Sleep(200);
                isim.Keyboard.ModifiedKeyStroke(WindowsInput.Native.VirtualKeyCode.CONTROL, WindowsInput.Native.VirtualKeyCode.VK_A);// Select all Key Stroke Ctrl+A
                Thread.Sleep(200);
                isim.Keyboard.KeyPress(WindowsInput.Native.VirtualKeyCode.RETURN); // Enter Key
                
                MouseMove(isim, 1468, 796);

                isim.Mouse.LeftButtonClick();
                Thread.Sleep(200);
                isim.Keyboard.KeyPress(WindowsInput.Native.VirtualKeyCode.RETURN); // Enter Key

                Thread.Sleep(800);

            }

            Console.ReadKey();

            // open this code after finishing ))
            foreach (Process prc in processes)
            {
                if (prc.ProcessName.Contains("Resize"))
                {
                    prc.Kill();

                }

            }

        }

    private static void MouseMove(InputSimulator isim,double X, double Y)
        {
            //X = 222; --  Coordintes on scree`enter code here`n  which you need
            //Y = 83;  --  Coordinates on screen which you need
            Thread.Sleep(350);
            X = X * 65535 / 1535; // Converting trgarding yours screen 
            Y = Y * 65535 / 862;// Converting trgarding yours screen 
            isim.Mouse.MoveMouseTo(Convert.ToDouble(X), Convert.ToDouble(Y)); //
            Thread.Sleep(150);         


        }      

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32861108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档