如何关闭所有的窗体

xjhwc 2011-08-23 07:29:35
程序是个触摸屏软件,需要增加一个功能:如果界面停留在某个窗体上,使用的人走了,过10分钟鼠标没有如何操作后,启动XP的屏幕保护。下一个使用的人一点屏幕,把所有打开的窗体关闭,程序回到主窗体上。主窗体->form1->form2->form3->form4->form5,窗体都是用new创建,用ShowModal()显示,界面停留在form5上,10分钟后XP屏幕保护启动,同时删除form5,form4,form3,form2,form1,留下主窗体。
//---------------------------------------------------------------------------
void __fastcall Tmain_s_Form::ProcessMessage(TMsg &message,bool &handled)
{
//还原到主窗体上来
if(message.message==WM_SYSCOMMAND && message.wParam==SC_SCREENSAVE)//已经可以判断到XP屏保启动
{
TStringList *form_name=new TStringList;
for(int i=0;i<=Screen->FormCount-1;i++)
{
form_name->Add(Screen->Forms[i]->Name);//装入6个窗体的CAPTION,每个窗体的CAPTION都不会相同
}
HWND hwnd;
for (int j=0;j<=form_name->Count-1;j++)
{
hwnd=FindWindow(NULL,form_name->Strings[j].c_str());//从后往前搜索窗体CAPTION
SendMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,0);//发送消息,让窗体关闭
}

}
}
//---------------------------------------------------------------------------

现在问题:XP屏保启动后,只删除了FORM5,剩下的都没有删除,什么原因造成的?或者后什么其他好的办法实现这个功能。
...全文
70 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xjhwc 2011-08-23
  • 打赏
  • 举报
回复
多谢妖哥,你的方法很正确。
ccrun.com 2011-08-23
  • 打赏
  • 举报
回复
zzbinfo 2011-08-23
  • 打赏
  • 举报
回复
看来我把简单的问题弄的更复杂了
zzbinfo 2011-08-23
  • 打赏
  • 举报
回复
你这么做,如果窗体顺序不对就达不到效果,而且,根据实际情况,你的这个动作最好是不要依赖于屏幕保护。提供个思路,在主窗体接收屏幕保护启动的消息或者是用定时器设置一定的时长。当接收到消息或时间到了以后,主窗体给new出来的窗体发自定义的消息,new出来窗体收到消息后给他的new出来的窗体发自定义消息同时延时关闭自己,如果没有new出来的窗体就触发窗体的close。不知道描述清楚了没有。
ccrun.com 2011-08-23
  • 打赏
  • 举报
回复
造成你说的“XP屏保启动后,只删除了FORM5”的原因是:你以为form_name->Count-1就是主窗体,其实恰恰相反,第一个才是主窗体,form_name->Count-1是最后一个新建的窗体。

用我的方法直接搞定。
ccrun.com 2011-08-23
  • 打赏
  • 举报
回复
不要把简单的事情复杂化。子类化主窗体以后:
if (message.message == WM_SYSCOMMAND && message.wParam == SC_SCREENSAVE)
{
for(int i = 0; i <= Screen->FormCount;i++)
{
if (Screen->Forms[i] != this)
{
Screen->Forms[i]->Close();
}
}
}

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧