UG/NX二次开发 键盘钩子(快捷键)的使用说明

本文介绍了如何在二次开发的对话框环境中,通过定义和使用DLLExport中的键盘钩子函数,实现特定快捷键的屏蔽并执行相应操作,确保用户便捷性。
摘要由CSDN通过智能技术生成

需求:在自己二次开发的对话框环境下,使用特定快捷键,屏蔽自带快捷键,为用户带来方便

步骤如下:

一:在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();    //卸载钩子
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值