c#如何在应用程序或插件中添加键盘快捷键侦听器

本文关键字:添加 键盘 快捷键 侦听器 插件 应用程序 | 更新日期: 2023-09-27 18:03:46

如何绑定c#将侦听的键盘事件?下面的代码应该在任何Office插件或c#桌面应用程序中工作。要使其工作,你应该在应用程序的加载函数中调用Hotkeys.Setup()。

应用程序的本地键盘事件和全局键盘事件之间有区别吗?

应该做些什么来扩展代码以测量键盘按下的持续时间?

应该做些什么来扩展代码,使其能够跨任何窗口工作?

当前代码:

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    namespace MyApp{
    public class Hotkeys{
    private delegate int LowLevelKeyboardProc(bool pressEnd, int keyData, Int64 keyState);
    private static IntPtr hookID;

    //Hotkeys.Setup() inside your app's loading function to initialize this class
    //return 0 to continue events registered to that keyboard shortcut, return 1 to stop            
    private static int HookCallback(bool pressEnd, int keyData, Int64 keyState)
    {
        if (pressEnd || keyState > Math.Pow(2,30))
            return 0;
        String key = ((Keys)keyData).ToString();
        if (GetKeyState((int)Keys.RShiftKey)<0 || GetKeyState((int)Keys.LShiftKey)<0)
            key += ", Shift";
        if (GetKeyState((int)Keys.ControlKey)<0)
            key += ", Control";
        if (GetKeyState((int)Keys.Menu)<0)
            key += ", Alt";
        switch (key) { 
        case "F1":
            MessageBox.Show("F1 pressed, continue events -- help window should popup");
            return 0;
        break; case "F2, Control":
            MessageBox.Show("Control F2 pressed, stop events");
            return 1;
        break; case "S, Control":
            MessageBox.Show("Control S pressed, stop events -- disabling save function");
            return 1;
        break;
        }
        return 0;
    }
    public static void Setup()
    {
        hookID = SetWindowsHookEx(2, HookCallback, IntPtr.Zero, (uint)Process.GetCurrentProcess().Threads[0].Id);
    }
    public static void Dispose()
    {
        UnhookWindowsHookEx(hookID);
    }
[DllImport("user32.dll")]
private static extern short GetKeyState(int keyId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int kid, LowLevelKeyboardProc llkp, IntPtr h, uint processId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hookid);
    }
    }

c#如何在应用程序或插件中添加键盘快捷键侦听器

你可以重写ProcessCmdKey for windowsForms:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    switch (keyData)
    {
        case Keys.F1:
            break;
        case Keys.F2:
            break;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}