59 lines
1.7 KiB
C#
59 lines
1.7 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
using Microsoft.UI.Xaml;
|
|
|
|
namespace ClipForge
|
|
{
|
|
public class GlobalHotkeyService
|
|
{
|
|
[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 int HOTKEY_CLIP = 1;
|
|
private const uint MOD_NOREPEAT = 0x4000; // don't fire on key repeat
|
|
|
|
public event Action? ClipRequested;
|
|
|
|
private IntPtr _hwnd;
|
|
private uint _modifiers;
|
|
private uint _vk;
|
|
|
|
/// <summary>Register the clip hotkey. Use settings values (e.g. HotkeyModifiers, HotkeyVirtualKey).</summary>
|
|
public void Initialize(IntPtr hwnd, uint modifiers, uint vk)
|
|
{
|
|
_hwnd = hwnd;
|
|
_modifiers = modifiers;
|
|
_vk = vk;
|
|
TryRegister();
|
|
}
|
|
|
|
/// <summary>Update the hotkey at runtime (e.g. after user remaps). Unregisters old and registers new.</summary>
|
|
public bool UpdateHotkey(uint modifiers, uint vk)
|
|
{
|
|
UnregisterHotKey(_hwnd, HOTKEY_CLIP);
|
|
_modifiers = modifiers;
|
|
_vk = vk;
|
|
return TryRegister();
|
|
}
|
|
|
|
private bool TryRegister()
|
|
{
|
|
uint mod = _modifiers | MOD_NOREPEAT;
|
|
return RegisterHotKey(_hwnd, HOTKEY_CLIP, mod, _vk);
|
|
}
|
|
|
|
public void ProcessHotkey(int id)
|
|
{
|
|
if (id == HOTKEY_CLIP)
|
|
ClipRequested?.Invoke();
|
|
}
|
|
|
|
public void Cleanup()
|
|
{
|
|
UnregisterHotKey(_hwnd, HOTKEY_CLIP);
|
|
}
|
|
}
|
|
} |