PostMessage和SendMessage的区别

1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而sendmessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示postmessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。这点大家应该都明白。

2,如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口。SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。如果在不同线程内。最好用PostThreadMessage代替PostMessage,他工作的很好。SendMessage发送消息到目标窗口所属的线程的消息队列,然后发送消息的线程等待(事实上,他应该还在做一些监测工作,比如监视QS_SENDMESSAGE标志),直到目标窗口处理完并且结果返回,发送消息的线程才继续运行。这是SendMessage的一般情况,事实上,处理过程要复杂的多。比如,当发送消息的线程监测到有别的窗口SendMessage一个消息到来时,他直接调用窗口处理过程(重入),并将处理结果返回(这个过程不需要消息循环中GetMessage等的支持)。

3, msdn: If you send a message in the range below WM_USER to the asynchronous message functions (PostMessage, SendNotifyMessage, and SendMessageCallback), its message parameters can not include pointers. Otherwise, the operation will fail.

如果发送的消息码在WM_USER之下(非自定义消息)且消息参数中带有指针,那么PostMessage,SendNotifyMessage,SendMessageCallback这些异步消息发送函数将会调用失败。最好不要用PostMessage发送带有指针参数的消息。

 

另外附上一些Windows常用消息号。


01.WM_NULL = 0x00  
02.WM_CREATE = 0x01  
03.WM_DESTROY = 0x02  
04.WM_MOVE = 0x03  
05.WM_SIZE = 0x05  
06.WM_ACTIVATE = 0x06  
07.WM_SETFOCUS = 0x07  
08.WM_KILLFOCUS = 0x08  
09.WM_ENABLE = 0x0A  
10.WM_SETREDRAW = 0x0B  
11.WM_SETTEXT = 0x0C  
12.WM_GETTEXT = 0x0D  
13.WM_GETTEXTLENGTH = 0x0E  
14.WM_PAINT = 0x0F  
15.WM_CLOSE = 0x10  
16.WM_QUERYENDSESSION = 0x11  
17.WM_QUIT = 0x12  
18.WM_QUERYOPEN = 0x13  
19.WM_ERASEBKGND = 0x14  
20.WM_SYSCOLORCHANGE = 0x15  
21.WM_ENDSESSION = 0x16  
22.WM_SYSTEMERROR = 0x17  
23.WM_SHOWWINDOW = 0x18  
24.WM_CTLCOLOR = 0x19  
25.WM_WININICHANGE = 0x1A  
26.WM_SETTINGCHANGE = 0x1A  
27.WM_DEVMODECHANGE = 0x1B  
28.WM_ACTIVATEAPP = 0x1C  
29.WM_FONTCHANGE = 0x1D  
30.WM_TIMECHANGE = 0x1E  
31.WM_CANCELMODE = 0x1F  
32.WM_SETCURSOR = 0x20  
33.WM_MOUSEACTIVATE = 0x21  
34.WM_CHILDACTIVATE = 0x22  
35.WM_QUEUESYNC = 0x23  
36.WM_GETMINMAXINFO = 0x24  
37.WM_PAINTICON = 0x26  
38.WM_ICONERASEBKGND = 0x27  
39.WM_NEXTDLGCTL = 0x28  
40.WM_SPOOLERSTATUS = 0x2A  
41.WM_DRAWITEM = 0x2B  
42.WM_MEASUREITEM = 0x2C  
43.WM_DELETEITEM = 0x2D  
44.WM_VKEYTOITEM = 0x2E  
45.WM_CHARTOITEM = 0x2F  
46. 
47.WM_SETFONT = 0x30  
48.WM_GETFONT = 0x31  
49.WM_SETHOTKEY = 0x32  
50.WM_GETHOTKEY = 0x33  
51.WM_QUERYDRAGICON = 0x37  
52.WM_COMPAREITEM = 0x39  
53.WM_COMPACTING = 0x41  
54.WM_WINDOWPOSCHANGING = 0x46  
55.WM_WINDOWPOSCHANGED = 0x47  
56.WM_POWER = 0x48  
57.WM_COPYDATA = 0x4A  
58.WM_CANCELJOURNAL = 0x4B  
59.WM_NOTIFY = 0x4E  
60.WM_INPUTLANGCHANGEREQUEST = 0x50  
61.WM_INPUTLANGCHANGE = 0x51  
62.WM_TCARD = 0x52  
63.WM_HELP = 0x53  
64.WM_USERCHANGED = 0x54  
65.WM_NOTIFYFORMAT = 0x55  
66.WM_CONTEXTMENU = 0x7B  
67.WM_STYLECHANGING = 0x7C  
68.WM_STYLECHANGED = 0x7D  
69.WM_DISPLAYCHANGE = 0x7E  
70.WM_GETICON = 0x7F  
71.WM_SETICON = 0x80  
72. 
73.WM_NCCREATE = 0x81  
74.WM_NCDESTROY = 0x82  
75.WM_NCCALCSIZE = 0x83  
76.WM_NCHITTEST = 0x84  
77.WM_NCPAINT = 0x85  
78.WM_NCACTIVATE = 0x86  
79.WM_GETDLGCODE = 0x87  
80.WM_NCMOUSEMOVE = 0xA0  
81.WM_NCLBUTTONDOWN = 0xA1  
82.WM_NCLBUTTONUP = 0xA2  
83.WM_NCLBUTTONDBLCLK = 0xA3  
84.WM_NCRBUTTONDOWN = 0xA4  
85.WM_NCRBUTTONUP = 0xA5  
86.WM_NCRBUTTONDBLCLK = 0xA6  
87.WM_NCMBUTTONDOWN = 0xA7  
88.WM_NCMBUTTONUP = 0xA8  
89.WM_NCMBUTTONDBLCLK = 0xA9  
90. 
91.WM_KEYFIRST = 0x100  
92.WM_KEYDOWN = 0x100  
93.WM_KEYUP = 0x101  
94.WM_CHAR = 0x102  
95.WM_DEADCHAR = 0x103  
96.WM_SYSKEYDOWN = 0x104  
97.WM_SYSKEYUP = 0x105  
98.WM_SYSCHAR = 0x106  
99.WM_SYSDEADCHAR = 0x107  
100.WM_KEYLAST = 0x108  
101. 
102.WM_IME_STARTCOMPOSITION = 0x10D  
103.WM_IME_ENDCOMPOSITION = 0x10E  
104.WM_IME_COMPOSITION = 0x10F  
105.WM_IME_KEYLAST = 0x10F  
106. 
107.WM_INITDIALOG = 0x110  
108.WM_COMMAND = 0x111  
109.WM_SYSCOMMAND = 0x112  
110.WM_TIMER = 0x113  
111.WM_HSCROLL = 0x114  
112.WM_VSCROLL = 0x115  
113.WM_INITMENU = 0x116  
114.WM_INITMENUPOPUP = 0x117  
115.WM_MENUSELECT = 0x11F  
116.WM_MENUCHAR = 0x120  
117.WM_ENTERIDLE = 0x121  
118. 
119.WM_CTLCOLORMSGBOX = 0x132  
120.WM_CTLCOLOREDIT = 0x133  
121.WM_CTLCOLORLISTBOX = 0x134  
122.WM_CTLCOLORBTN = 0x135  
123.WM_CTLCOLORDLG = 0x136  
124.WM_CTLCOLORSCROLLBAR = 0x137  
125.WM_CTLCOLORSTATIC = 0x138  
126. 
127.WM_MOUSEFIRST = 0x200  
128.WM_MOUSEMOVE = 0x200  
129.WM_LBUTTONDOWN = 0x201  
130.WM_LBUTTONUP = 0x202  
131.WM_LBUTTONDBLCLK = 0x203  
132.WM_RBUTTONDOWN = 0x204  
133.WM_RBUTTONUP = 0x205  
134.WM_RBUTTONDBLCLK = 0x206  
135.WM_MBUTTONDOWN = 0x207  
136.WM_MBUTTONUP = 0x208  
137.WM_MBUTTONDBLCLK = 0x209  
138.WM_MOUSEWHEEL = 0x20A  
139.WM_MOUSEHWHEEL = 0x20E  
140. 
141.WM_PARENTNOTIFY = 0x210  
142.WM_ENTERMENULOOP = 0x211  
143.WM_EXITMENULOOP = 0x212  
144.WM_NEXTMENU = 0x213  
145.WM_SIZING = 0x214  
146.WM_CAPTURECHANGED = 0x215  
147.WM_MOVING = 0x216  
148.WM_POWERBROADCAST = 0x218  
149.WM_DEVICECHANGE = 0x219  
150. 
151.WM_MDICREATE = 0x220  
152.WM_MDIDESTROY = 0x221  
153.WM_MDIACTIVATE = 0x222  
154.WM_MDIRESTORE = 0x223  
155.WM_MDINEXT = 0x224  
156.WM_MDIMAXIMIZE = 0x225  
157.WM_MDITILE = 0x226  
158.WM_MDICASCADE = 0x227  
159.WM_MDIICONARRANGE = 0x228  
160.WM_MDIGETACTIVE = 0x229  
161.WM_MDISETMENU = 0x230  
162.WM_ENTERSIZEMOVE = 0x231  
163.WM_EXITSIZEMOVE = 0x232  
164.WM_DROPFILES = 0x233  
165.WM_MDIREFRESHMENU = 0x234  
166. 
167.WM_IME_SETCONTEXT = 0x281  
168.WM_IME_NOTIFY = 0x282  
169.WM_IME_CONTROL = 0x283  
170.WM_IME_COMPOSITIONFULL = 0x284  
171.WM_IME_SELECT = 0x285  
172.WM_IME_CHAR = 0x286  
173.WM_IME_KEYDOWN = 0x290  
174.WM_IME_KEYUP = 0x291  
175. 
176.WM_MOUSEHOVER = 0x2A1  
177.WM_NCMOUSELEAVE = 0x2A2  
178.WM_MOUSELEAVE = 0x2A3  
179. 
180.WM_CUT = 0x300  
181.WM_COPY = 0x301  
182.WM_PASTE = 0x302  
183.WM_CLEAR = 0x303  
184.WM_UNDO = 0x304  
185. 
186.WM_RENDERFORMAT = 0x305  
187.WM_RENDERALLFORMATS = 0x306  
188.WM_DESTROYCLIPBOARD = 0x307  
189.WM_DRAWCLIPBOARD = 0x308  
190.WM_PAINTCLIPBOARD = 0x309  
191.WM_VSCROLLCLIPBOARD = 0x30A  
192.WM_SIZECLIPBOARD = 0x30B  
193.WM_ASKCBFORMATNAME = 0x30C  
194.WM_CHANGECBCHAIN = 0x30D  
195.WM_HSCROLLCLIPBOARD = 0x30E  
196.WM_QUERYNEWPALETTE = 0x30F  
197.WM_PALETTEISCHANGING = 0x310  
198.WM_PALETTECHANGED = 0x311  
199. 
200.WM_HOTKEY = 0x312  
201.WM_PRINT = 0x317  
202.WM_PRINTCLIENT = 0x318  
203. 
204.WM_HANDHELDFIRST = 0x358  
205.WM_HANDHELDLAST = 0x35F  
206.WM_PENWINFIRST = 0x380  
207.WM_PENWINLAST = 0x38F  
208.WM_COALESCE_FIRST = 0x390  
209.WM_COALESCE_LAST = 0x39F  
210.WM_DDE_FIRST = 0x3E0  
211.WM_DDE_INITIATE = 0x3E0  
212.WM_DDE_TERMINATE = 0x3E1  
213.WM_DDE_ADVISE = 0x3E2  
214.WM_DDE_UNADVISE = 0x3E3  
215.WM_DDE_ACK = 0x3E4  
216.WM_DDE_DATA = 0x3E5  
217.WM_DDE_REQUEST = 0x3E6  
218.WM_DDE_POKE = 0x3E7  
219.WM_DDE_EXECUTE = 0x3E8  
220.WM_DDE_LAST = 0x3E8  
221. 
222.WM_USER = 0x400  
223.WM_APP = 0x8000 

 

你可能感兴趣的:(PostMessage和SendMessage的区别)