如何在调用我的应用程序中的函数的窗口中创建键盘快捷键?

2023-11-27

How can I create an application that performs an action with keyboard shortcut (App must be unvisible). For example Shows MessageBox when user press Ctrl + Alt + W.


一种解决方案是使用互操作并使用 Win32注册热键API。这是我刚刚放在一起的一个快速而肮脏的示例,因此它没有经过充分测试,我不确定是否有任何意外的副作用,但它应该有效。

首先这里有一个简单的HotKeyManager这负责基本的互操作,提供一个隐藏窗口来处理本机 Windows 消息 (WM_HOTKEY),该消息被转换为 .NET 事件HotKeyPressed

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

  public class HotKeyManager
  {
    public static event EventHandler<HotKeyEventArgs> HotKeyPressed;

    public static int RegisterHotKey(Keys key, KeyModifiers modifiers)
    {
      int id = System.Threading.Interlocked.Increment(ref _id);
      RegisterHotKey(_wnd.Handle, id, (uint)modifiers, (uint)key);
      return id;
    }

    public static bool UnregisterHotKey(int id)
    {
      return UnregisterHotKey(_wnd.Handle, id);
    }

    protected static void OnHotKeyPressed(HotKeyEventArgs e)
    {
      if (HotKeyManager.HotKeyPressed != null)
      {
        HotKeyManager.HotKeyPressed(null, e);
      }
    }

    private static MessageWindow _wnd = new MessageWindow();

    private class MessageWindow : Form
    {
      protected override void WndProc(ref Message m)
      {
        if (m.Msg == WM_HOTKEY)
        {
          HotKeyEventArgs e = new HotKeyEventArgs(m.LParam);
          HotKeyManager.OnHotKeyPressed(e);
        }

        base.WndProc(ref m);
      }

      private const int WM_HOTKEY = 0x312;
    }

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

    [DllImport("user32")]
    private static extern bool UnregisterHotKey(IntPtr hWnd, int id);

    private static int _id = 0;
  }


  public class HotKeyEventArgs : EventArgs
  {
    public readonly Keys Key;
    public readonly KeyModifiers Modifiers;

    public HotKeyEventArgs(Keys key, KeyModifiers modifiers)
    {
      this.Key = key;
      this.Modifiers = modifiers;
    }

    public HotKeyEventArgs(IntPtr hotKeyParam)
    {
      uint param = (uint)hotKeyParam.ToInt64();
      Key = (Keys)((param & 0xffff0000) >> 16);
      Modifiers = (KeyModifiers)(param & 0x0000ffff);
    }
  }

  [Flags]
  public enum KeyModifiers
  {
    Alt = 1,
    Control = 2,
    Shift = 4,
    Windows = 8,
    NoRepeat = 0x4000
  }

下面显示了一个简单的 Windows 窗体应用程序,它将保持主窗体隐藏并响应热键事件。我没有处理应用程序的关闭和热键的注销,你可以处理。

using System;
using System.Windows.Forms;

namespace HotKeyManager
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
      HotKeyManager.RegisterHotKey(Keys.A, KeyModifiers.Alt);
      HotKeyManager.HotKeyPressed += new EventHandler<HotKeyEventArgs>(HotKeyManager_HotKeyPressed);     
    }

    void HotKeyManager_HotKeyPressed(object sender, HotKeyEventArgs e)
    {
      MessageBox.Show("Hello");
    }

    protected override void SetVisibleCore(bool value)
    {      
      // Quick and dirty to keep the main window invisible      
      base.SetVisibleCore(false);
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在调用我的应用程序中的函数的窗口中创建键盘快捷键? 的相关文章

  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 如何在 WinRT 应用程序中获取实际语言?

    是否有可能像 Windows Phone 一样获取操作系统的实际语言 我在用着CultureInfo CurrentCulture TwoLetterIsoString 但我总是收到 en 而不是正确的语言 即de就我而言 那么如何获取 W
  • 如何在 Meteor 中访问客户端 IP 地址? [复制]

    这个问题在这里已经有答案了 这似乎是一个非常基本的问题 没有一个优雅的解决方案 答案 如何从 1 服务器或 2 客户端访问客户端 远程 IP 地址 获取客户端IP 如果没有 http 请求 在函数中您应该能够通过以下方式获取 clientI
  • 变量变量

    如何在 for 循环内创建可变变量 这是循环 for counter 1 counter lt aantalZitjesBestellen counter 在这个循环中 我想在每次通过时创建一个变量 seat 但它必须像这样递增 第一次通过
  • Travis CI 忽略 MAVEN_OPTS?

    我的 Scala 项目 Maven 管理的 无法在 Travis 上构建 抛出一个GC overhead limit exceeded尽管在本地用相同的方法编译得很好 但仍然出错MAVEN OPTS Xmx3g XX MaxPermSize
  • ASP.NET 自定义控件 - 仅包含一次嵌入 CSS 引用的最佳方法是什么?

    问题 我将 CSS 文件嵌入到具有多个控件的自定义控件库中 我想为所有控件共享相同的 CSS 文件 无论给定表单上有多少个控件实例 当表单上有多个控件时 我希望在 ASP NET 页面的 HTML 标头中恰好有 1 个对 CSS 文件的引用
  • jQuery - 删除所有具有相似名称的类

    有没有更好的方法来做到这一点 element removeClass class 1 removeClass class 2 removeClass class 3 removeClass class 5 to removeClass cl
  • 为什么 @objc 枚举的描述与纯 Swift 枚举不同?

    考虑两个 Swift 枚举 enum Foo Int case bar objc enum Baz Int case qux 如果我要print each case对于这些枚举 我期望得到相同的结果 相反 我看到了一些意想不到的东西 pri
  • 在 32 位 Windows 上使用 NASM 在程序集中创建 exe 文件

    我正在用汇编语言编写一个 hello world 程序NASM在 32 位上Windows 7的 我的代码是 section text global main must be declared for linker ld main tell
  • 我应该如何类型提示一个也可以是无限的整数变量?

    搜索这个主题时我发现了以下内容 如何表示整数无穷大 我同意 Martijn Peeters 的观 点 即为int可能不是最好的想法 然而 这使得类型提示变得困难 假设以下代码 myvar 10 type int myvar math inf
  • ASP.NET MVC 2 中的验证实际上是如何工作的?

    我试图追踪为什么我的 ASP NET MVC 2 验证不起作用 但我找不到足够的关于它如何工作的信息来做到这一点 我已按照此步骤操作大卫 海登的有用文章这似乎是目前最好的文档 但实际上什么也没发生 当我提交到服务器时 我得到了验证 就像我从
  • 防止 Angular 中的多个 $http 请求。有没有更好的办法?

    我构建了一个有点复杂的方法来通过 http 返回资源 该方法返回一个承诺 然后检查我的本地缓存是否存在资源 如果是 它将返回缓存的资源 如果不是 它将发出 http 请求 这在资源被缓存后效果很好 但是我在加载时调用此方法的应用程序中有多个
  • 如何取消 Sublime Text 3 中正在进行的查找/搜索

    如何取消 Sublime Text 中正在进行的搜索 基本上当我使用递归文件夹搜索特定文本时 ctrl shft F 但有时 如果搜索模式不好 它会无限运行 如何在不关闭 Sublime text 的情况下取消错误的搜索 我使用的停止搜索的
  • 上传没有 multipart/form-data 的文件(服务器到服务器)

    从这个答案https stackoverflow com a 1695287 256400 我感觉多部分 表单数据需要将文件从浏览器上传到服务器 但是 如果我的用例是将文件从服务器上传到服务器 如果我将内容类型 as 应用程序 八位字节流甚
  • MediaPlayer.seekTo() 不寻求在 Android 上定位

    我正在开发一个应用程序 其中视频以 3 个不同的时间间隔暂停 第二次暂停后 如果单击按钮 则应从之前的位置开始返回 例如 如果当前在 1 30 暂停 则单击按钮后 它将转到上一个书签 即 00 45 我认为使用 MediaPlayer se
  • ValueError 不支持 psycopg2 的格式字符“d”

    我有这样的代码 print company id d company id db cursor execute insert into person company id first last type values d s s d com
  • 两个表上的 Rails 自定义foreign_key名称

    我有两个模型 例如 User 和 Club 及其属性 User id uid email etc and Club id player id address supporter etc 由于某种原因 连接属性是clubs player id
  • 将任何记录转换为字符串并返回?

    我怎样才能转换任何record键入单个String然后回来 也许将记录加载到流中并将其作为字符串读取 我使用的记录不会包含任何特殊类型 它们只是使用简单的东西 例如String Integer PChar DWORD and Array o
  • android viewpager 中的幻灯片?

    我在使用 android viewpager 幻灯片时遇到问题 我想在最短时间段后显示视图页面布局 这是我的代码示例 我的主要课程 public class MainActivity extends Activity private Vie
  • 本地主机上是否需要 SSL?

    我们有一个将使用自签名证书的 Web 应用程序 将其安装到服务器上后 浏览器将在 https 本地主机 不 为了论证 我要声明我们不能使用实际的机器名称 这将生成浏览器错误 因为 localhost 不是证书的域 一个选项是在 HTTP 上
  • 如何在调用我的应用程序中的函数的窗口中创建键盘快捷键?

    How can I create an application that performs an action with keyboard shortcut App must be unvisible For example Shows M