gpt4 book ai didi

c# - WPF 中的全局热键适用于每个窗口

转载 作者:可可西里 更新时间:2023-11-01 08:03:14 27 4
gpt4 key购买 nike

我必须使用可以在每个窗口和讲台上使用的热键。在我使用的 winforms 中:

RegisterHotKey(this.Handle, 9000, 0x0002, (int)Keys.F10);

UnregisterHotKey(this.Handle, 9000);

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case 0x312:
switch (m.WParam.ToInt32())
{
case 9000:
//function to do
break;
}
break;
}
}

在我的 WPF 应用程序中,我尝试这样做:

AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)HandleKeyDownEvent);

private void HandleKeyDownEvent(object sender, KeyEventArgs e)
{
if (e.Key == Key.F11 && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{
//function to do
}
}

但是只有当我的应用程序处于事件状态并且在顶部时它才起作用,但是当应用程序最小化时它不起作用(例如)。有什么方法可以做到吗?

最佳答案

您可以使用与 WinForms 中相同的方法并进行一些调整:

  • 使用 WindowInteropHelper 获取 HWND(而不是表单的 Handle 属性)
  • 使用 HwndSource 处理窗口消息(而不是覆盖窗体的 WndProc)
  • 不要使用 WPF 中的 Key 枚举 - 它的值不是您想要的值

完整代码:

[DllImport("User32.dll")]
private static extern bool RegisterHotKey(
[In] IntPtr hWnd,
[In] int id,
[In] uint fsModifiers,
[In] uint vk);

[DllImport("User32.dll")]
private static extern bool UnregisterHotKey(
[In] IntPtr hWnd,
[In] int id);

private HwndSource _source;
private const int HOTKEY_ID = 9000;

protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
var helper = new WindowInteropHelper(this);
_source = HwndSource.FromHwnd(helper.Handle);
_source.AddHook(HwndHook);
RegisterHotKey();
}

protected override void OnClosed(EventArgs e)
{
_source.RemoveHook(HwndHook);
_source = null;
UnregisterHotKey();
base.OnClosed(e);
}

private void RegisterHotKey()
{
var helper = new WindowInteropHelper(this);
const uint VK_F10 = 0x79;
const uint MOD_CTRL = 0x0002;
if(!RegisterHotKey(helper.Handle, HOTKEY_ID, MOD_CTRL, VK_F10))
{
// handle error
}
}

private void UnregisterHotKey()
{
var helper = new WindowInteropHelper(this);
UnregisterHotKey(helper.Handle, HOTKEY_ID);
}

private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
const int WM_HOTKEY = 0x0312;
switch(msg)
{
case WM_HOTKEY:
switch(wParam.ToInt32())
{
case HOTKEY_ID:
OnHotKeyPressed();
handled = true;
break;
}
break;
}
return IntPtr.Zero;
}

private void OnHotKeyPressed()
{
// do stuff
}

关于c# - WPF 中的全局热键适用于每个窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11377977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com