窗口激活-无焦点窗口禁止激活

http://www.cnblogs.com/ywb-lv/articles/2213406.html

窗口激活

http://wenku.baidu.com/view/12cd20020740be1e650e9ac9.html

当用户单击一个非激活的顶级窗体,或非激活的顶级窗体的子窗体时,系统就会发送WM_MOUSEACTIVATE消息(还包括其他消息)给顶级窗体或子窗体,该消息在WM_NCHITTEST消息之后,但在button-down消息之前。当把WM_MOUSEACTIVATE消息交给DefWindowProc函数处理时,系统激活该顶级窗口并投递button-down消息。

  通过处理WM_MOUSEACTIVATE,一个窗体可以就像鼠标单击一样控制激活顶级窗口,并确定该窗体是否接收后续的button-down消息。处理WM_MOUSEACTIVATE后,通过返回以下值实现该目的:

值 含义 
MA_ACTIVATE 激活窗体,但不删除鼠标消息。 
MA_NOACTIVATE 不激活窗体,也不删除鼠标消息。 
MA_ACTIVATEANDEAT 激活窗体,删除鼠标消息。 
MA_NOACTIVATEANDEAT 不激活窗体,但删除鼠标消息。

‘相关资料链接

‘http://topic.csdn.net/t/20020314/11/575275.html

我用钩子拦截了WH_CALLWNDPROC,发现在鼠标点击切换窗口的过程中,是原窗口先收到WM_ACTIVATE消息(wParam指示失活),再收到WM_ACTIVATEAPP消息(wParam指示失活),再收到WM_KILLFOCUS消息,然后才是新窗口收到WM_MOUSEACTIVATE消息,如果新窗口对这个消息返回MA_NOACTIVATE或MA_NOACTIVATEANDEAT,则不再有其它消息;如果新窗口对WM_MOUSEACTIVATE消息的处理返回MA_ACTIVATE,则接下来新窗口还收到WM_ACTIVATEAPP消息(wParam指示激活),然后是WM_ACTIVATE消息(wParam指示鼠标激活),然后是WM_SETFOCUS消息。 
由此看来,在新窗口处理WM_MOUSEACTIVATE消息之前,旧窗口已经处理了WM_KILLFOCUS消息将焦点丢弃,所以对WM_MOUSEACTIVATE返回MA_NOACTIVATEANDEAT,新窗口就不会收到WM_SETFOCUS因而就将使没有窗口拥有焦点了。

‘相关资料链接  2

http://hi.baidu.com/brightsea/blog/item/0903f71ff5ca00fde1fe0bbd.html

在windows的窗口系统中,popup窗口的焦点是与它的活动状态密切相关的。只要使 
popup窗口不获得活动状态,popup窗口就不会自动获得焦点。具体方法如下: 
1. 在创建popup窗口时不要有WS_VISIBLE风格,然后调用SetWindowPos函数显示 
创建的窗口,参数uFlag取值SWP_SHOWWINDOW and SWP_NOACTIVATE,这样就可以保证 
窗口在创建是不会得到活动状态,也就不会获得焦点。 
2. 响应WM_MOUSEACTIVATE消息,返回MA_NOACTIVATE表示窗口在鼠标点击时不需要 
获得活动状态,这样就可以保证在鼠标点击时窗口不会自动获得焦点。 
至于鼠标输入的响应,本就与窗口是否获得焦点无关,不会受到影响。

‘相关资料链接 3

   一个窗口我在WM_MOUSEACTIVATE消息中这么处理
int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
return MA_NOACTIVATE;
}
这样是正常的,点击到它的client区域没问题,它不会获得焦点。

如果它包含一个按钮,那么点击按钮,这个窗口还是获得焦点了。
用spy++看,它走了WM_MOUSEACTIVATE消息并返回MA_NOACTIVATE以后紧接着就WM_ACTIVE了。
用spy++跟踪那个按钮,也走了WM_MOUSEACTIVATE并且返回MA_NOACTIVATE。

1.按钮如何响应WM_MOUSEACTIVATE的?
2.点了按钮以后这个窗口为什么还会获得焦点?
3.它获得焦点的整个过程(消息的收发)是怎样的? 
 
 MA_NOACTIVATEANDEAT以后,是不会获得焦点了,但是按钮也不响应点击了。
如果我希望按钮既可以响应点击事件而且窗口也不会获得焦点要如何做? 
 
‘个人总结

在原来窗口使用WM_NCACTIVATE消息当 wParam = 0 时  ,返回wParam = 1 ,那么原窗口就不会失去焦点,然后新窗口使用子类来处理消息也是可以的

时间: 2024-10-08 01:28:20

窗口激活-无焦点窗口禁止激活的相关文章

mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别

mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别 1.理解窗口之间的关系   2.   如何设置(创建)不同的窗口 一. parent:创建者,owner:所有者 小玉的父母生下小玉,养到8岁,卖给贾府当丫头小玉的父母是parent,贾府是owner 二. 1.Pop-up窗口: 一个弹出窗口是必须具有WS_POPUP属性的窗口,弹出窗口只能是一个Top-Level窗口,不能是子窗口,弹出窗口多用于对话框和消              息框,也可以用于应用程序的

窗口,父窗口parentwindow,所有者窗口ownerwindow

参考文档:http://www.cnblogs.com/fwycmengsoft/p/4026592.html 一. parent:创建者,owner:所有者 小玉的父母生下小玉,养到8岁,卖给贾府当丫头小玉的父母是parent,贾府是owner 二. 1.Pop-up窗口: 一个弹出窗口是必须具有WS_POPUP属性的窗口,弹出窗口只能是一个Top-Level窗口,不能是子窗口,弹出窗口多用于对话框和消              息框,也可以用于应用程序的主窗口, 弹出窗口可以不必具有标题栏

VC/MFC如何将本窗口显示并激活成为当前窗口 ?托盘程序

本以为很简单的,没想到各种函数都试了,结果还是不行,只能在任务栏中显示,还要点击以下任务栏那里才可以看得到窗口... //    CRect c; //    this->GetWindowRect(&c); this->ShowWindow(SW_SHOWNA);//简单的显示主窗口完事儿 this->SetActiveWindow(); this->SetForegroundWindow(); //this->SetWindowPos(this,LOWORD(lP

关于无标题栏窗口拖动的问题

要使无标题栏窗口实现拖动效果,除了处理OnNCHitTest()函数外:就是在OnLButtonDown()函数中发送虚假消息了. 但是,这儿得注意一下,在OnLButtonDown()函数中如果使用SetCapture()函数后再::SendMessage(m_hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);是不会成功的!必须去掉或在之后使用. void XWindow::OnLButtonDown(UINT nFlags, CPoint point) { XCon

141107●Winform拖动无边框窗口、播放音频、启动外部exe程序

鼠标拖动无边框窗口 1. //鼠标拖动 Point downpoint = new Point(); //事件,鼠标按下,获取当前坐标 private void panel1_MouseDown(object sender, MouseEventArgs e) { downpoint.X = -e.X; downpoint.Y = -e.Y; } //事件,鼠标移动,赋值新坐标 private void panel1_MouseMove(object sender, MouseEventArgs

QML之窗口(无边框、透明及拖拽)

1.无边框 Qt Quick 2.0 中 QQuickView代替了1.0中的QDeclarativeView. 无边框窗口代码如下: QQuickView viwer; //QQuickView继承自QWindow而不是QWidget viwer.setFlags(Qt::FramelessWindowHint); 2.窗口透明 setOpacity可设置整个窗口(包括控件)的透明度,而背景透明则应使用setColor //设置窗口颜色,以下为透明,在viwer.setSource()之前使用

SetWinEventHook 事件钩子(有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等)good

相信消息钩子大家听的比较多,消息钩子能够在应用程序处理系统消息之前将其截获,提前处理并可以决定是否继续将消息往下传送,有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等等,要截获这些事件可以使用SetWinEventHook,它的原型如下: HWINEVENTHOOK WINAPI SetWinEventHook(  __in  UINT eventMin,  __in  UINT eventMax,  __in  HMODULE hmodWinEventPro

【Qt编程】无边框窗口的拖动

在上一篇文章中,我们讲述了如何进行无边框窗口的缩放与拖动,而在一些情况下,我们的窗口只需要进行拖动也不需要改变其大小,比如:QQ的登录窗口.本来在上一篇文章中已经讲述了如何进行窗口的拖动,但是却与窗口的缩放相关的程序放在一起,下面专门单独分离出来. 窗口的拖放只涉及到鼠标事件:按下操作.释放操作和移动操作,因此只需要重写这三个函数.由于程序比较简单,并且注释也比较详细,就不作过多介绍.新建一个基类为QWidget的Qt Gui应用程序,只需修改widget.h和widget.cpp文件如下: 1

【Qt编程】无边框窗口的缩放与拖动

在现在,绝大多数软件都向着简洁,时尚发展.就拿有道的单词本和我做的单词本来说,绝大多数用户肯定喜欢我所做的单词本(就单单界面,关于颜色搭配和布局问题,大家就不要在意了). 有道的单词本: 我所做的单词本: 很明显,两者的主要区别就是周围的边框问题.你可以对比QQ以前的版本和这几年的版本,就会发现都倾向于下面这种窗口模式.下面我们就说说如何用Qt实现无边框窗口的缩放与拖动. 对于无边框窗口的拖动其实很简单,其基本思想是,在鼠标移动前后记录鼠标的坐标,然后将窗口移动这两个坐标之差的距离即可,具体实现