请教 windows 的 WM_NCACTIVATE 和 WM_NCACTIVATE 消息

c154387417 2011-05-09 06:05:43
处理 WM_NCACTIVATE 和 WM_NCACTIVATE 消息遇到问题。

前置条件
--------
frameless窗口


具体:
------

需求
一、某个时候,客户会在任务栏单击,预期窗口将最小化到任务栏。
二、过一段时间,客户又在任务栏点击,预期窗口将恢复正常大小。

我处理的过程
由于是frameless窗口,任务栏单击事件要自己处理(win xp,
frameless窗口单击任务栏并不最小化)。
于是通过 WM_ACTIVATE 和 WM_NCACTIVATE 消息实现。

问题
等我做完了却发现:
用户点击此任务栏图标会最小化(满足需求一)。
但用户点击其它任务栏窗口时,
原来的窗口会先把自己最小化(预期应该是被别的窗口在前面挡
住而不是最小化),然后别的窗口(属于别的程序)才会被激活(
不满足需求二)。


后来查找问题,发现用frameless窗口与普通窗口对比,
WM_ACTIVATE 和 WM_NCACTIVATE 完全一样,但是
frameless窗口却表现如问题所述,所以很疑惑。


不改前置条件的情况下,满足需求。通过 WM_ACTIVATE 和 WM_NCACTIVATE 消息实现的路线不对还是……

...全文
1069 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
c154387417 2011-05-11
  • 打赏
  • 举报
回复
几位,我说的是无标题无边框窗体(frameless)。

这样的情况,任务栏单击动作,是不会响应的。收到的WM_NCACTIVATE 和 WM_NCACTIVATE
无法判断是自己的标题栏被点击还是因为别的程序被点击丢了焦点。

noneclientarea我了解。
xspace_time 2011-05-09
  • 打赏
  • 举报
回复
SYSCOMMAND不一样,还有个什么不一样忘了,不会SYSCOMMAND可以处理窗口最小化命令
crjwlaq 2011-05-09
  • 打赏
  • 举报
回复
点击 工具栏 上 处理的 要么是最大化 要么是最小化


WM_ACTIVATE // 针对是客户区
WM_NCACTIVATE // 针对是非客户区

The WM_NCACTIVATE message is sent to a window when its nonclient area needs to be changed to indicate an active or inactive state.

xiaohuh421 2011-05-09
  • 打赏
  • 举报
回复
处理 WM_NCACTIVATE 和 WM_NCACTIVATE 消息遇到问题。/////这里和标题都写错了.

如果是一相标准的有minsize属性的窗口(对话框,单文档,多文档都是如此),windows会自动帮你处理你想要的那两个动作.

如果你要自己实现,那你就要区分下 WM_NCACTIVATE和WM_ACTIVATE时分别是什么情况下发生的.
如果不是用户点击任务栏图标,那你可以忽略这个动作,如果是点击任务栏图标,则处理这个动作.

「已注销」 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 c154387417 的回复:]
我处理的过程
由于是frameless窗口,任务栏单击事件要自己处理(win xp,
frameless窗口单击任务栏并不最小化)。
于是通过 WM_ACTIVATE 和 WM_NCACTIVATE 消息实现。
[/Quote]
改为获取任务栏窗口句柄,GetTaskmanWindow,对窗口句柄进行对比并判断是否要是小化?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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