先来看看smarphone sdk2003中对 Back Key(后退键)的描述:
后退键在smartphone上是起到三种作用:
1.对于窗口,除了对话框(From)和MessageBox提示框, 按下后退键,系统将返回
到前一个界面(窗口),当前窗口并不关闭,由前一个窗口在最上方显示(按 z 顺序导航 )
2.对于有edit空间的对话框,后退键在edit中起到BACKSPACE一样的作用,删除字符.
当我门作back key的重载处理的时候,我们需要执行SHSendBackToFocusWindow,
对有焦点的控件进行处理操作.
3.对于没有edit控件的对话框,或者对于MessageBox提示框,按下后退键,将会向窗口发送WM_COMMAND/IDCANCEL 消息,对话框收到后,系统调
用默认的退出响应。
还有个功能:取消快捷菜单(当菜单弹出来的时候)

一切看上去很好,系统什么都帮我们作好了,我们不需要对Back key作自己的处理。Ms用户界面准则也是这么建议的,但是,但是,很不幸的是,系统默认处理却不见得完全正确。
当你只有一个窗口的时候,确实很愉快,该怎么样就是怎么样的,但是当整个程序有多个窗口的时候,随着窗口的增加,你会发现越来越多的问题并且越来越棘手。
关于Back key带来的问题在sumtec的《令人感到非常讨厌的Back键 》有着很好的阐述
http://sumtec.cnblogs.com/archive/2004/10/08/49978.html
默认响应中,back键是不会替你“关闭”窗口的。反复创建from实例和利用Back后退, 内存当中的窗口数量就会越来越多,也算是一种内存泄露 ,容易导致系统缓慢和崩溃!
所以,在多窗口编程中,强烈建议自己处理没有edit对话框中的Back key响应.
在EVC中我们在消息响应中可以有如下方法截获BACK键
对于有Edit control的对话框
case WM_HOTKEY:
{
if(VK_TBACK == HIWORD(lParam))
SHSendBackToFocusWindow(message, wParam, lParam);
}
对于没有edit control的对话框
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDCANCEL:
{
EndDialog(hwnd, TRUE);
return TRUE;
}
}
break;
}
以上详细情况可以看看sp2003sdk 里面的samples\win32\Closewindow 例子和Back例子
而在.NET CF中如何捕获呢?
msdn上的有篇文章作了说明:
http://msdn2.microsoft.com/zh-cn/library/ms172543(VS.80).aspx
当后退键在某个窗体或自定义控件上被按下时,它会引发 KeyPress 事件,
而此时的 KeyChar 值会与 Esc 键的值相等 (27)。
在事件处理代码中,确定是否引发了 Esc 键值。如果引发了该值,请通过将 Handled属性设置为 true 来取消默认的后退键操作。如果未处理事件参数,则后退键会按 z 顺序导航到下一个窗口。
代码:
this.KeyPress += new KeyPressEventHandler(OnKeyPress);
private void OnKeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (Char)Keys.Escape)
{
e.Handled = true;
//在这里作自己希望的动作
//比如关闭定时器,释放资源等
//如果这里是new出来的form,可以在这里Close掉,就返回上个窗口了
}
}
此外,在sumtec的blog中为我们提供了另外一个思路,
用PeekMessage/GetMessage/TranslateMessage/DispatchMessage等系统函数来维护一个消息循环,然后利用这个消息循环来捕捉Back key的响应。详细内容请见:
http://blog.joycode.com/sumtec/archive/2004/10/09/35081.aspx
关于Back Key就写到这里了,有什么问题欢迎讨论:)