【问题标题】:How to implement Global Hotkeys in C#?如何在 C# 中实现全局热键?
【发布时间】:2010-12-10 16:23:35
【问题描述】:

我需要编写一个全局拦截 Alt+Shift+S 的应用程序。

我所做的是创建了一个设置全局挂钩的 DLL:

namespace Hotkeydll
{
    public class MyHotKey
    {
        public static void setHooks()
        {
            KeyboardHookProcedure = new HookProc(KeyboardHookProc);
            hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
        }

        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
        {
            //write something into file
        }


   }
}

然后我创建了一个程序来加载这个 DLL 并设置钩子:

using Hotkeydll;
namespace IWFHotkeyStarter
{
    class Program
    {
        static void Main(string[] args)
        {
            MyHotKey.setHooks();
        }
    }
}

现在的问题是热键不起作用。

看起来 DLL 没有永久加载到内存中。我看到我可以从文件系统中删除 dll 文件。

所以请指教我做错了什么?

我应该使用不同的方法吗?

谢谢。

【问题讨论】:

标签: c# dll global-hotkey


【解决方案1】:

您的 Main() 方法设置挂钩,然后立即退出并终止程序。此外,您需要一个消息循环来使挂钩回调起作用。这需要 Windows 窗体或 WPF 应用程序。现在使用真正的热键而不是钩子也成为一种选择。以this thread 为例,C# 位于页面下方。

【讨论】:

    【解决方案2】:

    键盘挂钩通常不是获取全局热键的正确方法。

    尽可能使用RegisterHotkey

    【讨论】:

    • @Paedow 那是 Windows API。您需要使用合适的 p/invoke 方法,但这并不难。
    • 这只是我不太擅长的事情,因为我从来没有学过
    猜你喜欢
    • 2016-12-03
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2020-02-21
    • 2016-06-04
    • 2018-12-21
    相关资源
    最近更新 更多