|
本帖最后由 xkjy3000 于 2013-4-21 01:03 编辑
目前版本的炫彩界面库中没有加速键的功能,在软件开发过程中感觉非常不爽,索性加一个,没有太大的技术含量,遂将此代码提供给需要的朋友,互相学习。如果有哪位大侠有更好的方法,请指教,谢谢!!!言归正传,下面上源码。
炫彩1.52、1.53dll版HOOK加入加速键功能(仅说明方法及实现代码,相关接口请自行添加)
一、_tWinMain函数中的实现
声明钩子回调函数:
- LRESULT CALLBACK GetMsgHookProc(int nCode, WPARAM wParam, LPARAM lParam);
复制代码
声明窗口消息处理过程回调函数:
- BOOL CALLBACK WindowProc(HWINDOW hWindow, UINT message, WPARAM wParam, LPARAM lParam);
复制代码
在_tWinMain函数中,调用界面库初始化XInitXCGUI();后安装钩子:
- g_hook = ::SetWindowsHookEx(WH_GETMESSAGE,GetMsgHookProc,NULL,::GetCurrentThreadId());
复制代码
这里写自己创建的炫彩窗口,我的做法是写了一个窗口管理和控制的类来管理所有窗口的创建、删除等等。后面会有相关说明。
在
前面一定要删除安装的钩子句柄:
- ::UnhookWindowsHookEx(g_hook);
复制代码
二、钩子回调函数的实现
- LRESULT CALLBACK GetMsgHookProc(int nCode, WPARAM wParam, LPARAM lParam)
- {
- if( nCode >= 0 ) // 微软说的nCode<0不要处理,我们就照办吧
- {
- HWND hwnd = ::GetForegroundWindow(); // 取得前台激活窗口的句柄
- if ( NULL != hwnd )
- {
- MSG* pMsg = (MSG*)lParam;
- /* gWindowManager 是自定义窗口管理类(class WindowManager)的全局变量,WindowController是自定义窗口控制的抽象类(class WindowController),每个炫彩窗口均由派生自WindowController的类创建并由WindowManager统一管理,GetWindowClass取得派生类的指针,GetHAccel获取每个窗口创建的加速键表句柄(废话了一下,便于看懂下面的代码)*/
- std::vector<WindowController*> vecTempWindowController = gWindowManager.GetAllHWindow(); /* 取得当前创建的所有HWindow*/
- std::vector<WindowController*>::const_iterator iter = vecTempWindowController.begin();
- for ( ; iter != vecTempWindowController.end(); ++iter )
- {
- if ( XWnd_GetHWnd((*iter)->GetWindowClass()->GetHWindow()) == hwnd ) // 非前台窗口就不要处理了
- {
- ::TranslateAccelerator(hwnd,(*iter)->GetWindowClass()->GetHAccel(),pMsg); // 翻译加速键表
- }
- }
- }
- }
- return ::CallNextHookEx(g_hook, nCode, wParam, lParam);
- }
复制代码
三、声明一个全局函数RegWindowMsgProc,用于注册窗口消息处理过程
- void RegWindowMsgProc( WindowController const *pWindowController )
- {
- XWnd_RegisterMsgProc( pWindowController->GetWindowClass()->GetHWindow(),&WindowProc );
- }
复制代码
四、窗口消息处理过程回调函数实现
- BOOL CALLBACK WindowProc(HWINDOW hWindow, UINT message, WPARAM wParam, LPARAM lParam)
- {
- WindowController *pWindowController = gWindowManager.GetWindowController( hWindow );
- if ( pWindowController )
- {
- return pWindowController->GetWindowClass()->WndProc( hWindow,message,wParam,lParam ); // 转给相关窗口类处理
- }
- return FALSE;
- }
复制代码
五、窗口类中的实现
定义你需要的加速键ID
声明ACCEL数组并赋值:
- ACCEL array_Accel[] =
- {
- // FSHIFT 表示shift,FALT 表示Alt,FCONTROL 表示Ctrl;这里我们注册一个Ctrl + F12
- { FCONTROL | FVIRTKEY, VK_F12, ID_CUSTOM },
- };
复制代码
接下来创建一个加速键表:
- m_Accel = ::CreateAcceleratorTable(array_Accel, sizeof(array_Accel) / sizeof(ACCEL));
复制代码
记得在窗口类析构的时候:
- ::DestroyAcceleratorTable(m_Accel);
复制代码
WndProc函数的定义及实现
- BOOL WndProc(HWINDOW hWindow, UINT message, WPARAM wParam, LPARAM lParam)
- {
- if ( WM_COMMAND == message ) // 截获WM_COMMAND消息
- {
- int id = LOWORD(wParam);
- switch (id)
- {
- case ID_CUSTOM:
- {
- // 这里进行你定义的加速键的处理
- break;
- }
- default:
- {
- break;
- }
- }
- }
- return FALSE;
- }
复制代码
注:本来想使用C++方式XCGUI_RegWndMsgProc来注册窗口消息处理过程,未成功,貌似调用约定上的问题,不解。所以改成C方式XWnd_RegisterMsgProc来转给相关窗口类处理。有用XCGUI_RegWndMsgProc实现的朋友请指导一下,谢谢。
不知道有没有说清楚,大家凑活着看吧。个人觉得这不是什么高深的技术,鄙视一下用这类技术卖钱的人,同时本人不算高手,希望群里的高手多多的发表技术性帖子,多多开源,群策群力,为炫彩的美好明天添砖加瓦!!!
|
|