`
clzqwdy
  • 浏览: 3138 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

初学者导学:使用全局热键

阅读更多

原文: Beginner's Tutorial - Using global hotkeys

Posted: 29 Apr 2002 | Author: Nishant Sivakumar

Translated: July 17, 2009 | Author: ToughWater

Version: V0.1       July 17, 2009

前言

今天早晨,有人在VC++论坛询问如何使用热键[1]。我从没使用过热键,所以它激发了我很大的兴趣。我想我将会编写[2]一个简单的应用程序,并且为CodeProject写一篇小巧[3]的文章。这些天我已经写了太多的.NET的文章,所以我想是时候写一些正规的非托管程序了,Mike DunnColin Davies是这么叫这些程序的。

 

首先要记住的一点是我们编写的热键将会对操作系统全局有效。因此,仔细考虑一下选择什么作为你的热键。同时判断一下你的应用程序是否重要到能够拥有操作系统级别的快捷键。用户可能会偶然地按下CtrlD[4],突然发现你的应用程序弹了出来[5]。事实上,如果这是个年龄足够大的用户,突然弹出的没有预料到的窗口可能会导致他或她心脏病发作。很明显,这样一种情形是要被避免的。

如何设置热键

好了,设置热键仅仅是一种API调用,而不是像有的人想的那样认为它是一个复杂的过程。我们使用RegisterHotKey这种API调用,它的原型声明[6]如下:

 

BOOL RegisterHotKey(
    HWND hWnd,              // window to receive hot-key notification
    int id,                 // identifier of hot key
    UINT fsModifiers,      // key-modifier flags
    UINT vk                 // virtual-key code
);

 

一个正规的应用程序可以使用在0x00000xBFFF之间的任何值作为ID值,但是如果你写的是一个DLL,那么你必须使用GlobalAddAtom方法为你的热键得到一个独特的标示符[7]。目前有四个被允许的关键修饰语 [8],也就是你可以用 Ctrl键、Alt键、Shift键和WinKey来修饰其他键。你可以单独用它们来修饰[9],或者用它们每一个的组合。例如,你可以设置这样一个组合快捷键,像Ctrl+Shift+WinKey+Y来弹出yahoo messenger,尽管你为什么想要建立那种费解的快捷键将会是一个很难回答的问题。

 

RegisterHotKey(hWndA, 100, MOD_ALT | MOD_SHIFT, 'P');
RegisterHotKey(hWndA, 200, MOD_WIN, 'R');

 

好了,设置热键就是这么简单。那么,这会有什么作用呢[10]?好问题!我们已经实现的是,无论何时这个热键被按下,一个WM_HOTKEY消息将会被发送到通过HWND参数来区分的指定窗口。Neat。同样记得如果你试图设置一个已经被注册的热键,像WinKey+E热键就会启动资源管理器Explorer,那么此时RegisterHotKey这个函数就会失败并且返回FALSE,否则它将会返回TRUE。所以请不要不检查返回值。

注销热键

正如你们所期待的,有一个API调用叫做UnregisterHotKey,这个函数可以注销我们的热键。记得当你的程序退出时注销所有的热键。事实上,注销一个可能已经被注销的热键仅仅是为了安全。那样做一点也没有害处。这个函数的原型如下:

 

BOOL UnregisterHotKey(
    HWND hWnd,  // window associated with hot key
    int id      // identifier of hot key
);

 

ID标示符是和我们已经传给RegisterHotKey的一样的。如果你已经用了GlobalAddAtom方法来得到一个独特的标示符,你必须在某个地方[11]保存它以便你可以用它来注销热键。

 

UnregisterHotKey(hWndMain,300);

处理热键

如果你正在写一个直接调用API的程序[12],你应该不会在处理WM_HOTKEY消息时有太多的困难。只要检查下wParam参数,它将会包含热键的标示符。使用MFC的问题是,由于一些奇怪的原因,类向导似乎并不包括WM_HOTKEY消息。当我最初开始写程序的时候,我使用的是VC++ 6.0 with SP5。我并不清楚VC++ 7.0是否有同样的问题,甚至不知道对于VC++ 6.0是否有处理同种难解问题的可行方案 [13]。如果你知道一种可行方案,也请让我知道[14]。但是这并不能阻止我们增加这个条目[15]到消息映射上。在规则下那样做是完美无暇的,我说[16]

 

ON_MESSAGE(WM_HOTKEY,OnHotKey)

 

好了,上面那个非常简单。现在,我们增加我们的(处理)函数。仅仅增加这个函数到你的窗口类,就是那个将要接收WM_HOTKEY消息的窗口所在的类。

 

LRESULT OnHotKey(WPARAM wParam, LPARAM lParam);

 

现在你所有要做的事情就是写函数体,检查wParam参数,然后看一下它是否是你的热键的ID,接着做你想做的。非常典型地,你可能会想用ShellExecute来开启你的程序,这个我已经在这篇文章的样例程序中做了。

样例程序

Well,这个样例程序是很快被拼凑起来的,它让你选择一个单独的修饰键(它不允许多元修饰符),而且你可以在AZ之间选择一个虚拟键。还有,你可以浏览并且选择[17]一个可执行程序,当你点击【开始】按钮以后,(刚刚浏览到的程序的)热键就启用了。这是一个非常简单的程序,并没有真正做什么事情。但是如果我的讲解对你并不够连贯,你可以浏览整个源代码。

样例程序

许可

这篇文章,和任何相关的源代码和文件一道,都是在The Microsoft Public License (Ms-PL)许可下的。

 

 

点击下面的链接下载:

1
0
分享到:
评论

相关推荐

    趣味程序导学:Java.2

    本书不仅适合Java编程初学者,也适用于那些对游戏编程感兴趣的电脑爱好者。 #### Java基础知识 第一章节主要介绍了Java的基础知识,包括Java的历史背景、特点以及应用场景,并深入浅出地讲解了Java的基本语法结构...

    [趣味程序导学:Delphi].杨正华.文字版.pdf

    《趣味程序导学:Delphi》是一本专为初学者设计的编程教程,作者杨正华以其丰富的教学经验,深入浅出地介绍了使用Delphi进行软件开发的基本知识和技巧。Delphi是Borland公司(现Embarcadero Technologies)推出的一...

    易语言API全局热键源码.rar

    易语言,作为一种中文编程语言,以其独特的语法和易用性深受初学者和专业人士的喜爱。API全局热键是计算机编程中的一个重要概念,它允许程序在不处于活动状态时也能响应特定的按键组合,从而实现快捷操作或特定功能...

    QQ全局热键截图功能

    1. **捕获屏幕图像**:使用Windows API中的`GetDesktopWindow`获取桌面窗口句柄,然后调用`GetWindowDC`获取设备上下文(Device Context, DC),接着使用`CreateCompatibleDC`创建一个与桌面DC兼容的新DC。...

    呵呵仙的易模块17(注册全局热键的更新) -易语言

    在使用"呵呵仙的易模块17"时,用户只需理解模块提供的接口,按照其规定的方式调用,就可以在自己的程序中注册和使用全局热键。 在编写与热键相关的代码时,还需要注意以下几个方面: - 避免与其他已注册的热键冲突...

    易语言简单注册F1热键

    6. **学习与调试**:对于初学者,可以通过分析源码,学习如何在易语言中处理键盘事件,以及如何利用系统API进行热键注册。同时,通过运行程序并模拟按下F1键,观察程序的响应,可以帮助理解代码的执行流程和效果。 ...

    易语言热键注册热键源码例程

    对于初学者来说,这个例程是一个很好的起点,能够帮助你快速上手并实践易语言的基本用法。同时,通过分析和修改这个例程,你可以尝试实现更复杂的热键功能,比如自定义热键的快捷菜单、热键触发的多步操作等,进一步...

    易语言源码易语言实现局部热键.rar

    局部热键是指在特定程序运行时才能响应的快捷键,不同于全局热键,它只在当前应用程序窗口有效。 源码分析: 1. **热键注册与注销**:在易语言中,可以使用系统API函数来注册和注销热键。注册热键通常涉及到`...

    易语言源码易语言热键注册热键源码例程.rar

    易语言是一种专为初学者设计的编程语言,其特点在于语法简洁、易学易用,因此得名“易语言”。本压缩包“易语言源码易语言热键注册热键源码例程.rar”提供了易语言编写的关于热键注册和使用的源代码示例,这对于学习...

    java小项目 适合初学者

    Java编程语言因其良好的跨平台性能、稳定的运行环境和丰富的类库资源,成为了众多编程初学者的首选语言。对于想要学习Java的初学者而言,找到合适的实践项目是快速提升编程能力的重要步骤。本文将探讨适合初学者的...

    JavaScript示例导学(书籍)

    综上所述,《JavaScript示例导学》是一本非常实用的学习资料,不仅能够帮助初学者快速掌握JavaScript的基本概念和编程技巧,还能引导读者深入探索JavaScript的高级功能,非常适合希望在网页编程领域有所发展的读者。

    Python编程初学者指南.pdf

    Python编程初学者指南.pdf

    适合初学者 eclipse 极为简易的android软件记事本代码实例

    这表明该资源是一个针对编程初学者的教程,使用Eclipse集成开发环境(IDE)来创建一个简单的Android应用程序,即一个记事本程序。对于初学者而言,这个实例能够帮助他们入门Android应用开发,了解Eclipse在Android...

    Solidity编程 - 构建以太坊和区块链智能合约的初学者指南

    Solidity编程 - 构建以太坊和区块链智能合约的初学者指南

    比较全的asp教程,适合初学者使用的

    这个"最全的一套ASP教程"包含了全面的学习资源,对于初学者来说是宝贵的入门资料。 首先,ASP的核心原理是它允许开发者在HTML代码中嵌入VBScript或JScript代码,这些代码在服务器上执行后,生成包含动态内容的HTML...

    易语言注册多个热键源码.rar

    易语言是一种专为初学者设计的编程语言,其特点在于语法简单、易学易用,因此得名“易语言”。在计算机程序设计中,热键(Hotkey)是指用户可以按下特定组合的键来触发特定功能,这在很多应用程序中都有广泛的应用,...

    易语言热键隐藏窗口

    总的来说,"易语言热键隐藏窗口"是一个基础的易语言编程实践,它教会我们如何使用易语言进行热键管理和窗口控制,这对于初学者理解和掌握易语言的基本编程技巧是非常有帮助的。通过学习和实践这个项目,你可以更好地...

    wincc全局脚本编辑器

    通过图文结合的方式可以更好地帮助初学者或正在使用WinCC函数的开发人员理解全局脚本的使用方法。这种方式可能包括: 1. 使用图形表示逻辑流程,例如流程图和状态机。 2. 展示实际的代码示例,并用图形标注关键代码...

    易语言注册热键模块源码

    易语言是一种专为初学者设计的编程语言,它采用了直观的中文语法,使得编程更加简单易懂。在“易语言注册热键模块源码”中,我们主要关注的是如何在程序中实现对热键的注册与管理。热键,又称快捷键,是计算机应用...

    易语言源码易语言汇编设置全局变量源码.rar

    易语言是一种专为初学者设计的编程语言,它采用了贴近自然语言的语法,使得编程变得更加简单易懂。本文将深入探讨易语言中的源码、汇编以及如何设置全局变量。 一、易语言源码 易语言源码是易语言程序的基础,由一...

Global site tag (gtag.js) - Google Analytics