Обзор: Когда я нажимаю клавиши Ctrl+F во встроенном браузере, он открывается встроенный диалог поиска в Chromium.
До сих пор все в порядке.
Проблема в том, что курсор находится внутри Диалоговое окно «Найти», как показано ниже, а затем
- когда я нажимаю Ctrl+W, окно закрывается
- когда я нажимаю Ctrl+N, открывается новый экземпляр браузера Chromium
[img]https://i. sstatic.net/xVjSYaKi.png[/img]
Я пробовал следующие подходы:
Подход 1: Попробуйте захватить ключевые события в классе CustomKeyboardHandler, но что бы я ни нажимал/вводил в диалоговом окне поиска Chrome, следующая функция не фиксирует события клавиатуры (пока курсор не станет активным в диалоговом окне встроенного поиска Chromium).
using System;
using System.Windows.Forms;
using Xilium.CefGlue;
public class CustomKeyboardHandler : CefKeyboardHandler
{
protected override bool OnPreKeyEvent(CefBrowser browser, CefKeyEvent keyEvent, IntPtr osEvent, out bool isKeyboardShortcut)
{
isKeyboardShortcut = false;
if (keyEvent.Type == CefKeyEventType.KeyUp)
{
// Handle the key press event
HandleKeyPress(keyEvent);
}
return false;
}
private void HandleKeyPress(CefKeyEvent keyEvent)
{
// Check the pressed key and perform desired actions
if (keyEvent.WindowsKeyCode == (int)Keys.F1)
{
// Handle the F1 key press
Console.WriteLine("F1 key pressed!");
}
else if (keyEvent.WindowsKeyCode == (int)Keys.F2)
{
// Handle the F2 key press
Console.WriteLine("F2 key pressed!");
}
// Add more key checks as needed
}
}
Подход 2: Следующий подход отключает клавишу, но отключает клавиши Ctrl+W, Ctrl+N в приложении WPF, а также во всей Windows 10. .
Я просто хочу отключить Ctrl+W, Ctrl+N только внутри приложения WPF C#.
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;
namespace Mm.Wpf.GlobalHotKeys
{
public partial class MainWindow : Window
{
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
private const uint MOD_CONTROL = 0x0002;
private const uint MOD_FN = 0x0100;
private readonly Dictionary _hotkeys = new Dictionary
{
{ 1, (MOD_CONTROL, 0x73) }, // Ctrl+F4
{ 2, (MOD_CONTROL, 0x4A) }, // Ctrl+J
{ 3, (MOD_CONTROL, 0x4F) }, // Ctrl+O
{ 4, (MOD_CONTROL, 0x53) }, // Ctrl+S
{ 5, (MOD_CONTROL, 0x4E) }, // Ctrl+N
{ 6, (MOD_CONTROL, 0x48) }, // Ctrl+H
{ 7, (MOD_CONTROL, 0x54) }, // Ctrl+T
{ 8, (MOD_CONTROL, 0x57) }, // Ctrl+W
{ 9, (MOD_FN, 0x72) }, // Fn+F3
{ 10, (MOD_FN, 0x76) }, // Fn+F7
{ 11, (MOD_FN, 0x7A) } // Fn+F11
};
private IntPtr _windowHandle;
private HwndSource _source;
public MainWindow()
{
InitializeComponent();
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
_windowHandle = new WindowInteropHelper(this).Handle;
_source = HwndSource.FromHwnd(_windowHandle);
_source.AddHook(HwndHook);
foreach (var hotkey in _hotkeys)
{
RegisterHotKey(_windowHandle, hotkey.Key, hotkey.Value.Item1, hotkey.Value.Item2);
}
}
private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
const int WM_HOTKEY = 0x0312;
switch (msg)
{
case WM_HOTKEY:
int hotkeyId = wParam.ToInt32();
if (_hotkeys.ContainsKey(hotkeyId))
{
handled = true;
}
break;
}
return IntPtr.Zero;
}
protected override void OnClosed(EventArgs e)
{
_source.RemoveHook(HwndHook);
foreach (var hotkey in _hotkeys)
{
UnregisterHotKey(_windowHandle, hotkey.Key);
}
base.OnClosed(e);
}
}
}
Подход 3: использовал следующую логику для обработки событий нажатия клавиш в окне браузера CEF, встроенном в WPF, но это не сработало. this = MainWindow;// MainWindow is a type of System.Windows.Window
this.KeyDown += MainWindow_KeyDown;
this.KeyUp += MainWindow_KeyDown;
this.PreviewKeyDown += MainWindow_KeyDown;
this.PreviewKeyUp += MainWindow_KeyDown;
}
private static void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
Debug.WriteLine("Main Window Key Event");
if (e.Key == Key.W && Keyboard.Modifiers == ModifierKeys.Control)
{
// Handle Ctrl+W case
e.Handled = true; // Prevent further processing of this key
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... amework-ce