热键和快捷键的区别
热键是全局的,使用 api 注册。
快捷键是局部的,不使用 api ,只能在窗口激活的时候使用。
注册全局热键
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
// 注册两个热键 Ctrl+F1 , Ctrl+F2
if (0 == RegisterHotKey(NULL, 1, MOD_CONTROL, VK_F1)) {
cout << "RegisterHotKey error : " << GetLastError() << endl;
}
if (0 == RegisterHotKey(NULL, 2, MOD_CONTROL, VK_F2)) {
cout << "RegisterHotKey error : " << GetLastError() << endl;
}
// 消息循环
MSG msg = {
0 };
while (GetMessage(&msg, NULL, 0, 0)){
switch (msg.message) {
case WM_HOTKEY:
{
if (1 == msg.wParam) {
cout << "1" << endl;
}
else if (2 == msg.wParam) {
cout << "2" << endl;
}
break;
}
default:
break;
}
}
cout << "finished." << endl;
return 0;
}
注册窗口快捷键(局部)
#include <iostream>
#include <Windows.h>
using namespace std;
// keyCode 参考:https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
LRESULT CALLBACK __WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
PAINTSTRUCT ps;
HDC hdc;
switch (msg) {
case WM_KEYDOWN:
cout << "down:" << wParam << endl;
break;
case WM_KEYUP:
cout << "up:" << wParam << endl;
break;
default:
break;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
int main()
{
// 窗口属性初始化
HINSTANCE hIns = GetModuleHandle(0);
WNDCLASSEX wc;
wc.cbSize = sizeof(wc); // 定义结构大小
wc.style = CS_HREDRAW | CS_VREDRAW; // 如果改变了客户区域的宽度或高度,则重新绘制整个窗口
wc.cbClsExtra = 0; // 窗口结构的附加字节数
wc.cbWndExtra = 0; // 窗口实例的附加字节数
wc.hInstance = hIns; // 本模块的实例句柄
wc.hIcon = NULL; // 图标的句柄
wc.hIconSm = NULL; // 和窗口类关联的小图标的句柄
wc.hbrBackground = (HBRUSH)COLOR_WINDOW; // 背景画刷的句柄
wc.hCursor = NULL; // 光标的句柄
wc.lpfnWndProc = __WndProc; // 窗口处理函数的指针
wc.lpszMenuName = NULL; // 指向菜单的指针
wc.lpszClassName = L"LYSM_class"; // 指向类名称的指针
// 为窗口注册一个窗口类
if (!RegisterClassEx(&wc)) {
cout << "RegisterClassEx error : " << GetLastError() << endl;
}
// 创建窗口
HWND hWnd = CreateWindowEx(
WS_EX_TOPMOST, // 窗口扩展样式:顶级窗口
L"LYSM_class", // 窗口类名
L"LYSM_title", // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口样式:重叠窗口
0, // 窗口初始x坐标
0, // 窗口初始y坐标
800, // 窗口宽度
600, // 窗口高度
0, // 父窗口句柄
0, // 菜单句柄
hIns, // 与窗口关联的模块实例的句柄
0 // 用来传递给窗口WM_CREATE消息
);
if (hWnd == 0) {
cout << "CreateWindowEx error : " << GetLastError() << endl;
}
UpdateWindow(hWnd);
ShowWindow(hWnd, SW_SHOW);
// 消息循环(没有会导致窗口卡死)
MSG msg = {
0 };
while (msg.message != WM_QUIT) {
// 从消息队列中删除一条消息
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
DispatchMessage(&msg);
}
}
cout << "finished." << endl;
getchar();
end:
getchar();
return 0;
}