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