关于MessageBox的问题

robinwjb 2010-01-30 10:17:25
问题一:如何让弹出MessageBox的窗口不要失去焦点(也就是说保持激活状态)?
普通的Messagebox弹出后,原窗口就会失去激活状态,弹出的MessageBox会被激活。
注:必须使用MessageBox,而不是自定义对话框。

问题二:谁知道如何隐藏弹出的MessageBo窗口的方法?
不能有闪烁,让使用者什么都感觉不到。
...全文
344 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sue3140 2010-07-02
  • 打赏
  • 举报
回复
留个名先!~ 这帖子帮了我啊!~
robinwjb 2010-02-01
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100201/11/70079053-e3a2-4081-b393-d0fd029d4174.html?95443
robinwjb 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cnzdgs 的回复:]
可以在MessageBox获得焦点后再把焦点设到主窗口上,主窗口响应WM_NCACTIVATE消息直接返回0,这样看不到主窗口的变化。如果不是自己的程序,可以通过重设窗口函数的方式来响应消息。

如果上述做法仍不能满足要求,可以Hook ShowWindow函数,在显示MessageBox时,将参数改成SW_SHOWNOACTIVATE。
[/Quote]

谢谢,这个方法可以搞定,给分了!
另外下面的问题也麻烦大家看看啊
robinwjb 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 cnzdgs 的回复:]
引用 9 楼 robinwjb 的回复:
HCBT_CREATEWINDOW时,除了能销毁窗口,最多只能改变窗口的大小和位置吧。
这个时候想既无法隐藏窗口,也无法设置窗口的样式(比如WS_EX_NOACTIVATE)。

改Z-Order试试。
[/Quote]

修改Z-Order可以让窗口显示到主窗口的背后,但是主窗口还是失去了焦点。
cnzdgs 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 robinwjb 的回复:]
HCBT_CREATEWINDOW时,除了能销毁窗口,最多只能改变窗口的大小和位置吧。
这个时候想既无法隐藏窗口,也无法设置窗口的样式(比如WS_EX_NOACTIVATE)。
[/Quote]
改Z-Order试试。
wltg2001 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 robinwjb 的回复:]
::MessageBox(NULL,"OK","Caption",MB_OK);

这样弹出的就是无模式的啊。
[/Quote]
这个还是模式对话框吧,不过父窗口改为桌面了
robinwjb 2010-01-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cnzdgs 的回复:]
给该线程安装WH_CBT类型的钩子,在nCode==HCBT_CREATEWINDOW时,如果Hook函数返回非0值,系统会自动销毁窗口,如果不想销毁窗口,也可以做其它处理,参考MSDN中CBTProc的说明。
[/Quote]

HCBT_CREATEWINDOW时,除了能销毁窗口,最多只能改变窗口的大小和位置吧。
这个时候想既无法隐藏窗口,也无法设置窗口的样式(比如WS_EX_NOACTIVATE)。
cnzdgs 2010-01-31
  • 打赏
  • 举报
回复
给该线程安装WH_CBT类型的钩子,在nCode==HCBT_CREATEWINDOW时,如果Hook函数返回非0值,系统会自动销毁窗口,如果不想销毁窗口,也可以做其它处理,参考MSDN中CBTProc的说明。
robinwjb 2010-01-31
  • 打赏
  • 举报
回复
::MessageBox(NULL,"OK","Caption",MB_OK);

这样弹出的就是无模式的啊。
cnzdgs 2010-01-31
  • 打赏
  • 举报
回复
可以在MessageBox获得焦点后再把焦点设到主窗口上,主窗口响应WM_NCACTIVATE消息直接返回0,这样看不到主窗口的变化。如果不是自己的程序,可以通过重设窗口函数的方式来响应消息。

如果上述做法仍不能满足要求,可以Hook ShowWindow函数,在显示MessageBox时,将参数改成SW_SHOWNOACTIVATE。
zhouzhipen 2010-01-31
  • 打赏
  • 举报
回复
不要使用主窗口作为MessageBox的父窗口.
wltg2001 2010-01-30
  • 打赏
  • 举报
回复
另外,我弹出的Messagebox是无模式的。
=========
MessageBox好像都是模式对话框吧,好像没有参数将它设置成无模式的吧
robinwjb 2010-01-30
  • 打赏
  • 举报
回复
谢谢大家的回复,我再说明一下吧,我通过挂一个WH_CALLWNDPROC类型的hook,然后替换MessageBox的窗口过程,已经可以隐藏MessageBox了,但这样做,原窗口还是会失去激活的状态。另外,我弹出的Messagebox是无模式的。
雪碧爱可乐 2010-01-30
  • 打赏
  • 举报
回复
启动一个线程来调用MessageBox,这样但不知道线程里面调用窗体不知道会出现什么状况,没尝试过!
lllyyy2403 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 robinwjb 的回复:]
问题一:如何让弹出MessageBox的窗口不要失去焦点(也就是说保持激活状态)?
普通的Messagebox弹出后,原窗口就会失去激活状态,弹出的MessageBox会被激活。
注:必须使用MessageBox,而不是自定义对话框。

问题二:谁知道如何隐藏弹出的MessageBo窗口的方法?
不能有闪烁,让使用者什么都感觉不到。
[/Quote]
一、由于通常的MessageBox是原程序的模式对话框,是必须要返回的,否则程序只能等待,因此恐怕不能直接走这条路。但可考虑迂回:在其弹出时立即将其隐藏,然后向其发送IDOK按钮指令,从而返回焦点给原程序。二、用钩子勾到该窗口,然后发送隐藏命令ShowWindow(handle,SH_HIADE),然后做第一点。但是可能该对话框可能还是会先闪一下,这仅仅是猜测哈,可能也不会闪直接被隐藏了吧。
jameshooo 2010-01-30
  • 打赏
  • 举报
回复
1、要区分情况。如果模式对话框以原窗口为父窗口,原窗口是不可能激活的。如果模式对话框以桌面作为父窗口,在弹出对话框之前先给自己POST一个自定义消息,然后再弹出对话框,因为原本的消息循环被对话框接管,原窗口只能依靠消息获得继续执行代码的机会,在消息响应里激活自己。

2、除了HOOK这个API,我还不知道更好的办法。
向立天 2010-01-30
  • 打赏
  • 举报
回复
你的这个需求不太容易实现吧
弹出MessageBox原窗口会被禁用
这是由于DoModal的机制造成的
不大可能把模态对话框改为非模态的吧
你到底想做什么
为什么跟MessageBox过不去
有什么特殊应用吧

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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