程序要求运行时需要狗,如果运行时狗被拔掉,则程序退出。本来这也没什么,我的处理方法是:程序接收WM_DEVICECHANGE系统消息,然后判断狗是否存在,不存在则退出。
代码:
- irtn := fIsUkeyExist;
- if irtn <> 1 then Application.Terminate;
但是今天,测试人员发现,如果拔出狗时,鼠标正在浏览菜单(停留在程序菜单上面),则程序不会退出。我试了试确实如此。
后来我改成如下方式,就行了:
- irtn := fIsUkeyExist; //判断ukey是否存在
- if irtn <> 1 then
- begin
- frmMain.Close;
- Halt;
- end
总结下:可能是因为Application.Terminate实质是给程序主窗口发送了一个WM_CLOSE的消息,而此时的焦点在菜单上面,不在主窗口上面,而主窗口收不到这个消息,所以不退出。而halt则是强制退出。
这种情况还真是第一次碰到,写下来,留做纪念。