尝试使用InputSimulator模拟键盘输入。除了使用sim.Keyboard.ModifiedKeyStroke模拟ASCII字符的输入之外,一切都工作得很好。
我尝试使用以下两种不同的方式来模拟Alt down + numpad1 + numpad4 + numpad7 + Alt up:
sim.Keyboard.ModifiedKeyStroke(VirtualKeyCode.LMENU, new[] { VirtualKeyCode.NUMPAD1, VirtualKeyCode.NUMPAD4, VirtualKeyCode.NUMPAD7});和
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);这两样都不管用。我试着打印出控制台中的键状态,真正的按键和模拟按键都给出了相同的结果:
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中工作。我想这可能是同样的原因,所以我试着先解决这个问题。事实证明,它们是两个不同的问题:
uiAccess=true,并使用测试数字签名对".exe“文件进行签名;发布于 2016-08-26 10:02:21
使用keybd_event与MapVirtualKey或如果使用SendInput添加到输入的扫描MapVirtualKey。
下面是两者的例子,
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或带有MapVirtualKey的keybd_event编写自己的类来处理输入.
发布于 2022-06-23 23:23:59
你用的是什么版本的InputSimulator。版本1.0.4有ModifiedKeyStroke(IEnumerable modifierKeyCodes,IEnumerable keyCodes)方法,它应该允许以下内容:
sim.Keyboard.ModifiedKeyStroke(new[] { VirtualKeyCode.LMENU }, new[] { VirtualKeyCode.NUMPAD1, VirtualKeyCode.NUMPAD4, VirtualKeyCode.NUMPAD7 });发布于 2022-11-26 23:19:22
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);
}
}
}https://stackoverflow.com/questions/32861108
复制相似问题