WPF 应用程序有一个在按下+Test()组合键时调用的方法。CTRLG
test方法调用有效,因为字符串从方法的第一行打印到控制台。
CTRL该方法应该以编程方式按下+组合键A以突出显示任何输入字段中的文本,但事实并非如此。
我尝试了两种方法:
第一:接受字符串的方法System.Windows.Forms.SendKeys.SendWait(),其中^- CTRL- 根据文档
private void Test(object sender, EventArgs e)
{
Console.WriteLine("test");
SendKeys.SendWait("^A");
}
但是,没有紧迫感。
第二:通过实施user32.dll,解决方案取自这里:
[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
public static void PressKey(Keys key, bool up)
{
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
if (up)
keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0);
else
keybd_event((byte)key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
}
private void Test(object sender, EventArgs e)
{
Console.WriteLine("test");
PressKey(Keys.ControlKey, up: false);
PressKey(Keys.A, up: false);
PressKey(Keys.A, up: true);
PressKey(Keys.ControlKey, up: true);
}
但在这种情况下,什么也没有发生。
我的错误是什么?
keybd_event是一种过时的 Win API 方法,目前的方法是SendInput. 对于第一个,您必须Thread.Sleep(50)在按下和释放键之间实现手动暂停类型,然后它并不总是有效,但它会有效。但是有一个更好的方法。其实有一个 NuGet 包InputSimulator,它可以做到这一切,只需安装它并使用一键输出。在内部,它使用相同
SendInput的方法,但我已经有自己的现成实现您需要的方法。SendInput顺便说一句,它支持键盘和鼠标模拟。赢API
现在你可以写这个方法
它看起来很吓人,但这就是微软决定做一些可怕的事情的方式。但它完美无缺。
如何使用
Ctrl+C
Ctrl+Shit+Esc
F
顺便说一句,某些组合的使用存在系统限制,例如 using
ModifierKeys.Windowsand another typeCtrl+Alt+Del,这禁止了某些应用程序可能在您不知情的情况下更改您的系统密码和其他危险事情的情况。这不能被绕过,如果某些东西不起作用,那么首先要确保这不受 Windows 保护系统的限制。