API比较PostMessageA和SendMessageA游戏屏蔽

PostMessageA

PostMessage是Windows API(应用程序接口) 中的一个常用函数,用于将一条消息放入到消息队列中。消息队列里的消息通过调用GetMessage和PeekMessage取得。

折叠参数说明
 
hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
 
HWND_BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、 被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口
 
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样
 
Msg:指定被寄送的消息。
 
wParam:指定附加的消息特定的信息。
 
LParam:指定附加的消息特定的信息。
 
返回值:如果函数调用成功,返回非零,否则函数调用返回值为零

SendMessageA

Windows API宏,在WinUser.h中根据是否已定义Unicode被定义为SendMessageW或SendMessageA,这两个函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而和函数PostMessage不同,PostMessage是将一个消息寄送到一个线程的消息队列后就立即返回。

折叠参数
 
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
 
Msg:指定被发送的消息。
 
wParam:指定附加的消息特定信息。
 
IParam:指定附加的消息特定信息。
 
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
 
备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。
 
如果指定的窗口是由正在调用的线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。
 
Windows CE:Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要检查发送的消息是否被支持。
 
速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。
 
SendMessage函数使用实例
 
程序控制拉下或收起组合框的下拉列来。
 
一般情况下,为了拉下或收起组合框的下拉列表,需要用键盘或鼠标进行操作,而有时我们希望程序运行的某个时刻自动拉出下拉列表(比如在一些演示程序中),为了实现这个目的,我们也只有借助于SendMessage函数,方法是发一个CB_SHOWDROPDOWN(&H14F)消息给组合框。
 
在发CB_SHOWDROPDOWN消息时,wParam参数决定了是拉下列表(=True时)还是收起列表(=False时),lParam无用(设为0)

区别

SendMessageA,是直接调用窗口过程函数,直到该函数执行完成后才返回;

而PostMessageA ,是把消息放入消息队列然后返回。

所以,使用sendmessagea有时会导致程序假死,尤其是单线程进程,在多线程处理时也会有这样的情况;此时为了防止程序假死,可以将sendmessagea改为postmessagea,放消息进入消息列队就返回而不是等待此消息被操作系统成功处理得到结果后再返回,从而防止程序假死。

现在很多网络游戏都把这些个API给屏蔽了。


发布日期:

所属分类: 编程 标签:  


没有相关文章!