[C++] 注册热键、快捷键

热键和快捷键的区别

热键是全局的,使用 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;
}

猜你喜欢

转载自blog.csdn.net/Simon798/article/details/109078391