需求:在自己二次开发的对话框环境下,使用特定快捷键,屏蔽自带快捷键,为用户带来方便
步骤如下:
一:在DllExport的class下面,定义成员
//hpp
#include <windows.h>
class DllExport BlockStyler123
{
public:
HHOOK hookKeyboard; //键盘钩子
static BlockStyler123* instanceForHook; //用来操作静态钩子函数
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK KeyboardProc_proxy(int nCode, WPARAM wParam, LPARAM lParam);
void unloadHookKeyboard(); //卸载钩子
};
二:声明全局变量:
//cpp
BlockStyler123* BlockStyler123::instanceForHook = nullptr;
LRESULT CALLBACK BlockStyler123::KeyboardProc_proxy(int nCode, WPARAM wParam, LPARAM lParam)
{
return instanceForHook->KeyboardProc(nCode, wParam, lParam);
}
.三:在构造函数中,初始化成员变量
//cpp
BlockStyler123::BlockStyler123()
{
instanceForHook = this; // 设置当前实例
hookKeyboard = NULL;
}
四:钩子卸载
//cpp
void BlockStyler123::unloadHookKeyboard()
{
if(hookKeyboard != NULL)
{
UnhookWindowsHookEx(hookKeyboard);
hookKeyboard = NULL;
}
return;
}
五:钩子启动
//cpp
int BlockStyler123::update_cb(NXOpen::BlockStyler::UIBlock* block)
{
if(block == toggle0) //根据需要,定义启动钩子的时机
{
unloadHookKeyboard();
DWORD id = GetCurrentThreadId();
hookKeyboard = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc_proxy, NULL, id);
}
return 0;
}
六:钩子回调函数
//cpp
LRESULT CALLBACK BlockStyler123::KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if (nCode >=0 && nCode == HC_ACTION && GetAsyncKeyState(wParam) ) //&& nCode == HC_ACTION
{
// 获取当前光标位置
POINT cursorPos;
GetCursorPos(&cursorPos);
// 将屏幕坐标转换为相对于当前活动窗口的客户区坐标
HWND hwndUnderCursor = WindowFromPoint(cursorPos);
hwndUnderCursor = GetParent(hwndUnderCursor);
// 如果光标在非客户区(如标题栏、边框等),使用ScreenToClient进行转换
if (hwndUnderCursor == NULL)
{
hwndUnderCursor = GetForegroundWindow(); // 获取当前活动窗口
if (hwndUnderCursor != NULL)
{
ScreenToClient(hwndUnderCursor, &cursorPos);
hwndUnderCursor = ChildWindowFromPoint(hwndUnderCursor, cursorPos);
}
}
TCHAR className[100] = TEXT("");
GetClassName(hwndUnderCursor, className, 100);
if(string(className).size()==73 && className[0]=='A') //如果是视图窗口
{
if (wParam == 'a' || wParam == 'A' )
{
//do sth ...
return 1;
}
else if(wParam == VK_F8)
{
//do sth ...
return 1;
}
}
}
return CallNextHookEx(hookKeyboard,nCode,wParam,lParam);
}
七:钩子用完后,及时清理
//cpp
BlockStyler123::~BlockStyler123()
{
unloadHookKeyboard(); //卸载钩子
}