WPF 應用程式有一個在按下鍵盤快捷鍵 Test()時呼叫的方法。CTRLG
方法呼叫有效,因為字串test從方法的第一行列印到控制臺。
該方法應該以編程方式按下組合鍵CTRL A以選擇任何輸入欄位中的文本,但這不會發生。
我嘗試了 3 種方法:
第一:該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);
}
但在這種情況下,什么也沒有發生。
第三:安裝包Install-Package InputSimulator::
private static void Test(object sender, EventArgs e)
{
Console.WriteLine("test");
var simu = new InputSimulator();
simu.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL, VirtualKeyCode.VK_A);
}
完整代碼:https ://pastebin.com/ay8vRtjA
沒有錯誤,我做錯了什么?
uj5u.com熱心網友回復:
鍵組合在技術上有效,但代碼在您有任何時間釋放ALT鍵之前執行,從而生成最終組合CTRL ALT A而不是CTRL A. 我可能忽略了一些更簡單的解決方案,但我發現(大部分)作業的方式是:
- 攔截ALT密鑰
- 如果G在按下時按下ALT,則執行命令
- 如果G沒有按下,允許按鍵通過并發送模擬ALT(以便其他應用程式中的熱鍵仍然可以激活)
這是一個 hacky 解決方法,仍然會破壞一些常規功能(例如,如果您按下熱鍵ALT A來打開選單,選單將在您釋放后立即關閉ALT),但它使您的熱鍵作業。
我使用了幾年前創建的庫InputHelper來設定全域鍵盤掛鉤來攔截擊鍵并執行熱鍵。我還沒有將它發布到 NuGet,所以現在你必須通過Releases下載它并將 DLL 作為參考添加到你的專案中。
您還需要添加對System.Windows.Forms.
using System;
using System.Windows;
using System.Windows.Forms;
namespace HotkeyTest
{
public partial class MainWindow : Window
{
InputHelper.Hooks.KeyboardHook kbHook = new InputHelper.Hooks.KeyboardHook();
bool AltHotkeyConsumed = false;
public MainWindow()
{
InitializeComponent();
kbHook.KeyDown = KeyboardHook_KeyDown;
kbHook.KeyUp = KeyboardHook_KeyUp;
}
private void KeyboardHook_KeyUp(object sender, InputHelper.EventArgs.KeyboardHookEventArgs e)
{
if(e.KeyCode == Keys.LMenu || e.KeyCode == Keys.RMenu)
{
if(!AltHotkeyConsumed)
// If no hotkey was consumed, press the key again (otherwise it will just be blocked altogether)
InputHelper.Keyboard.PressKey(e.KeyCode);
else
AltHotkeyConsumed = false;
}
}
private void KeyboardHook_KeyDown(object sender, InputHelper.EventArgs.KeyboardHookEventArgs e)
{
if(e.KeyCode == Keys.LMenu || e.KeyCode == Keys.RMenu)
e.Block = true;
if(e.Modifiers == InputHelper.ModifierKeys.Alt)
{
if(e.KeyCode == Keys.G)
{
Test();
AltHotkeyConsumed = true;
e.Block = true;
}
else
{
e.Block = false;
}
}
}
private static void Test()
{
InputHelper.Keyboard.SetKeyState(Keys.LControlKey, true);
InputHelper.Keyboard.PressKey(Keys.A);
InputHelper.Keyboard.SetKeyState(Keys.LControlKey, false);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/466563.html
上一篇:如何有一個圓角矩形的單邊邊框?
