tekynet 阅读(1160) 评论(3)

先来看看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键 》有着很好的阐述
外链网址已屏蔽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例子

CF中如何捕获呢?
msdn上的有篇文章作了说明:
(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的响应。详细内容请见:

关于Back Key就写到这里了,有什么问题欢迎讨论:)


评论列表
zuilang
re: Smartphone上关于Back Key(后退键)的问题
继续支持
ERICSHAN
re: Smartphone上关于Back Key(后退键)的问题
我不会dotnet,但在EVC里用C写我都会加一个全局的ActiveWindow,当你按了back,离开了自己的app,当再回来时WM_ACTIVE, SetForegroundwindow到自己的ActiveWindow,就不会多次创建已存在的window了
teky
re: Smartphone上关于Back Key(后退键)的问题
ERICSHAN你说的是可以解决多次创建的问题,但不能解决所有后退键带来的问题,其实很多用户都习惯了按后退键回到上个界面(后退的意思),相比之下,还是自己处理后退键比较方便点。

PS:最近发现在ppc上挂机健也会导致和后退健一样的问题,而且挂机健比后退健好像还难处理点

发表评论
切换编辑模式