炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2971|回复: 3

【原创】炫彩库1.52、1.53dll增加加速键的方法

[复制链接]

该用户从未签到

发表于 2013-4-19 22:35:31 | 显示全部楼层 |阅读模式
本帖最后由 xkjy3000 于 2013-4-21 01:03 编辑

目前版本的炫彩界面库中没有加速键的功能,在软件开发过程中感觉非常不爽,索性加一个,没有太大的技术含量,遂将此代码提供给需要的朋友,互相学习。如果有哪位大侠有更好的方法,请指教,谢谢!!!言归正传,下面上源码。
炫彩1.52、1.53dll版HOOK加入加速键功能(仅说明方法及实现代码,相关接口请自行添加)
一、_tWinMain函数中的实现
  1. HHOOK g_hook;
复制代码

声明钩子回调函数:
  1. LRESULT CALLBACK GetMsgHookProc(int nCode, WPARAM wParam, LPARAM lParam);
复制代码

声明窗口消息处理过程回调函数:
  1. BOOL CALLBACK WindowProc(HWINDOW hWindow, UINT message, WPARAM wParam, LPARAM lParam);
复制代码

在_tWinMain函数中,调用界面库初始化XInitXCGUI();后安装钩子:
  1. g_hook = ::SetWindowsHookEx(WH_GETMESSAGE,GetMsgHookProc,NULL,::GetCurrentThreadId());
复制代码

这里写自己创建的炫彩窗口,我的做法是写了一个窗口管理和控制的类来管理所有窗口的创建、删除等等。后面会有相关说明。

  1. return 0;
复制代码

前面一定要删除安装的钩子句柄:
  1. ::UnhookWindowsHookEx(g_hook);
复制代码

二、钩子回调函数的实现
  1. LRESULT CALLBACK GetMsgHookProc(int nCode, WPARAM wParam, LPARAM lParam)
  2. {
  3. if( nCode >= 0 ) // 微软说的nCode<0不要处理,我们就照办吧
  4. {
  5. HWND hwnd = ::GetForegroundWindow(); // 取得前台激活窗口的句柄
  6. if ( NULL != hwnd )
  7. {
  8. MSG* pMsg = (MSG*)lParam;
  9. /* gWindowManager 是自定义窗口管理类(class WindowManager)的全局变量,WindowController是自定义窗口控制的抽象类(class WindowController),每个炫彩窗口均由派生自WindowController的类创建并由WindowManager统一管理,GetWindowClass取得派生类的指针,GetHAccel获取每个窗口创建的加速键表句柄(废话了一下,便于看懂下面的代码)*/
  10. std::vector<WindowController*> vecTempWindowController = gWindowManager.GetAllHWindow(); /* 取得当前创建的所有HWindow*/
  11. std::vector<WindowController*>::const_iterator iter = vecTempWindowController.begin();
  12. for ( ; iter != vecTempWindowController.end(); ++iter )
  13. {
  14. if ( XWnd_GetHWnd((*iter)->GetWindowClass()->GetHWindow()) == hwnd ) // 非前台窗口就不要处理了
  15. {
  16. ::TranslateAccelerator(hwnd,(*iter)->GetWindowClass()->GetHAccel(),pMsg); // 翻译加速键表
  17. }
  18. }
  19. }
  20. }
  21. return ::CallNextHookEx(g_hook, nCode, wParam, lParam);
  22. }
复制代码

三、声明一个全局函数RegWindowMsgProc,用于注册窗口消息处理过程
  1. void RegWindowMsgProc( WindowController const *pWindowController )
  2. {
  3. XWnd_RegisterMsgProc( pWindowController->GetWindowClass()->GetHWindow(),&WindowProc );
  4. }
复制代码

四、窗口消息处理过程回调函数实现
  1. BOOL CALLBACK WindowProc(HWINDOW hWindow, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3. WindowController *pWindowController = gWindowManager.GetWindowController( hWindow );
  4. if ( pWindowController )
  5. {
  6. return pWindowController->GetWindowClass()->WndProc( hWindow,message,wParam,lParam ); // 转给相关窗口类处理
  7. }
  8. return FALSE;
  9. }
复制代码

五、窗口类中的实现
定义你需要的加速键ID
  1. #define ID_CUSTOM 100
复制代码
声明ACCEL数组并赋值:
  1. ACCEL array_Accel[] =
  2. {
  3. // FSHIFT 表示shift,FALT 表示Alt,FCONTROL 表示Ctrl;这里我们注册一个Ctrl + F12
  4. { FCONTROL | FVIRTKEY, VK_F12, ID_CUSTOM },
  5. };
复制代码

接下来创建一个加速键表:
  1. m_Accel = ::CreateAcceleratorTable(array_Accel, sizeof(array_Accel) / sizeof(ACCEL));
复制代码

记得在窗口类析构的时候:
  1. ::DestroyAcceleratorTable(m_Accel);
复制代码

WndProc函数的定义及实现
  1. BOOL WndProc(HWINDOW hWindow, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3. if ( WM_COMMAND == message ) // 截获WM_COMMAND消息
  4. {
  5. int id = LOWORD(wParam);
  6. switch (id)
  7. {
  8. case ID_CUSTOM:
  9. {
  10. // 这里进行你定义的加速键的处理
  11. break;
  12. }
  13. default:
  14. {
  15. break;
  16. }
  17. }
  18. }
  19. return FALSE;
  20. }
复制代码

注:本来想使用C++方式XCGUI_RegWndMsgProc来注册窗口消息处理过程,未成功,貌似调用约定上的问题,不解。所以改成C方式XWnd_RegisterMsgProc来转给相关窗口类处理。有用XCGUI_RegWndMsgProc实现的朋友请指导一下,谢谢。

不知道有没有说清楚,大家凑活着看吧。个人觉得这不是什么高深的技术,鄙视一下用这类技术卖钱的人,同时本人不算高手,希望群里的高手多多的发表技术性帖子,多多开源,群策群力,为炫彩的美好明天添砖加瓦!!!

该用户从未签到

发表于 2013-5-23 21:09:07 | 显示全部楼层
好资源,谢谢分享

该用户从未签到

发表于 2013-5-25 14:28:46 | 显示全部楼层
太好了 支持一下
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

QQ|Archiver|手机版|小黑屋|炫彩界面库 ( 鄂ICP备2023014763号-1 )

GMT+8, 2024-9-20 05:53 , Processed in 0.070209 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表