WM_NCHITTEST消息是队列消息还是非队列消息?

ooolinux 2017-02-06 01:05:52
鼠标点击一个窗口的时候,系统会发送WM_NCHITTEST消息给窗口,它是怎么发送的?
放到消息队列还是直接SendMessage?

SendMessage发送消息给一个窗口时,是直接调用该窗口的窗口消息处理函数WndProc并获取其返回值吗?
...全文
466 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooolinux 2017-02-12
  • 打赏
  • 举报
回复
paschen 2017-02-08
  • 打赏
  • 举报
回复
有返回值的消息应该用的是send
赵4老师 2017-02-07
  • 打赏
  • 举报
回复
引用 7 楼 u010165006 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] 《深入浅出MFC》中详细介绍了Windows处理窗口消息的详细过程。
一般的过程我大概能懂。[/quote] 学会使用软件Spy++跟踪Windows消息。 学会使用VS IDE设置Windows消息断点: Setting a Breakpoint on a Message Received by a Windows Function You can set message breakpoints to stop the debugger when a particular WndProc function message is received. Note Message breakpoints work only on x86- or Pentium-based systems. To set a breakpoint on a message From the Edit menu, click Breakpoints. The Breakpoints dialog box appears. Click the Messages tab. In the Break At WndProc text box, type the name of the Windows function. If you are setting a breakpoint during a debug session, the list contains the exported functions in your project. In the Set One Breakpoint For Each Message To Watch list box, select the message. To set another breakpoint, press ENTER, and then repeat steps 3 and 4. The Breakpoints list displays the currently active breakpoints. Click OK to set the breakpoints. Note If you interrupt execution while Windows or other system code is running, the results can be unpredictable.
paschen 2017-02-06
  • 打赏
  • 举报
回复
直接post到窗口的消息队列中,而不是send
fefe82 2017-02-06
  • 打赏
  • 举报
回复
引用 楼主 u010165006 的回复:
鼠标点击一个窗口的时候,系统会发送WM_NCHITTEST消息给窗口,它是怎么发送的? 放到消息队列还是直接SendMessage?
这不重要。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms645618(v=vs.85).aspx
A window receives this message through its WindowProc function.
引用 楼主 u010165006 的回复:
SendMessage发送消息给一个窗口时,是直接调用该窗口的窗口消息处理函数WndProc并获取其返回值吗?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx
The SendMessage function calls the window procedure for the specified window and
 does not return until the window procedure has processed the message.
要学会看 MSDN 。
ooolinux 2017-02-06
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
《深入浅出MFC》中详细介绍了Windows处理窗口消息的详细过程。
一般的过程我大概能懂。
赵4老师 2017-02-06
  • 打赏
  • 举报
回复
《深入浅出MFC》中详细介绍了Windows处理窗口消息的详细过程。
ooolinux 2017-02-06
  • 打赏
  • 举报
回复
我想知道整个流程是怎样的,从系统发出该消息,到程序截获消息设置返回值,到系统得到返回值,主要经过的函数。
fefe82 2017-02-06
  • 打赏
  • 举报
回复
引用 3 楼 u010165006 的回复:
[quote=引用 1 楼 fefe82 的回复:] [quote=引用 楼主 u010165006 的回复:] 鼠标点击一个窗口的时候,系统会发送WM_NCHITTEST消息给窗口,它是怎么发送的? 放到消息队列还是直接SendMessage?
这不重要。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms645618(v=vs.85).aspx
A window receives this message through its WindowProc function.
引用 楼主 u010165006 的回复:
SendMessage发送消息给一个窗口时,是直接调用该窗口的窗口消息处理函数WndProc并获取其返回值吗?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx
The SendMessage function calls the window procedure for the specified window and
 does not return until the window procedure has processed the message.
要学会看 MSDN 。[/quote]
引用 2 楼 paschen 的回复:
直接post到窗口的消息队列中,而不是send
问题是,WM_NCHITTEST消息是有返回值的,比如我要拖动一个无标题栏的窗口,程序中截获WM_NCHITTEST消息,设置消息的返回值为HTCAPTION,以欺骗系统达到拖动窗口的目的,如果是队列消息,系统如何得到WM_NCHITTEST消息的返回值呢?[/quote] 如果是你自己发的,那么用 Send 就可以了。 如果是系统的,那么就不需要你关心了。如果需要用到,系统肯定是可以得到的。
ooolinux 2017-02-06
  • 打赏
  • 举报
回复
引用 1 楼 fefe82 的回复:
[quote=引用 楼主 u010165006 的回复:] 鼠标点击一个窗口的时候,系统会发送WM_NCHITTEST消息给窗口,它是怎么发送的? 放到消息队列还是直接SendMessage?
这不重要。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms645618(v=vs.85).aspx
A window receives this message through its WindowProc function.
引用 楼主 u010165006 的回复:
SendMessage发送消息给一个窗口时,是直接调用该窗口的窗口消息处理函数WndProc并获取其返回值吗?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx
The SendMessage function calls the window procedure for the specified window and
 does not return until the window procedure has processed the message.
要学会看 MSDN 。[/quote]
引用 2 楼 paschen 的回复:
直接post到窗口的消息队列中,而不是send
问题是,WM_NCHITTEST消息是有返回值的,比如我要拖动一个无标题栏的窗口,程序中截获WM_NCHITTEST消息,设置消息的返回值为HTCAPTION,以欺骗系统达到拖动窗口的目的,如果是队列消息,系统如何得到WM_NCHITTEST消息的返回值呢?
融合MFC各种消息的描叙与实现····· 消息映射的实现   Windows消息概述   Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。   消息的分类   队列消息和非队列消息   从消息的发送途径上看,消息分两种:队列消息和非队列消息队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。   这里,对消息队列阐述如下:   Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。   鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。Windows每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。线程消息队列接收送给该线程所创建窗口的消息。线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。   除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。   这些队列消息以外的绝大多数消息是非队列消息。   系统消息和应用程序消息   从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。   系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。   消息结构和消息处理   消息的结构   为了从消息队列获取消息信息,需要使用MSG结构。例如,::GetMessage函数(从消息队列得到消息并从队列中移走)和::PeekMessage函数(从消息队列得到消息但是可以不移走)都使用了该结构来保存获得的消息信息。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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