首页
社区
课程
招聘
win32注册热键
发表于: 2011-10-5 20:29 6331

win32注册热键

2011-10-5 20:29
6331
	case WM_CREATE:
		RegisterHotKey(hWnd,g_hotKeyIdbegin,0,VK_RIGHT);
		RegisterHotKey(hWnd,g_hotKeyIdend,0,VK_UP);
                  ......
                break

case WM_HOTKEY:
		if(wParam==g_hotKeyIdbegin)
		{
                         _beginthread......
		}
		break;

我用→和↑作为快捷键,就是想按下方向键右执行指定的操作,这样是可以的,
但是方向键本身的移动功能就没有了,
怎么做才能不影响按键本身的功能呢
我看网上MFC的代码是return CDialog::PreTranslateMessage(pMsg);
win32里面应该怎么写呢?
我试了return DefWindowProc(hWnd, message, wParam, lParam);不行

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我帮你看看吧
2011-10-5 21:03
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
没用过这个函数,只是说下想法。Win32编程中有一句需要牢记的话,消息在流动
对于一个windows 应用来说,一般的键盘消息通过WM_KEYDOWN, WM_KEYUP去响应,这都是要应用自己去处理的。DefWindowProc本来就什么都不做的。我记得我刚刚学习win32编程时,就是自己做一个记事本(不用edit控件的),应用里就需要处理键盘消息。

如果你注册了热键,相应的按键消息会变成WM_HOTKEY,如果你希望还继续保持原来已经实现的按键功能,或许你应该这样。

case WM_HOTKEY:
        //hotkey function you need
        beginthead( ....... )
        // activate oringal key function
        PostMessage( hwnd, WM_KEYDOWN, .... ); PostMessage( hwnd, WM_KEYUP, ... );

case WM_KEYDOWN:
case WM_KEYUP:
       // your original code.

就是说,键盘消息应该是你的应用自己实现的,或者说是现有的控件中实现的(那样需要把消息发给相应的控件)。
2011-10-5 21:26
0
雪    币: 201
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
RegisterHotKey是註冊全局快捷鍵. 你要是註冊了, 系統內所有程序的方向鍵都不能用了.
2011-10-6 07:19
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
嗯,学习了。
2011-10-6 10:45
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
应该用postmessage 把这个消息继续传递下去。
如果 只是改键,可以用全局hook实现,这里面也可以很好的控制是否让
这个按键事件传递给其他程序。
2011-10-6 11:06
0
雪    币: 139
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
LS们说的意思是再重新调用一个API啊。
2011-10-6 15:26
0
雪    币: 83
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
DefWindowProc本来就什么都不做的

DefWindowProc会做很多事情的
应该用postmessage 把这个消息继续传递下去。

不论postmessage、sendmessage还是keybd_event都会被热键拦截的,又到case WM_HOTKEY来了,所以是死循环。
我想了半天最后觉得消息不可能继续传递的,
比如我开一个记事本,在里面按一个键,本来发给记事本的消息被热键拦截了,然后发给我的程序,
消息里的目标窗口是我的程序窗口,而不是记事本,所以从我的程序收到消息开始就已经不知道消息原本是要发向记事本的了,所以不能继续传递了。
就用钩子吧
SetWindowsHookEx(WH_KEYBOARD_LL, &KbProc,GetModuleHandle(NULL),0);
LRESULT CALLBACK KbProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	if(wParam == WM_KEYDOWN)
	{
		if(pKey->vkCode ==VK_RIGHT)
                .....
                return CallNextHookEx(g_kb_hook,nCode,wParam,lParam); 
2011-10-6 18:21
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
你有没有试过WH_KEYBOARD,难道这个hook的消息也会被热键拦截?
2011-10-6 20:58
0
游客
登录 | 注册 方可回帖
返回
//