钩子函数+消息队列:
新建个项目,设置dll输出
WH_KEYBOARD和WH_KEYBOARD_LL的区别
HOOK 低层键盘消息WH_KEYBOARD_LL
VirtualKeyboard虚拟键值表(详细介绍)
KBDLLHOOKSTRUCT (winuser.h) - Win32 apps | Microsoft Learn
钩子教程 - 原理(二十九) : 结构体 – KBDLLHOOKSTRUCT
接口_kbhk_Init和_kbhk_Close:
extern "C" __declspec(dllexport) BOOL _kbhk_Init(HINSTANCE hInst, CWnd *pWnd);
extern "C" __declspec(dllexport) void _kbhk_Close();
真正有用的函数:SetWindowsHookEx
BOOL _kbhk_Init(HINSTANCE hInst, CWnd *pWnd)
{
g_pWnd = pWnd;
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL,KeyboardHookProc,hInst,NULL);
return g_hHook == NULL ? FALSE : TRUE;
}
UnhookWindowsHookEx清除钩子
void _kbhk_Close()
{
BOOL bResult=FALSE;
if (g_hHook)
{
bResult= UnhookWindowsHookEx(g_hHook);
if(bResult)
g_hHook=NULL;
}
}
使用winbase.h中的键盘键值(主要是命名方式很标准)。https://blog.csdn.net/qq_42372031/article/details/105178789
CALLBACK:KeyboardHookProc函数
组合键:
热键在CPP实现起来只有三个步骤:
RegisterHotKey 热键的使用_Barry__的博客-CSDN博客
1.注册热键 UINT值 RegHotKey一般在界面初始化中,按照键值表键盘键值对应表 - horane.jo - 博客园 (cnblogs.com)
2.类向导添加WM_HOTKEY消息(BEGIN_MESSAGE_MAP会定义ON_WM_HOTKEY();定义afx_msg void OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)函数;),OnHotKey函数进行热键的逻辑处理
3.解除注册热键 UNRegHotKey 不想用的时候调用这个,和settimer、killtimer一样
读ReadHotKeyIni配置获取用户设置的键值:
配置热键界面ReadHotKeyIni读配置(CSetHotKeyDlg)
配置文件放键值。初始化读配置文件,按照键值表界面显示文字(SetHotToEdit)
点击确定存键值(UNIT)到配置文件。(SetEditToHot)
可以使用hook,在配置界面类似于apex自定义键位的方式点击热键编辑框,点击ctrl键会显示ctrl+到编辑框中,附上一些判错,而不是文字输入ctrl+1这种。