首页 > 编程知识 正文

dispatch_barrier(peekmessage)

时间:2023-05-06 11:02:28 阅读:73232 作者:544

转换消息(msg;

TranslateMessage用于将快捷方式消息转换为字符消息,并将转换后的新消息传递到调用线程的消息队列中。

在Windows上,所有键盘代码都是用虚拟键定义的,因此按下键时无法将消息乱码化。 需要将键盘映射文字化的消息。 字符消息将传递到调用线程的消息队列,并在下次调用GetMessage函数时检索。

长期分散消息(const msg * lpmsg );

功能:此函数向窗口程序分发消息。 也就是说,将消息推送至afxwndproc,最后流向pwnd-windowproc。 DispatchMessage在cwinapp:run上调用泵消息,pumpmessage在diispatchapp33603360run上调用泵消息,通常消息是GetMessage 消息被分发到回调函数(过程函数),将消息传递到操作系统,然后操作系统调用回调函数。 这意味着在窗体的过程函数中处理消息

在mfc2.5时代(九几年代),所有窗口类都共享同一窗口函数(即afxwndproc )。

但是现在使用的是挂钩技术,也就是hook,请结合hook的章节来看。

每次生成cwnd派生类中的对象时都会发生hook操作。

因此,DispatchMessage向hook技术的afxwndproc发送了消息。

HOOK (挂钩、挂钩)实现了类似于Windows平台上的中断的机制。 HOOK机制允许APP应用程序拦截和处理Windows消息或指定的事件。 发送指定消息后,HOOK程序可以在消息到达目标窗口之前捕获、控制消息,并处理或修改消息以添加所需的功能。

定义钩子函数

胡克函数是一种特殊的回调函数。 当发生挂接监视的特定事件时,系统调用挂接函数进行处理。 挂接函数的格式因事件而异。 用鼠标钩子函数的例子说明钩子函数的原型。

lresultcallbackhookproc (int ncode、WPARAM wParam、LPARAM lParam ) )。

参数wParam和lParam包含有关挂接消息的信息,如鼠标的位置、状态和键盘上的键。

安装钩子

初始化程序时,调用函数SetWindowsHookEx安装挂接。 函数的原型如下

hooksetwindowshookex(intidhook,HOOKPROC lpfn,INSTANCE hMod,DWORD dwThreadId ) )。

参数idHook表示挂钩型,与挂钩函数型一一对应。 例如,WH_KEYBOARD指示安装了键盘挂钩,WH_MOUSE指示是鼠标挂钩,等等。

卸载钩子

如果不再使用挂钩,则需要立即卸载。 轻松调用函数:

boolunhookwindowshookex (hhook hhk )就可以了。

PeekMessage和GetMessage函数的主要区别如下:

GetMessage的主要功能是从消息队列中“检索”消息,并在检索到消息时将其从消息队列中删除。 另一方面,PeekMessage的主要功能是“窥视”消息,如果有消息则返回true,否则返回false。 也可以使用PeekMessage从消息队列中检索消息。 这使用参数“UINT wRemoveMsg”,如果设置为PM_REMOVE,则会检索消息并将其从消息队列中删除。 如果设置为PM_NOREMOVE,则不会从消息队列中检索消息。

如果GetMessage无法从消息队列中检索消息,则操作系统将挂起线程。 两者的性质不同,直到操作系统重新调度线程。 使用GetMessage线程也将挂起,使用PeekMessage线程将获得CPU控制权并运行一段时间。

GetMessage每次等待消息直到收到消息; 另一方面,PeekMessage只需查询消息队列,如果没有消息,则立即返回,判断是否从返回值中提取了消息

PeekMessage是一个具有线程异步行为的函数,无论消息队列中是否存在消息,该函数都会立即返回。 另一方面,GetMessage是一个具有线程同步行为的函数,如果消息队列中没有消息,函数将等待,直到消息队列中至少有一条消息。

另外,PumpMessage起到消息泵的作用,其原理是使用GetMessage或PeekMessage函数从消息队列中逐一读取消息,进行必要的处理后再发送。 可以使用泵消息的默认处理流程。 当然,也可以自己更改消息处理的方法。 通常,我们在自己设计窗口时也会自己设计消息循环方法。 也就是说,泵消息函数调用GetMessage、translate消息和dispatch消息

常规wm_xx消息

wm_command

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。