`
clzqwdy
  • 浏览: 3124 次
  • 性别: 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)推出的一...

    全局热键demo.rar

    总的来说,这个“全局热键demo”是一个很好的学习资源,对于想要了解MFC和全局热键编程的初学者而言,它提供了实际操作的机会。通过分析和运行这个示例,不仅可以掌握全局热键的实现方法,还可以加深对MFC框架的理解...

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

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

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

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

    Java语言导学(原书第3版)

    本书既适合初学者,也适合有经验的程序员:新程序员通过从头到尾阅读本书可以得到最大的收获,包括按照第1章“起步”中的步骤说明编译和运行自己的第一个程序。 有过程式语言(比如C)经验的程序员可能希望从Java...

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

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

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

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

    Python编程初学者指南.pdf

    Python编程初学者指南.pdf

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

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

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

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

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

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

    易语言监视热键例程源码.7z

    易语言是一种基于中文编程的计算机程序设计语言,它旨在降低编程难度,使更多的人能够参与到编程活动中...对于初学者来说,这是一个很好的学习项目,通过阅读和分析源码,可以加深对易语言编程的理解,并提升编程技能。

    wincc全局脚本编辑器

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

    易语言注册热键模块源码

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

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

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

    java小项目 适合初学者

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而闻名。对于初学者来说,Java提供了一个良好的学习平台,因为它的语法清晰,易于理解。"java小项目 适合初学者"这样的资源集合是入门Java...

    全局钩子终结进程

    因此,使用全局钩子需要谨慎,避免滥用。 6. **反作弊应用**:在游戏开发中,全局钩子常被用于反作弊措施,检测和阻止第三方作弊软件的活动。 通过深入理解并熟练掌握全局钩子技术,开发者可以构建功能强大的系统...

Global site tag (gtag.js) - Google Analytics