能力值:
( LV2,RANK:10 )
2 楼
我帮你看看吧
能力值:
( 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.
就是说,键盘消息应该是你的应用自己实现的,或者说是现有的控件中实现的(那样需要把消息发给相应的控件)。
能力值:
( LV3,RANK:30 )
4 楼
RegisterHotKey是註冊全局快捷鍵. 你要是註冊了, 系統內所有程序的方向鍵都不能用了.
能力值:
( LV2,RANK:10 )
5 楼
嗯,学习了。
能力值:
( LV2,RANK:10 )
6 楼
应该用postmessage 把这个消息继续传递下去。
如果 只是改键,可以用全局hook实现,这里面也可以很好的控制是否让
这个按键事件传递给其他程序。
能力值:
( LV2,RANK:10 )
7 楼
LS们说的意思是再重新调用一个API啊。
能力值:
( 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);
能力值:
( LV4,RANK:50 )
9 楼
你有没有试过WH_KEYBOARD,难道这个hook的消息也会被热键拦截?