Xilium.CefGlue Обработка/переопределение нажатия клавиш Ctrl+W в Chromium Embedded Framework cefclient.exe, в приложенииC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Xilium.CefGlue Обработка/переопределение нажатия клавиш Ctrl+W в Chromium Embedded Framework cefclient.exe, в приложении

Сообщение Anonymous »

Я работаю над приложением C# WPF, использующим Xilium CefGlue Chromium Embedded Framework.
Обзор: внутри встроенного браузера, когда я нажимаю Ctrl+F , откроется встроенное диалоговое окно поиска Chromium.
Пока все в порядке.
Проблема в том, что когда курсор находится внутри диалогового окна «Найти», как показано ниже, а затем
  • когда я нажимаю Ctrl+W, окно закрывается< /p>
  • когда я нажимаю Ctrl+N, открывается новый экземпляр браузера Chromium
Изображение

Я пробовал следующие подходы:
Подход 1: Попробуйте захватить ключевые события в классе CustomKeyboardHandler, но что бы я ни нажимал/вводил внутри диалогового окна поиска Chromium следующая функция не фиксирует события клавиатуры (пока курсор не станет активным во встроенном диалоговом окне поиска 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»