微信电脑版的Alt+A截图,相比大家一定都用过。只要 微信在电脑上没有关闭,即使微信窗口被缩放到最小或者最小化到托盘状态,都能通过这个快捷键使用截图功能,那这样的功能是如何实现的呢。这个快捷键实际上输入Windows系统中的热键注册。我们可以使用RegisterHotKey注册一个系统级别的热键。当用户按下热键的时候,Windows会将WM_HOTKEY消息发送给线程所在的窗口过程函数。 只要当前窗口未被关闭或者当前线程未退出。始终可以接收快捷键。控制台程序也可以注册热键。

在win32程序中我们可以在WM_CREATE消息中注册热键,然后在WM_HOTKEY消息中处理具体的业务逻辑。

case WM_CREATE:
{
	RegisterHotKey(hwnd, 1018, MOD_ALT, VK_F1);
	return 0;
}
case WM_HOTKEY: 
{
	//处理系统热键的逻辑
	return 0;

}

以上代码我注册了一个ALT+F1快捷键,启动窗体之后,只要该窗体未被关闭,通过ALT+F1就可以收到 WM_HOTKEY消息,我们可以在WM_HOTKEY中实现我们自己的业务逻辑。

当然微软官方 也给我们提供了一个标准的用法,官方地址为:https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-registerhotkey

#include "stdafx.h"

int _cdecl _tmain (
    int argc, 
    TCHAR *argv[])
{           
    if (RegisterHotKey(
        NULL,
        1,
        MOD_ALT | MOD_NOREPEAT,
        0x42))  //0x42 is 'b'
    {
        _tprintf(_T("Hotkey 'ALT+b' registered, using MOD_NOREPEAT flag\n"));
    }
 
    MSG msg = {0};
    while (GetMessage(&msg, NULL, 0, 0) != 0)
    {
        if (msg.message == WM_HOTKEY)
        {
            _tprintf(_T("WM_HOTKEY received\n"));            
        }
    } 
 
    return 0;
}