注册 登录
编程论坛 汇编论坛

系统是如何知道某个消息是发往特定窗口的(习惯了再汇编 收下这个问题吧)

wobianlong 发布于 2012-10-07 21:54, 627 次点击
系统是如何知道某个消息是发往特定窗口的
假设 我在桌面上开了很多个窗口
我的鼠标在移来移去
当我 鼠标点击某个窗口时候,这个窗口发生了反应
我的问题来了,系统是如何知道我鼠标点击了哪个窗口,不要说 消息里包含了哪个窗口的句柄 这样的话,所以才知道点击了哪个
系统是怎么识别 我的鼠标点击了哪里,然后封装一个消息给我点击的窗口,我点击了A窗口,为什么系统不会封装个给C窗口的消息呢,
9 回复
#2
zklhp2012-10-08 09:43
http://msdn.

举个例子

LRESULT WINAPI SendMessage(
  _In_  HWND hWnd,
  _In_  UINT Msg,
  _In_  WPARAM wParam,
  _In_  LPARAM lParam
);

这个API第一个参数不就是个窗口的句柄么 每条消息自然也是有目的的

至于你说的那个 消息分很多种 比如 键盘的输入只会发给激活的也就是前台的那个 后台的那些就不会有 但鼠标消息是到哪里就发哪里罢 总之 肯定可以识别 具体实现细节 windows核心编程 里面讲过一点
#3
wobianlong2012-10-08 10:59
回复 2楼 zklhp
嗯 我想问的就是 系统是如何知道 我点了哪个窗口的?根据像素点吗?好像不是的,
假设A窗口重叠在C窗口上,我点了A,为什么系统就知道是我点了A 而不是C,
系统是究竟如何知道 我的鼠标点击 要发往哪个窗口
#4
wobianlong2012-10-08 11:00
LRESULT WINAPI SendMessage(
  _In_  HWND hWnd,
  _In_  UINT Msg,
  _In_  WPARAM wParam,
  _In_  LPARAM lParam
);
我指的问题应该是 这个句柄是怎么确定的,应该是发生在这个消息前的事件  是如何确定
#5
newdos2012-10-08 11:46
所有的窗口都是由Windows系统内部进行管理,它当然知道何时发送给哪个windows什么消息,从某个API函数例如:WindowFromPoint
从某个点获得该点所指的windows句柄,可以得知这个推断是正确的,windows内部创建了多少个窗口,每个窗口的坐标等参数,每个窗口对应了哪个消息处理函数,
都是由系统进行管理和维护,包括何时消毁,何时把它的Z坐标进行改变。

再来看这个API内部的运行机制,估计就是:进行遍历窗口,找到某个窗口的坐标范围是否在这个点中,如果没有找到,返回NULL,如果找到了,
继续查找该窗口中各个子控件的坐标是否在这个点的范围内,如果没有找到,就返回窗口的HWND,如果找到了,就返回子控件的HWND。
因为子控件也是窗口,当然,这只是估计,windows并不开发内核代码,所以我们只能猜测,如果系统是你写的,估计你也会采用这种方案。

因此,你点了窗口A,Windows并不会误认为你的鼠标跑到窗口B上了,不要忘了鼠标也是由windows系统通过驱动文件进行管理的,所以它会向你的窗口A消息过程发送消息,而不会发给B,换句话说,在发送消息前,Windows早就知道此消息应该发给谁了。
#6
有容就大2012-10-08 11:51
莫非是传说中的“别呼叫我,我会呼叫您”?
撸过 雪袭。。。
#7
zklhp2012-10-08 12:00
以下是引用wobianlong在2012-10-8 10:59:12的发言:

嗯 我想问的就是 系统是如何知道 我点了哪个窗口的?根据像素点吗?好像不是的,
假设A窗口重叠在C窗口上,我点了A,为什么系统就知道是我点了A 而不是C,
系统是究竟如何知道 我的鼠标点击 要发往哪个窗口
根据像素点吗?好像不是的

有的时候好像就是根据像素点在某个窗口内判断的。。
#8
wobianlong2012-10-08 14:29
回复 7楼 zklhp
难道你也不清楚这个问题吗?求探讨啊
#9
wobianlong2012-10-08 14:36
回复 5楼 newdos
你的回答真对我的问题,好像系统要找个这个窗口还挺复杂啊
能说的再详细点嘛?
如果是键盘为什么先要激活该窗口
#10
爱末流2012-10-09 17:53
罗云彬的书不是有讲? 第四章
1