--------以下文字来自CSDN BLOG.
/*
* 我就是在这里出了问题. 这篇文章没注意的是,对于模态对话框和非模态对话框对话框 我们有不一样的处理情况.如果是非模态对话框,大家可以继续看下去,按照文章说的做,不过如果你
*的窗口是DoModal()出来的,那就不需要改变后退键的行为,只需要响应 IDCANCEL,然后 SHSendBackToFocusWindow(WM_HOTKEY, 2, MAKELPARAM(MOD_KEYUP, VK_TBACK));
*这样就可以了. 在DOPOD 575上测试通过的!
/*
对于第三种情况,系统并不会自动处理,需要我们自己做一点工作。
首先,我们需要向MenuBar发送一个SHCMBM_OVERRIDEKEY消息,来通知Menubar我们要改变后退键的行为。
SHCMBM_OVERRIDEKEY消息的wParam参数是要改变行为的键值,如下表所示:
Key | Meaning |
---|---|
VK_TBACK | Back button |
VK_TSOFT1 | Left SoftKeyBar button |
VK_TSOFT2 | Right SoftKeyBar button |
VK_TVOLUMEUP | Up volume button |
VK_TVOLUMEDOWN | Down volume button |
VK_TRECORD | Record button |
SHCMBM_OVERRIDEKEY消息的lParam参数是我们要改变的行为,其中lParam的低字节是掩码,高字节是值。
例如,我们要把后退键的缺省行为去掉,并希望当按下后退键时,会向当前窗口发送WM_HOTKEY的消息,那么,我们可以这么做:
SendMessage (SHFindMenuBar (hWnd), SHCMBM_OVERRIDEKEY, VK_TBACK, MAKELPARAM (SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY));
SHMBOF_NODEFAULT是去掉后退键的缺省行为,SHMBOF_NOTIFY是要向窗口发送键按下的消息。
MAKELPARAM宏的第一个参数是低字,第二个参数是高字。
如果我们只是要去掉后退键的缺省行为,而不需要后退键向窗口发送WM_HOTKEY的消息,可以这么做:
SendMessage (SHFindMenuBar (hWnd), SHCMBM_OVERRIDEKEY, VK_TBACK,
MAKELPARAM (SHMBOF_NODEFAULT | SHMBOF_NOTIFY,
SHMBOF_NODEFAULT));
如果要恢复后退键的缺省行为,可以这么做:
SendMessage (SHFindMenuBar (hWnd), SHCMBM_OVERRIDEKEY, VK_TBACK,
MAKELPARAM (SHMBOF_NODEFAULT | SHMBOF_NOTIFY,
0));
窗口收到的WM_HOTKEY消息中,wParam表示按下的键,如下表所示:
Key | Value |
---|---|
VK_TSOFT1 | 0 |
VK_TSOFT2 | 1 |
VK_TBACK | 2 |
VK_TVOLUMEUP | 3 |
VK_TVOLUMEDOWN | 4 |
VK_TRECORD | 5 |
lParam也含有按下键的值,但是有所区别。lParam中,高字表示按下的键值,低字则表示按下值的其他标志,对于Smartphone有用的是标志是MOD_KEYUP,表示键已经被释放了。
当我们收到WM_HOTKEY消息时,需要处理删除字符的操作,此时,不需要我们自己写代码完成,只需要调用系统提供的一个函数即可:
void SHSendBackToFocusWindow (UINT uMsg, WPARAM wp, LPARAM lp);
所以,我们处理WM_HOTKEY消息的代码可以这么写:
case WM_HOTKEY: if (HIWORD (lParam) == VK_TBACK) SHSendBackToFocusWindow (wMsg, wParam, lParam); 这样,就会删除最后的字符了。
最后一点,如果MenuBar被销毁,则改变后退键的行为会自动终止,不需要再写恢复代码。
文章的原始URL可以看:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win_ce/html/pwc_TheBackButtonandOtherInterestingButtons.asp
让后退键执行缺省的行为也可以执行这个函数:
void SHNavigateBack(void);
如果安装了WM5 for smartphone的SDK,有个例子可以参考:
C:\Program Files\Windows CE Tools\wce500\Windows Mobile 5.0 Smartphone SDK\Samples\CPP\Win32\Back\back.sln
最近把程序放到dopod585上跑,发现上面写的都不管用了,系统根本就截获不了后退键的消息.没办法,只好截取全局的消息,然后再判断是否后退键,再处理.