如题所述
ä¸ã å¼è¨
äºãWindowsæ¶æ¯æºå¶çæ¦å¿µ
1ãDOSä¸Windows驱å¨æºå¶çåºå«
2ãæ¶æ¯
3ãæ¶æ¯çæ¥æº
4ãWindowsçæ¶æ¯ç³»ç»çç»æ
5ãæ¶æ¯çååº
ä¸ãWindowsæ¶æ¯æºå¶è¦ç¹
1. çªå£è¿ç¨
2 æ¶æ¯ç±»å
3æ¶æ¯éå(Message Queues)
4 éåæ¶æ¯åééåæ¶æ¯
5 Windowsæ¶æ¯å½æ°
6æ¶æ¯æ»é( Message Deadlocks
7 BroadcastSystemMessage
åãMFCæ¶æ¯æºå¶
1.MFCæ¡æ¶ä¸ï¼æ¥æ¶å¤çæ¥èªWindowsæ¶æ¯çè¿ç¨
2.MFCå é¨æ¶æ¯å¤çæ¹å¼
ä¸ã å¼è¨
å¨ C++ç¨åºæ¶æ ä¸æä¸ï¼æ们çå°ï¼ç¨åºæ¯ç±ä¸äºå±æ¬¡å模åç»æçï¼é£ä¹ï¼è¿äºæ¨¡åä¹é´ï¼ 以åä½ çç¨åºåwindows ä¹é´ï¼æ¯å¦ä½ä¼ éä¿¡æ¯å¢ï¼å¨windows çå¹³å°ä¸ï¼ä¼ éä¿¡æ¯æ¯ç± windows message æ¶æ¯æºå¶æ¥è´è´£çï¼è¿æ¯Windows çæ ¸å¿é¨åã
æ¶æ¯å æ¬æ°æ®åæ令ã
äºãWindowsæ¶æ¯æºå¶çæ¦å¿µ
1ãDOSä¸Windows驱å¨æºå¶çåºå«
1ï¼DOSæ¯è¿ç¨é©±å¨çã
ä¼ ç»çMS-DOSç¨åºä¸»è¦éç¨é¡ºåºçãå ³èçãè¿ç¨é©±å¨çç¨åºè®¾è®¡æ¹æ³ãä¸ä¸ªè¿ç¨æ¯ä¸ç³»åé¢å å®ä¹å¥½çæä½åºåçç»åï¼å®å ·æä¸å®çå¼å¤´ãä¸é´è¿ç¨åç»æãç¨åºç´æ¥æ§å¶ç¨åºäºä»¶åè¿ç¨ç顺åºãè¿æ ·çç¨åºè®¾è®¡æ¹æ³æ¯é¢åç¨åºèä¸æ¯é¢åç¨æ·çï¼äº¤äºæ§å·®ï¼ç¨æ·çé¢ä¸å¤å好ï¼å 为å®å¼ºè¿«ç¨æ·æç §æç§ä¸å¯æ´æ¹ç模å¼è¿è¡å·¥ä½ãå®çåºæ¬æ¨¡åå¦å¾1.1æ示ã
2ï¼Windowsæ¯äºä»¶ï¼æ¶æ¯ï¼é©±å¨
äºä»¶é©±å¨ç¨åºè®¾è®¡æ¯ä¸ç§å ¨æ°çç¨åºè®¾è®¡æ¹æ³ï¼å®ä¸æ¯ç±äºä»¶ç顺åºæ¥æ§å¶ï¼èæ¯ç±äºä»¶çåçæ¥æ§å¶ï¼èè¿ç§äºä»¶çåçæ¯éæºçãä¸ç¡®å®çï¼å¹¶æ²¡æé¢å®ç顺åºï¼è¿æ ·å°±å 许ç¨åºççç¨æ·ç¨åç§åçç顺åºæ¥å®æç¨åºçæµç¨ã对äºéè¦ç¨æ·äº¤äºçåºç¨ç¨åºæ¥è¯´ï¼äºä»¶é©±å¨çç¨åºè®¾è®¡æçè¿ç¨é©±å¨æ¹æ³æ æ³æ¿ä»£çä¼ç¹ãå®æ¯ä¸ç§é¢åç¨æ·çç¨åºè®¾è®¡æ¹æ³ï¼å®å¨ç¨åºè®¾è®¡è¿ç¨ä¸é¤äºå®ææéåè½ä¹å¤ï¼æ´å¤çèèäºç¨æ·å¯è½çåç§è¾å ¥ï¼å¹¶é对æ§ç设计ç¸åºçå¤çç¨åºãå®æ¯ä¸ç§â被å¨âå¼ç¨åºè®¾è®¡æ¹æ³ï¼ç¨åºå¼å§è¿è¡æ¶ï¼å¤äºçå¾ ç¨æ·è¾å ¥äºä»¶ç¶æï¼ç¶ååå¾äºä»¶å¹¶ä½åºç¸åºååºï¼å¤çå®æ¯åè¿å并å¤äºçå¾ äºä»¶ç¶æãå®çæ¡å¾å¦å¾1.2æ示:
2ãæ¶æ¯
Windowsç³»ç»æ¯ä¸ä¸ªäºä»¶é©±å¨çOSï¼æ¯ä¸ä¸ªäºä»¶çåçé½ä¼äº§çä¸ä¸ªæ¶æ¯ï¼æ们éè¿æ¶æ¯æ¥ç¥éåçäºä»ä¹äºä»¶ï¼äºè§£äºä»¶ï¼è¿è解å³äºä»¶ãä»ä¹æ¯æ¶æ¯å¢ï¼å¾é¾ä¸ä¸ä¸ªå®ä¹ï¼ä¸é¢ä»ä¸åçå 个æ¹é¢è®²è§£ä¸ä¸ï¼
1ï¼ æ¶æ¯çç»æï¼ä¸ä¸ªæ¶æ¯ç±ä¸ä¸ªæ¶æ¯å称ï¼UINTï¼ï¼å两个åæ°ï¼WPARAMï¼LPARAMï¼ãå½ç¨æ·è¿è¡äºè¾å ¥ææ¯çªå£çç¶æåçæ¹åæ¶ç³»ç»é½ä¼åéæ¶æ¯å°æä¸ä¸ªçªå£ãä¾å¦å½èå转ä¸ä¹åä¼æWM_COMMANDæ¶æ¯åéï¼WPARAMçé«åä¸ï¼HIWORD(wParam)ï¼æ¯å½ä»¤çIDå·ï¼å¯¹èåæ¥è®²å°±æ¯èåIDãå½ç¶ç¨æ·ä¹å¯ä»¥å®ä¹èªå·±çæ¶æ¯å称ï¼ä¹å¯ä»¥å©ç¨èªå®ä¹æ¶æ¯æ¥åééç¥åä¼ éæ°æ®ã
2ï¼è°å°æ¶å°æ¶æ¯ï¼ä¸ä¸ªæ¶æ¯å¿ é¡»ç±ä¸ä¸ªçªå£æ¥æ¶ãå¨çªå£çè¿ç¨ï¼WNDPROCï¼ä¸å¯ä»¥å¯¹æ¶æ¯è¿è¡åæï¼å¯¹èªå·±æå ´è¶£çæ¶æ¯è¿è¡å¤çãä¾å¦ä½ å¸æ对èåéæ©è¿è¡å¤çé£ä¹ä½ å¯ä»¥å®ä¹å¯¹WM_COMMANDè¿è¡å¤çç代ç ï¼å¦æå¸æå¨çªå£ä¸è¿è¡å¾å½¢è¾åºå°±å¿ 须对WM_PAINTè¿è¡å¤çã
3ï¼æªå¤ççæ¶æ¯å°é£éå»äºï¼M$为çªå£ç¼åäºé»è®¤ççªå£è¿ç¨ï¼è¿ä¸ªçªå£è¿ç¨å°è´è´£å¤çé£äºä½ ä¸å¤çæ¶æ¯ãæ£å 为æäºè¿ä¸ªé»è®¤çªå£è¿ç¨æ们æå¯ä»¥å©ç¨Windowsççªå£è¿è¡å¼åèä¸å¿ è¿å¤å ³æ³¨çªå£åç§æ¶æ¯çå¤çãä¾å¦çªå£å¨è¢«æå¨æ¶ä¼æå¾å¤æ¶æ¯åéï¼èæ们é½å¯ä»¥ä¸äºçç¬è®©ç³»ç»èªå·±å»å¤çã
4ï¼çªå£å¥æï¼è¯´å°æ¶æ¯å°±ä¸è½ä¸è¯´çªå£å¥æï¼ç³»ç»éè¿çªå£å¥ææ¥å¨æ´ä¸ªç³»ç»ä¸å¯ä¸æ è¯ä¸ä¸ªçªå£ï¼åéä¸ä¸ªæ¶æ¯æ¶å¿ é¡»æå®ä¸ä¸ªçªå£å¥æ表æ该æ¶æ¯ç±é£ä¸ªçªå£æ¥æ¶ãèæ¯ä¸ªçªå£é½ä¼æèªå·±ççªå£è¿ç¨ï¼æ以ç¨æ·çè¾å ¥å°±ä¼è¢«æ£ç¡®çå¤çãä¾å¦æ两个çªå£å ±ç¨ä¸ä¸ªçªå£è¿ç¨ä»£ç ï¼ä½ å¨çªå£ä¸ä¸æä¸é¼ æ æ¶æ¶æ¯å°±ä¼éè¿çªå£ä¸çå¥æ被åéå°çªå£ä¸èä¸æ¯çªå£äºã
3ãæ¶æ¯çæ¥æº
äºä»¶é©±å¨å´ç»çæ¶æ¯ç产çä¸å¤çå±å¼ï¼ä¸æ¡æ¶æ¯æ¯å ³äºåççäºä»¶çæ¶æ¯ãäºä»¶é©±å¨æ¯é æ¶æ¯å¾ªç¯æºå¶æ¥å®ç°çãä¹å¯ä»¥ç解为æ¶æ¯æ¯ä¸ç§æ¥åæå ³äºä»¶åççéç¥ã
Windowsåºç¨ç¨åºçæ¶æ¯æ¥æºæä¸ä¸åç§ï¼
1ï¼è¾å ¥æ¶æ¯ï¼å æ¬é®çåé¼ æ çè¾å ¥ãè¿ä¸ç±»æ¶æ¯é¦å æ¾å¨ç³»ç»æ¶æ¯éåä¸ï¼ç¶åç±Windowså°å®ä»¬éå ¥åºç¨ç¨åºæ¶æ¯éåä¸ï¼ç±åºç¨ç¨åºæ¥å¤çæ¶æ¯ã
2ï¼æ§å¶æ¶æ¯ï¼ç¨æ¥ä¸Windowsçæ§å¶å¯¹è±¡ï¼å¦å表æ¡ãæé®ãæ£æ¥æ¡çè¿è¡ååéä¿¡ãå½ç¨æ·å¨å表æ¡ä¸æ¹å¨å½åéæ©ææ¹åäºæ£æ¥æ¡çç¶ææ¶ååºæ¤ç±»æ¶æ¯ãè¿ç±»æ¶æ¯ä¸è¬ä¸ç»è¿åºç¨ç¨åºæ¶æ¯éåï¼èæ¯ç´æ¥åéå°æ§å¶å¯¹è±¡ä¸å»ã
3ï¼ç³»ç»æ¶æ¯ï¼å¯¹ç¨åºåçäºä»¶æç³»ç»æ¶éä¸æä½åºååºãä¸äºç³»ç»æ¶æ¯ï¼è±¡DDEæ¶æ¯ï¼å¨ææ°æ®äº¤æ¢æ¶æ¯ï¼è¦éè¿Windowsçç³»ç»æ¶æ¯éåï¼èæçåä¸éè¿ç³»ç»æ¶æ¯éåèç´æ¥éå ¥åºç¨ç¨åºçæ¶æ¯éåï¼å¦å建çªå£æ¶æ¯ã
4ï¼ç¨æ·æ¶æ¯ï¼è¿æ¯ç¨åºåèªå·±å®ä¹å¹¶å¨åºç¨ç¨åºä¸ä¸»å¨ååºçï¼ä¸è¬ç±åºç¨ç¨åºçæä¸é¨åå é¨å¤çã
4ãWindowsçæ¶æ¯ç³»ç»çç»æ
Windowsçæ¶æ¯ç³»ç»ç±ä»¥ä¸3é¨åç»æï¼
æ¶æ¯éåï¼Windowsè½å¤ä¸ºææçåºç¨ç¨åºç»´æ¤ä¸ä¸ªæ¶æ¯éåï¼åºç¨ç¨åºå¿ é¡»ä»æ¶æ¯éåä¸è·å»æ¶æ¯ï¼ç¶ååæ´¾ç»æ个çªä½ã
æ¶æ¯å¾ªç¯ï¼éè¿è¿ä¸ªå¾ªç¯æºå¶ï¼åºç¨ç¨åºä»æ¶æ¯éåä¸æ£ç´¢æ¶æ¯ï¼åæå®åæ´¾ç»éå½ççªå£ï¼ç¶å继ç»ä»æ¶æ¯éåä¸æ£ç´¢ä¸ä¸æ¡æ¶æ¯ï¼ååæ´¾ç»éå½ççªå£ï¼ä¾æ¬¡è¿è¡ã
çªå£è¿ç¨ï¼æ¯ä¸ªçªå£é½æä¸ä¸ªçªå£è¿ç¨ï¼ä»¥æ¥æ¶Windows ä¼ éç»çªå£çæ¶æ¯ï¼çªå£è¿ç¨çä»»å¡å°±æ¯è·åæ¶æ¯å¹¶ä¸ååºå®ãçªå£è¿ç¨æ¯ä¸ä¸ªåè°å½æ°ï¼å¤çå®ä¸ä¸ªæ¶æ¯åï¼é常è¦ç»Windows ä¸ä¸ªè¿åå¼ã
5ãæ¶æ¯çååº
æ¶æ¯ç产çæ¥æºäºç³»ç»äºæ (å æ¬è®¡æ¶å¨äºä»¶)åç¨æ·äºæ ,Windowsç¨æ¶æ¯æ¥è°å ¥åå ³é(è¿æå ¶å®å¤ç,å¦ç»å¶ä¸ä¸ªçªå£ç)åºç¨ç¨åº,ä¸ä¸ªå ¸å表ç°æ¯å¨å ³æºæä½ä¸ï¼Windowsåä¸ä¸ªå ³æºçæ¶æ¯ç»æææ£å¨è¿è¡çåºç¨ç¨åºï¼åç¥å®ä»¬éåºå åï¼æ¤æ¶ï¼åºç¨ç¨åºç¨ååºæ¶æ¯çæ¹æ³æ¥ååºOSï¼å æ¤ï¼æ¶æ¯æ¯åºç¨ç¨åºä¸WinOS交äºçæ段..
æ¶æ¯äº§çå°è¢«çªå£ååºçæ¥éª¤ï¼ï¼å¦ä¸å¾ï¼
1> ç³»ç»åçäºæç¨æ·ååºæ个äºä»¶ã
2> Windowsæè¿ä¸ªäºä»¶ç¿»è¯ä¸ºæ¶æ¯ï¼ç¶åæä»æ¾å°æ¶æ¯éåä¸
3> åºç¨ç¨åºä»æ¶æ¯éåä¸æ¥åå°è¿ä¸ªæ¶æ¯ï¼æä»åæ¾å°TMsgè®°å½ä¸ã
4> åºç¨ç¨åºææ¶æ¯ä¼ éç»ä¸ä¸ªéå½ççªä½è¿ç¨ã
çªä½è¿ç¨ååºè¿ä¸ªæ¶æ¯å¹¶è¿è¡å¤çãææ¶æ¯ä¼ éç»äºè¿ä¸ªçªä½ççªä½å½æ°ã
ä¸ãWindowsæ¶æ¯æºå¶è¦ç¹
1. çªå£è¿ç¨
æ¯ä¸ªçªå£ä¼æä¸ä¸ªç§°ä¸ºçªå£è¿ç¨çåè°å½æ°(WndProc)ï¼å®å¸¦æå个åæ°ï¼åå«ä¸ºï¼çªå£å¥æ(Window Handle),æ¶æ¯ID(Message ID),å两个æ¶æ¯åæ°(wParam, lParam), å½çªå£æ¶å°æ¶æ¯æ¶ç³»ç»å°±ä¼è°ç¨æ¤çªå£è¿ç¨æ¥å¤çæ¶æ¯ãï¼æ以å«åè°å½æ°ï¼
2 æ¶æ¯ç±»å
1) ç³»ç»å®ä¹æ¶æ¯(System-Defined Messages)
å¨SDKä¸äºå å®ä¹å¥½çæ¶æ¯ï¼éç¨æ·å®ä¹çï¼å ¶èå´å¨[0Ã0000, 0Ã03ff]ä¹é´ï¼ å¯ä»¥å为以ä¸ä¸ç±»ï¼
çªå£æ¶æ¯(Windows Message)
ä¸çªå£çå é¨è¿ä½æå ³ï¼å¦å建çªå£ï¼ç»å¶çªå£ï¼éæ¯çªå£çãå¯ä»¥æ¯ä¸è¬ççªå£ï¼å¯ä»¥æ¯ Dialog,æ§ä»¶çã
å¦ï¼WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL..
å½ä»¤æ¶æ¯(Command Message)
ä¸å¤çç¨æ·è¯·æ±æå ³ï¼ å¦åå»èå项æå·¥å ·æ ææ§ä»¶æ¶ï¼ å°±ä¼äº§çå½ä»¤æ¶æ¯ã
WM_COMMAND, LOWORD(wParam)表示èå项ï¼å·¥å ·æ æé®ææ§ä»¶çIDãå¦ææ¯æ§ä»¶, HIWORD(wParam)表示æ§ä»¶æ¶æ¯ç±»å
æ§ä»¶éç¥(Notify Message)
æ§ä»¶éç¥æ¶æ¯ï¼ è¿æ¯æçµæ´»çæ¶æ¯æ ¼å¼ï¼ å ¶Message, wParam, lParamåå«ä¸ºï¼WM_NOTIFY, æ§ä»¶IDï¼æåNMHDRçæéãNMHDRå å«æ§ä»¶éç¥çå å®¹ï¼ å¯ä»¥ä»»ææ©å±ã
2) ç¨åºå®ä¹æ¶æ¯(Application-Defined Messages)
ç¨æ·èªå®ä¹çæ¶æ¯ï¼ 对äºå ¶èå´æå¦ä¸è§å®ï¼
WM_USER: 0Ã0400-0Ã7FFF (ex. WM_USER+10)
WM_APP(winver>4.0): 0Ã8000-0xBFFF (ex.WM_APP+4)
RegisterWindowMessage: 0xC000-0xFFFF
3æ¶æ¯éå(Message Queues)
Windowsä¸æ两ç§ç±»åçæ¶æ¯éå
1) ç³»ç»æ¶æ¯éå(System Message Queue)
è¿æ¯ä¸ä¸ªç³»ç»å¯ä¸çQueueï¼è®¾å¤é©±å¨(mouse, keyboard)ä¼ææä½è¾å ¥è½¬åææ¶æ¯åå¨ç³»ç»éåä¸ï¼ç¶åç³»ç»ä¼ææ¤æ¶æ¯æ¾å°ç®æ çªå£æå¨ç线ç¨çæ¶æ¯éå(thread-specific message queue)ä¸çå¾ å¤ç
2) 线ç¨æ¶æ¯éå(Thread-specific Message Queue)
æ¯ä¸ä¸ªGUI线ç¨é½ä¼ç»´æ¤è¿æ ·ä¸ä¸ªçº¿ç¨æ¶æ¯éåã(è¿ä¸ªéååªæå¨çº¿ç¨è°ç¨GDIå½æ°æ¶æä¼å建ï¼é»è®¤ä¸å建)ãç¶å线ç¨æ¶æ¯éåä¸çæ¶æ¯ä¼è¢«éå°ç¸åºççªå£è¿ç¨(WndProc)å¤ç.
注æï¼ çº¿ç¨æ¶æ¯éåä¸WM_PAINTï¼WM_TIMERåªæå¨Queueä¸æ²¡æå ¶ä»æ¶æ¯çæ¶åæä¼è¢«å¤çï¼WM_PAINTæ¶æ¯è¿ä¼è¢«å并以æé«æçãå ¶ä»æææ¶æ¯ä»¥å è¿å åºï¼FIFOï¼çæ¹å¼è¢«å¤çã
4 éåæ¶æ¯(Queued Messages)åééåæ¶æ¯(Non-Queued Messages)
1)éåæ¶æ¯(Queued Messages)
æ¶æ¯ä¼å ä¿åå¨æ¶æ¯éåä¸ï¼æ¶æ¯å¾ªç¯ä¼ä»æ¤éåä¸åæ¶æ¯å¹¶ååå°åçªå£å¤ç
å¦é¼ æ ï¼é®çæ¶æ¯ã
2) ééåæ¶æ¯(NonQueued Messages)
æ¶æ¯ä¼ç»è¿ç³»ç»æ¶æ¯éåå线ç¨æ¶æ¯éåç´æ¥åéå°çªå£è¿ç¨è¢«å¤ç
å¦ï¼ WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSORï¼ WM_WINDOWPOSCHANGED
注æ: postMessageåéçæ¶æ¯æ¯éåæ¶æ¯ï¼å®ä¼ææ¶æ¯Postå°æ¶æ¯éåä¸ï¼ SendMessageåéçæ¶æ¯æ¯ééåæ¶æ¯ï¼ 被ç´æ¥éå°çªå£è¿ç¨å¤ç
5 Windowsæ¶æ¯å½æ°
1ï¼PostMessage(PostThreadMessage), SendMessage
PostMessage:ææ¶æ¯æ¾å°æå®çªå£æå¨ç线ç¨æ¶æ¯éåä¸åç«å³è¿åã PostThreadMessageï¼ææ¶æ¯æ¾å°æå®çº¿ç¨çæ¶æ¯éåä¸åç«å³è¿åã
SendMessageï¼ç´æ¥ææ¶æ¯éå°çªå£è¿ç¨å¤çï¼ å¤çå®äºæè¿åã
2ï¼GetMessage, PeekMessage
PeekMessageä¼ç«å³è¿å å¯ä»¥ä¿çæ¶æ¯
GetMessageå¨ææ¶æ¯æ¶è¿å ä¼å é¤æ¶æ¯
3ï¼ TranslateMessage, TranslateAccelerator
TranslateMessage: æä¸ä¸ªvirtual-keyæ¶æ¯è½¬åæå符æ¶æ¯(character message)ï¼å¹¶æ¾å°å½å线ç¨çæ¶æ¯éåä¸ï¼æ¶æ¯å¾ªç¯ä¸ä¸æ¬¡ååºå¤çã
TranslateAccelerator: å°å¿«æ·é®å¯¹åºå°ç¸åºçèåå½ä»¤ãå®ä¼æWM_KEYDOWN æ WM_SYSKEYDOWN转åæå¿«æ·é®è¡¨ä¸ç¸åºçWM_COMMAND æWM_SYSCOMMANDæ¶æ¯ï¼ ç¶åæ转ååç WM_COMMANDæWM_SYSCOMMANDç´æ¥åéå°çªå£è¿ç¨å¤çï¼ å¤çå®åæä¼è¿åã
6æ¶æ¯æ»é( Message Deadlocks
å设æ线ç¨AåBï¼ ç°å¨æ以ä¸ä¸æ¥éª¤
1ï¼ çº¿ç¨A SendMessageç»çº¿ç¨B, Açå¾ æ¶æ¯å¨çº¿ç¨Bä¸å¤çåè¿å
2ï¼çº¿ç¨Bæ¶å°äºçº¿ç¨Aåæ¥çæ¶æ¯ï¼å¹¶è¿è¡å¤çï¼ å¨å¤çè¿ç¨ä¸ï¼Bä¹å线ç¨A SendMessgaeï¼ç¶åçå¾ ä»Aè¿åã
å 为æ¤æ¶ï¼ 线ç¨Aæ£çå¾ ä»çº¿ç¨Bè¿åï¼ æ æ³å¤çBåæ¥çæ¶æ¯ï¼ ä»è导è´äº\线ç¨A,Bç¸äºçå¾ ï¼ å½¢ææ»éãå¤ä¸ªçº¿ç¨ä¹å¯ä»¥å½¢æç¯å½¢æ»éã
å¯ä»¥ä½¿ç¨ SendNotifyMessageæSendMessageTimeoutæ¥é¿å åºç°æ»éã
7 BroadcastSystemMessage
æ们ä¸è¬ææ¥è§¦å°çæ¶æ¯é½æ¯åéç»çªå£çï¼ å ¶å®ï¼ æ¶æ¯çæ¥æ¶è å¯ä»¥æ¯å¤ç§å¤æ ·çï¼å®å¯ä»¥æ¯åºç¨ç¨åº(applications), å¯å®è£ 驱å¨(installable drivers), ç½ç»è®¾å¤(network drivers), ç³»ç»çº§è®¾å¤é©±å¨(system-level device drivers)çï¼
BroadcastSystemMessageè¿ä¸ªAPIå¯ä»¥å¯¹ä»¥ä¸ç³»ç»ç»ä»¶åéæ¶æ¯ã
é£ä¹è¿äºæ¶æ¯æ¯ææ ·ä¼ éçå¢ãæ们以MFC为ä¾æ¥çä¸ä¸æ¶æ¯ä¼ éè¿ç¨ã
åãMFCæ¶æ¯æºå¶
å¨Windowsåºç¨ç¨åºç主å½æ°ä¸ï¼é¦å è¦æ³¨åçªå£ç±»ï¼ç¶åå建并æ¾ç¤ºçªå£ãå建çªå£åç¨åºå°±è¿å ¥æ¶æ¯å¾ªç¯ï¼å¨æ¶æ¯å¾ªç¯ä¸ï¼ç¨åºä¸æå°è·å¾æ¶æ¯å¹¶å°æ¶æ¯æ´¾éç»å¯¹åºççªå£å½æ°è¿è¡å¤çã
æ们å¯ä»¥çå°ï¼å¨MFCçæ¡æ¶ç»æä¸ï¼å¯ä»¥è¿è¡æ¶æ¯å¤ççç±»ç头æ件éé¢
é½ä¼å«æDECLARE_MESSAGE_MAP()å®,è¿é主è¦è¿è¡æ¶æ¯æ å°åæ¶æ¯å¤çå½æ°ç声
æãå¯ä»¥è¿è¡æ¶æ¯å¤ççç±»çå®ç°æ件éä¸è¬é½å«æå¦ä¸çç»æã
BEGIN_MESSAGE_MAP(CInheritClass, CBaseClass) //{{AFX_MSG_MAP(CInheritClass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
è¿é主è¦è¿è¡æ¶æ¯æ å°çå®ç°åæ¶æ¯å¤çå½æ°çå®ç°ã
ææè½å¤è¿è¡æ¶æ¯å¤ççç±»é½æ¯åºäºCCmdTargetç±»çï¼ä¹å°±æ¯è¯´CCmdTarget
ç±»æ¯ææå¯ä»¥è¿è¡æ¶æ¯å¤çç±»çç¶ç±»ãCCmdTargetç±»æ¯MFCå¤çå½ä»¤æ¶æ¯çåºç¡åæ ¸å¿ã
åæ¶MFCå®ä¹äºä¸é¢ç两个主è¦ç»æ:
AFX_MSGMAP_ENTRY
struct AFX_MSGMAP_ENTRY
{//âââ//
};
åAFX_MSGMAP
struct AFX_MSGMAP
{//âââ`//
};
å ¶ä¸AFX_MSGMAP_ENTRYç»æå å«äºä¸ä¸ªæ¶æ¯çææç¸å ³ä¿¡æ¯, èAFX_MSGMAP主è¦ä½ç¨æ¯ä¸¤ä¸ªï¼ä¸ï¼ç¨æ¥å¾å°åºç±»çæ¶æ¯æ å°å ¥å£å°åãäºï¼å¾å°æ¬èº«çæ¶æ¯æ å°å ¥å£å°åã
å®é ä¸ï¼MFCæææçæ¶æ¯ä¸æ¡æ¡å¡«å ¥å°AFX_MSGMAP_ENTRYç»æä¸å»ï¼å½¢æä¸ä¸ªæ°ç»ï¼è¯¥æ°ç»åæ¾äºææçæ¶æ¯åä¸å®ä»¬ç¸å ³çæ¶æ¯çåæ°ãåæ¶éè¿AFX_MSGMAPè½å¾å°è¯¥æ°ç»çé¦å°åï¼åæ¶ä¹å¾å°åºç±»çæ¶æ¯æ å°å ¥å£å°åï¼è¿æ¯ä¸ºä¾å½æ¬èº«å¯¹è¯¥æ¶æ¯ä¸ååºçæ¶åï¼å°±è°ç¨å ¶åºç±»çæ¶æ¯ååºã
ç°å¨æ们æ¥åæMFCæ¯å¦ä½è®©çªå£è¿ç¨æ¥å¤çæ¶æ¯çï¼å®é ä¸ææMFCççªå£ç±»é½éè¿é©åå½æ°_AfxCbtFilterHookæªè·æ¶æ¯ï¼å¹¶ä¸å¨é©åå½æ°_AfxCbtFilterHookä¸æçªå£è¿ç¨è®¾å®ä¸ºAfxWndProcãåæ¥ççªå£è¿ç¨ä¿åå¨æååém_pfnSuperä¸
1.MFCæ¡æ¶ä¸ï¼æ¥æ¶å¤çæ¥èªWindowsæ¶æ¯çè¿ç¨ï¼
2.MFCå é¨æ¶æ¯å¤çæ¹å¼
MFCæ¥æ¶ä¸ä¸ªå¯éçæ¶æ¯ï¼
MFCå¤çä¸ä¸ªå¯éååéæ¶æ¯çæä¸ææ¾ä¸åæ¯å¯éçæ¶æ¯è¦ååºç¨ç¨åºçæ¶æ¯éåä¸è±è´¹ä¸äºæ¶é´ãå¨æ¶æ¯æ³µï¼message pumpï¼å¼¹åºå®ä¹åï¼å®è¦ä¸ç´å¨éåä¸ãä¸é¢æ¯ææ ·æ¥åå¯éæ¶æ¯çè¿ç¨ãMFCåºç¨ç¨åºä¸çæ¶æ¯æ³µå¨CWinAppçæåå½æ°Runï¼ï¼ä¸ãåºç¨ç¨åºå¼å§è¿è¡æ¶ï¼Run()就被è°ç¨,Run()ææ¶é´åå²æ两é¨åãä¸é¨åç¨æ¥æ§è¡åå°å¤çï¼å¦åæ¶ä¸´æ¶CWnd对象ï¼å¦ä¸é¨åç¨æ¥æ£æ¥æ¶æ¯éåãå½ä¸ä¸ªæ°çæ¶æ¯è¿æ¥æ¶ï¼Run()æ½åå®âå³ç¨GetMessage( )ä»éåä¸ååºè¯¥æ¶æ¯ï¼è¿è¡PreTranslateMessage( )å::TranslateMessage( )两个æ¶æ¯ç¿»è¯å½æ°ï¼ç¶åç¨DispatchMessage( )å½æ°è°ç¨è¯¥æ¶æ¯é¢æçç®æ çªå£è¿ç¨ãå¦ä¸å¾ã
æ们ç¨ä¸ä¸ªå®ä¾å½æ°Aåéæ¶æ¯å°å½æ°Bçè¿ç¨æ¥çä¸ä¸MFCå é¨æ¶æ¯å¤çè¿ç¨ã
1. é¦å å½æ°Aåºè·åæ¶æ¯çCWnd类对象çæéï¼ç¶åï¼è°ç¨CWndçæåå½æ°SendMessageï¼ï¼ã
LRESULT Res=pWnd->SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam);
pWndæéæåç®æ CWnd类对象ãåéMsgæ¯æ¶æ¯ï¼wParamålParamåéå å«æ¶æ¯çåæ°ï¼å¦é¼ æ ååå»åªéæéæ©äºä»ä¹èå项ãç®æ çªå£è¿åçæ¶æ¯ç»ææ¾å¨åéResä¸ã
åéæ¶æ¯å°ä¸ä¸ªæ²¡æCWndçå½æ°å¯¹è±¡ççªå£ï¼å¯ä»¥ç¨ä¸åç®æ çªå£çå¥æç´æ¥è°ç¨Windows APIï¼
LRESULT Res=::SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
è¿éçhWndæ¯ç®æ çªå£çå¥æã
å¦ææ¯å¼æ¥ä¼ è¾ä¹å¯ä½¿ç¨PostMessageï¼ï¼ï¼æ¶æ¯åä¸ç¸åï¼ä½è¿åå¼Resä¸ä¸æ ·ï¼Resä¸æ¯ä¸ä¸ªç±ç®æ çªä½è¿åçå¼ï¼èæ¯ä¸ä¸ªå¸å°å¼ï¼ç¨æ¥è¡¨ç¤ºæ¶æ¯æ¯å¦æåçæ¾å°æ¶æ¯éåä¸ã
2. æ£å¸¸æ åµä¸ï¼ä¸æ¦æ¶æ¯è¢«åéåï¼åºç¨ç¨åºåå°ä¼èªå¨çå°å®åéï¼ä½æ¯å¨ç¹æ®æ åµä¸ï¼éè¦ä½ èªå·±å»å é¤ä¸ä¸ªæ¶æ¯ï¼ä¾å¦æ³å¨åºç¨ç¨åºæ¥æ¶å°æç§æ¶æ¯ä¹ååæ¢åºç¨ç¨åºãæ两ç§æ¹æ³å¯ä»¥ä»åºç¨ç¨åºæ¶æ¯éåä¸å é¤ä¸ä¸ªæ¶æ¯ï¼ä½è¿ä¸¤ç§æ¹æ³é½æ²¡ææ¶åMFCã
第ä¸ç§æ¹æ³ï¼å¨ä¸å¹²æ°ä»»ä½äºæ ä¹ä¸çª¥è§æ¶æ¯éåï¼ççä¸ä¸ªæ¶æ¯æ¯å¦å¨é£éã
BOOL res=::PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ) ;
第äºç§æ¹æ³ï¼å®é ä¸æ¯çå¾ ï¼ä¸ç´çå°ä¸ä¸ªæ°çæ¶æ¯å°è¾¾éå为æ¢ï¼ç¶åå é¤å¹¶è¿å该æ¶æ¯ã
BOOL res=::GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
å¨è¿ä¸¤ç§æ¹æ³ä¸ï¼åéhWndæå®è¦æªè·æ¶æ¯ççªå£ï¼å¦æ该åé设为NULLï¼ææçªå£æ¶æ¯å°è¢«æªè·ãwMsgFilterMinåwMsgFilterMaxåéä¸SendMessage( )ä¸çåéMsgç¸å¯¹åºï¼æå®æ¥çæ¶æ¯çèå´ãå¦æç¨â0,0ãï¼åææçæ¶æ¯é½å°è¢«æªè·ãå¦æç¨WM_KEYFIRST,WM_KEYLASTæWM_MOUSEFIRST,WM_MOUSELASTï¼åææé®çæé¼ æ çæ¶æ¯å°è¢«æªè·ãwRemoveMsgåéæå®PeekMessage( )æ¯å¦åºè¯¥çæ£å°ä»éåä¸å é¤è¯¥æ¶æ¯ã(GetMessage( )æ»æ¯å é¤æ¶æ¯)ã该åéå¯ä»¥å两个å¼ï¼
PM_REMOVEï¼PeekMessage( )å°å é¤æ¶æ¯ã
PM_NOREMOVEï¼PeekMessage( )å°ææ¶æ¯çå¨éåéï¼å¹¶è¿åå®çä¸ä¸ªæ·è´ã
å½ç¶ï¼å¦æææ¶æ¯çå¨æ¶æ¯éåä¸ï¼ç¶åå次è°ç¨PeekMessage( )æ¥çç¸åç±»åçæ¶æ¯ï¼åå°è¿åå®å ¨ç¸åçæ¶æ¯ã
lpMsgåéæ¯ä¸ä¸ªæåMSGç»æçæéï¼MSGå å«æ£ç´¢å°çæ¶æ¯ã
typedef struct tagMSG {
HWND hwnd; // window handle message is intended for
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time; // the time the message was put in the queue
POINT pt; // the location of the mouse cursor when the
// message was put in the queue
} MSG;
3. æ¶æ¯ä¼å°æ¶æ¯éåä¸ãCwinAppçæåå½æ°Runï¼å¨åºç¨ç¨åºè¿è¡æ¶ï¼Runå°±ææ¶é´åå²æ两é¨åï¼ä¸é¨åæ§è¡åå°çå¤çï¼å¦ä¸é¨åæ¥æ£æ¥æ¶æ¯çéåï¼å½åç°æ°æ¶æ¯æ¶ï¼Runå°±è°ç¨GetMessageï¼ï¼ä»éåæ¶æ¯ä¸ååºè¯¥æ¶æ¯ã
3.è¿è¡ä¸¤ä¸ªæ¶æ¯ç¿»è¯å½æ°PreTranslateMessageï¼ï¼åï¼ï¼TranslateMessageï¼ï¼ï¼è¿è¡ç¿»è¯ã主è¦æ¾å°å½æ°å¯¹è±¡çä½ç½®ãæ¶æ¯çå¨ä½æ è¯åè·æ¶æ¯ç¸å ³çæ§è¡æä½ã
4.ç¨DispatchMessageï¼ï¼å½æ°è°ç¨è¯¥æ¶æ¯é¢æçå½æ°Bè¿ç¨ï¼è¿è¡æ§è¡ã
äºãWindowsæ¶æ¯æºå¶çæ¦å¿µ
1ãDOSä¸Windows驱å¨æºå¶çåºå«
2ãæ¶æ¯
3ãæ¶æ¯çæ¥æº
4ãWindowsçæ¶æ¯ç³»ç»çç»æ
5ãæ¶æ¯çååº
ä¸ãWindowsæ¶æ¯æºå¶è¦ç¹
1. çªå£è¿ç¨
2 æ¶æ¯ç±»å
3æ¶æ¯éå(Message Queues)
4 éåæ¶æ¯åééåæ¶æ¯
5 Windowsæ¶æ¯å½æ°
6æ¶æ¯æ»é( Message Deadlocks
7 BroadcastSystemMessage
åãMFCæ¶æ¯æºå¶
1.MFCæ¡æ¶ä¸ï¼æ¥æ¶å¤çæ¥èªWindowsæ¶æ¯çè¿ç¨
2.MFCå é¨æ¶æ¯å¤çæ¹å¼
ä¸ã å¼è¨
å¨ C++ç¨åºæ¶æ ä¸æä¸ï¼æ们çå°ï¼ç¨åºæ¯ç±ä¸äºå±æ¬¡å模åç»æçï¼é£ä¹ï¼è¿äºæ¨¡åä¹é´ï¼ 以åä½ çç¨åºåwindows ä¹é´ï¼æ¯å¦ä½ä¼ éä¿¡æ¯å¢ï¼å¨windows çå¹³å°ä¸ï¼ä¼ éä¿¡æ¯æ¯ç± windows message æ¶æ¯æºå¶æ¥è´è´£çï¼è¿æ¯Windows çæ ¸å¿é¨åã
æ¶æ¯å æ¬æ°æ®åæ令ã
äºãWindowsæ¶æ¯æºå¶çæ¦å¿µ
1ãDOSä¸Windows驱å¨æºå¶çåºå«
1ï¼DOSæ¯è¿ç¨é©±å¨çã
ä¼ ç»çMS-DOSç¨åºä¸»è¦éç¨é¡ºåºçãå ³èçãè¿ç¨é©±å¨çç¨åºè®¾è®¡æ¹æ³ãä¸ä¸ªè¿ç¨æ¯ä¸ç³»åé¢å å®ä¹å¥½çæä½åºåçç»åï¼å®å ·æä¸å®çå¼å¤´ãä¸é´è¿ç¨åç»æãç¨åºç´æ¥æ§å¶ç¨åºäºä»¶åè¿ç¨ç顺åºãè¿æ ·çç¨åºè®¾è®¡æ¹æ³æ¯é¢åç¨åºèä¸æ¯é¢åç¨æ·çï¼äº¤äºæ§å·®ï¼ç¨æ·çé¢ä¸å¤å好ï¼å 为å®å¼ºè¿«ç¨æ·æç §æç§ä¸å¯æ´æ¹ç模å¼è¿è¡å·¥ä½ãå®çåºæ¬æ¨¡åå¦å¾1.1æ示ã
2ï¼Windowsæ¯äºä»¶ï¼æ¶æ¯ï¼é©±å¨
äºä»¶é©±å¨ç¨åºè®¾è®¡æ¯ä¸ç§å ¨æ°çç¨åºè®¾è®¡æ¹æ³ï¼å®ä¸æ¯ç±äºä»¶ç顺åºæ¥æ§å¶ï¼èæ¯ç±äºä»¶çåçæ¥æ§å¶ï¼èè¿ç§äºä»¶çåçæ¯éæºçãä¸ç¡®å®çï¼å¹¶æ²¡æé¢å®ç顺åºï¼è¿æ ·å°±å 许ç¨åºççç¨æ·ç¨åç§åçç顺åºæ¥å®æç¨åºçæµç¨ã对äºéè¦ç¨æ·äº¤äºçåºç¨ç¨åºæ¥è¯´ï¼äºä»¶é©±å¨çç¨åºè®¾è®¡æçè¿ç¨é©±å¨æ¹æ³æ æ³æ¿ä»£çä¼ç¹ãå®æ¯ä¸ç§é¢åç¨æ·çç¨åºè®¾è®¡æ¹æ³ï¼å®å¨ç¨åºè®¾è®¡è¿ç¨ä¸é¤äºå®ææéåè½ä¹å¤ï¼æ´å¤çèèäºç¨æ·å¯è½çåç§è¾å ¥ï¼å¹¶é对æ§ç设计ç¸åºçå¤çç¨åºãå®æ¯ä¸ç§â被å¨âå¼ç¨åºè®¾è®¡æ¹æ³ï¼ç¨åºå¼å§è¿è¡æ¶ï¼å¤äºçå¾ ç¨æ·è¾å ¥äºä»¶ç¶æï¼ç¶ååå¾äºä»¶å¹¶ä½åºç¸åºååºï¼å¤çå®æ¯åè¿å并å¤äºçå¾ äºä»¶ç¶æãå®çæ¡å¾å¦å¾1.2æ示:
2ãæ¶æ¯
Windowsç³»ç»æ¯ä¸ä¸ªäºä»¶é©±å¨çOSï¼æ¯ä¸ä¸ªäºä»¶çåçé½ä¼äº§çä¸ä¸ªæ¶æ¯ï¼æ们éè¿æ¶æ¯æ¥ç¥éåçäºä»ä¹äºä»¶ï¼äºè§£äºä»¶ï¼è¿è解å³äºä»¶ãä»ä¹æ¯æ¶æ¯å¢ï¼å¾é¾ä¸ä¸ä¸ªå®ä¹ï¼ä¸é¢ä»ä¸åçå 个æ¹é¢è®²è§£ä¸ä¸ï¼
1ï¼ æ¶æ¯çç»æï¼ä¸ä¸ªæ¶æ¯ç±ä¸ä¸ªæ¶æ¯å称ï¼UINTï¼ï¼å两个åæ°ï¼WPARAMï¼LPARAMï¼ãå½ç¨æ·è¿è¡äºè¾å ¥ææ¯çªå£çç¶æåçæ¹åæ¶ç³»ç»é½ä¼åéæ¶æ¯å°æä¸ä¸ªçªå£ãä¾å¦å½èå转ä¸ä¹åä¼æWM_COMMANDæ¶æ¯åéï¼WPARAMçé«åä¸ï¼HIWORD(wParam)ï¼æ¯å½ä»¤çIDå·ï¼å¯¹èåæ¥è®²å°±æ¯èåIDãå½ç¶ç¨æ·ä¹å¯ä»¥å®ä¹èªå·±çæ¶æ¯å称ï¼ä¹å¯ä»¥å©ç¨èªå®ä¹æ¶æ¯æ¥åééç¥åä¼ éæ°æ®ã
2ï¼è°å°æ¶å°æ¶æ¯ï¼ä¸ä¸ªæ¶æ¯å¿ é¡»ç±ä¸ä¸ªçªå£æ¥æ¶ãå¨çªå£çè¿ç¨ï¼WNDPROCï¼ä¸å¯ä»¥å¯¹æ¶æ¯è¿è¡åæï¼å¯¹èªå·±æå ´è¶£çæ¶æ¯è¿è¡å¤çãä¾å¦ä½ å¸æ对èåéæ©è¿è¡å¤çé£ä¹ä½ å¯ä»¥å®ä¹å¯¹WM_COMMANDè¿è¡å¤çç代ç ï¼å¦æå¸æå¨çªå£ä¸è¿è¡å¾å½¢è¾åºå°±å¿ 须对WM_PAINTè¿è¡å¤çã
3ï¼æªå¤ççæ¶æ¯å°é£éå»äºï¼M$为çªå£ç¼åäºé»è®¤ççªå£è¿ç¨ï¼è¿ä¸ªçªå£è¿ç¨å°è´è´£å¤çé£äºä½ ä¸å¤çæ¶æ¯ãæ£å 为æäºè¿ä¸ªé»è®¤çªå£è¿ç¨æ们æå¯ä»¥å©ç¨Windowsççªå£è¿è¡å¼åèä¸å¿ è¿å¤å ³æ³¨çªå£åç§æ¶æ¯çå¤çãä¾å¦çªå£å¨è¢«æå¨æ¶ä¼æå¾å¤æ¶æ¯åéï¼èæ们é½å¯ä»¥ä¸äºçç¬è®©ç³»ç»èªå·±å»å¤çã
4ï¼çªå£å¥æï¼è¯´å°æ¶æ¯å°±ä¸è½ä¸è¯´çªå£å¥æï¼ç³»ç»éè¿çªå£å¥ææ¥å¨æ´ä¸ªç³»ç»ä¸å¯ä¸æ è¯ä¸ä¸ªçªå£ï¼åéä¸ä¸ªæ¶æ¯æ¶å¿ é¡»æå®ä¸ä¸ªçªå£å¥æ表æ该æ¶æ¯ç±é£ä¸ªçªå£æ¥æ¶ãèæ¯ä¸ªçªå£é½ä¼æèªå·±ççªå£è¿ç¨ï¼æ以ç¨æ·çè¾å ¥å°±ä¼è¢«æ£ç¡®çå¤çãä¾å¦æ两个çªå£å ±ç¨ä¸ä¸ªçªå£è¿ç¨ä»£ç ï¼ä½ å¨çªå£ä¸ä¸æä¸é¼ æ æ¶æ¶æ¯å°±ä¼éè¿çªå£ä¸çå¥æ被åéå°çªå£ä¸èä¸æ¯çªå£äºã
3ãæ¶æ¯çæ¥æº
äºä»¶é©±å¨å´ç»çæ¶æ¯ç产çä¸å¤çå±å¼ï¼ä¸æ¡æ¶æ¯æ¯å ³äºåççäºä»¶çæ¶æ¯ãäºä»¶é©±å¨æ¯é æ¶æ¯å¾ªç¯æºå¶æ¥å®ç°çãä¹å¯ä»¥ç解为æ¶æ¯æ¯ä¸ç§æ¥åæå ³äºä»¶åççéç¥ã
Windowsåºç¨ç¨åºçæ¶æ¯æ¥æºæä¸ä¸åç§ï¼
1ï¼è¾å ¥æ¶æ¯ï¼å æ¬é®çåé¼ æ çè¾å ¥ãè¿ä¸ç±»æ¶æ¯é¦å æ¾å¨ç³»ç»æ¶æ¯éåä¸ï¼ç¶åç±Windowså°å®ä»¬éå ¥åºç¨ç¨åºæ¶æ¯éåä¸ï¼ç±åºç¨ç¨åºæ¥å¤çæ¶æ¯ã
2ï¼æ§å¶æ¶æ¯ï¼ç¨æ¥ä¸Windowsçæ§å¶å¯¹è±¡ï¼å¦å表æ¡ãæé®ãæ£æ¥æ¡çè¿è¡ååéä¿¡ãå½ç¨æ·å¨å表æ¡ä¸æ¹å¨å½åéæ©ææ¹åäºæ£æ¥æ¡çç¶ææ¶ååºæ¤ç±»æ¶æ¯ãè¿ç±»æ¶æ¯ä¸è¬ä¸ç»è¿åºç¨ç¨åºæ¶æ¯éåï¼èæ¯ç´æ¥åéå°æ§å¶å¯¹è±¡ä¸å»ã
3ï¼ç³»ç»æ¶æ¯ï¼å¯¹ç¨åºåçäºä»¶æç³»ç»æ¶éä¸æä½åºååºãä¸äºç³»ç»æ¶æ¯ï¼è±¡DDEæ¶æ¯ï¼å¨ææ°æ®äº¤æ¢æ¶æ¯ï¼è¦éè¿Windowsçç³»ç»æ¶æ¯éåï¼èæçåä¸éè¿ç³»ç»æ¶æ¯éåèç´æ¥éå ¥åºç¨ç¨åºçæ¶æ¯éåï¼å¦å建çªå£æ¶æ¯ã
4ï¼ç¨æ·æ¶æ¯ï¼è¿æ¯ç¨åºåèªå·±å®ä¹å¹¶å¨åºç¨ç¨åºä¸ä¸»å¨ååºçï¼ä¸è¬ç±åºç¨ç¨åºçæä¸é¨åå é¨å¤çã
4ãWindowsçæ¶æ¯ç³»ç»çç»æ
Windowsçæ¶æ¯ç³»ç»ç±ä»¥ä¸3é¨åç»æï¼
æ¶æ¯éåï¼Windowsè½å¤ä¸ºææçåºç¨ç¨åºç»´æ¤ä¸ä¸ªæ¶æ¯éåï¼åºç¨ç¨åºå¿ é¡»ä»æ¶æ¯éåä¸è·å»æ¶æ¯ï¼ç¶ååæ´¾ç»æ个çªä½ã
æ¶æ¯å¾ªç¯ï¼éè¿è¿ä¸ªå¾ªç¯æºå¶ï¼åºç¨ç¨åºä»æ¶æ¯éåä¸æ£ç´¢æ¶æ¯ï¼åæå®åæ´¾ç»éå½ççªå£ï¼ç¶å继ç»ä»æ¶æ¯éåä¸æ£ç´¢ä¸ä¸æ¡æ¶æ¯ï¼ååæ´¾ç»éå½ççªå£ï¼ä¾æ¬¡è¿è¡ã
çªå£è¿ç¨ï¼æ¯ä¸ªçªå£é½æä¸ä¸ªçªå£è¿ç¨ï¼ä»¥æ¥æ¶Windows ä¼ éç»çªå£çæ¶æ¯ï¼çªå£è¿ç¨çä»»å¡å°±æ¯è·åæ¶æ¯å¹¶ä¸ååºå®ãçªå£è¿ç¨æ¯ä¸ä¸ªåè°å½æ°ï¼å¤çå®ä¸ä¸ªæ¶æ¯åï¼é常è¦ç»Windows ä¸ä¸ªè¿åå¼ã
5ãæ¶æ¯çååº
æ¶æ¯ç产çæ¥æºäºç³»ç»äºæ (å æ¬è®¡æ¶å¨äºä»¶)åç¨æ·äºæ ,Windowsç¨æ¶æ¯æ¥è°å ¥åå ³é(è¿æå ¶å®å¤ç,å¦ç»å¶ä¸ä¸ªçªå£ç)åºç¨ç¨åº,ä¸ä¸ªå ¸å表ç°æ¯å¨å ³æºæä½ä¸ï¼Windowsåä¸ä¸ªå ³æºçæ¶æ¯ç»æææ£å¨è¿è¡çåºç¨ç¨åºï¼åç¥å®ä»¬éåºå åï¼æ¤æ¶ï¼åºç¨ç¨åºç¨ååºæ¶æ¯çæ¹æ³æ¥ååºOSï¼å æ¤ï¼æ¶æ¯æ¯åºç¨ç¨åºä¸WinOS交äºçæ段..
æ¶æ¯äº§çå°è¢«çªå£ååºçæ¥éª¤ï¼ï¼å¦ä¸å¾ï¼
1> ç³»ç»åçäºæç¨æ·ååºæ个äºä»¶ã
2> Windowsæè¿ä¸ªäºä»¶ç¿»è¯ä¸ºæ¶æ¯ï¼ç¶åæä»æ¾å°æ¶æ¯éåä¸
3> åºç¨ç¨åºä»æ¶æ¯éåä¸æ¥åå°è¿ä¸ªæ¶æ¯ï¼æä»åæ¾å°TMsgè®°å½ä¸ã
4> åºç¨ç¨åºææ¶æ¯ä¼ éç»ä¸ä¸ªéå½ççªä½è¿ç¨ã
çªä½è¿ç¨ååºè¿ä¸ªæ¶æ¯å¹¶è¿è¡å¤çãææ¶æ¯ä¼ éç»äºè¿ä¸ªçªä½ççªä½å½æ°ã
ä¸ãWindowsæ¶æ¯æºå¶è¦ç¹
1. çªå£è¿ç¨
æ¯ä¸ªçªå£ä¼æä¸ä¸ªç§°ä¸ºçªå£è¿ç¨çåè°å½æ°(WndProc)ï¼å®å¸¦æå个åæ°ï¼åå«ä¸ºï¼çªå£å¥æ(Window Handle),æ¶æ¯ID(Message ID),å两个æ¶æ¯åæ°(wParam, lParam), å½çªå£æ¶å°æ¶æ¯æ¶ç³»ç»å°±ä¼è°ç¨æ¤çªå£è¿ç¨æ¥å¤çæ¶æ¯ãï¼æ以å«åè°å½æ°ï¼
2 æ¶æ¯ç±»å
1) ç³»ç»å®ä¹æ¶æ¯(System-Defined Messages)
å¨SDKä¸äºå å®ä¹å¥½çæ¶æ¯ï¼éç¨æ·å®ä¹çï¼å ¶èå´å¨[0Ã0000, 0Ã03ff]ä¹é´ï¼ å¯ä»¥å为以ä¸ä¸ç±»ï¼
çªå£æ¶æ¯(Windows Message)
ä¸çªå£çå é¨è¿ä½æå ³ï¼å¦å建çªå£ï¼ç»å¶çªå£ï¼éæ¯çªå£çãå¯ä»¥æ¯ä¸è¬ççªå£ï¼å¯ä»¥æ¯ Dialog,æ§ä»¶çã
å¦ï¼WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL..
å½ä»¤æ¶æ¯(Command Message)
ä¸å¤çç¨æ·è¯·æ±æå ³ï¼ å¦åå»èå项æå·¥å ·æ ææ§ä»¶æ¶ï¼ å°±ä¼äº§çå½ä»¤æ¶æ¯ã
WM_COMMAND, LOWORD(wParam)表示èå项ï¼å·¥å ·æ æé®ææ§ä»¶çIDãå¦ææ¯æ§ä»¶, HIWORD(wParam)表示æ§ä»¶æ¶æ¯ç±»å
æ§ä»¶éç¥(Notify Message)
æ§ä»¶éç¥æ¶æ¯ï¼ è¿æ¯æçµæ´»çæ¶æ¯æ ¼å¼ï¼ å ¶Message, wParam, lParamåå«ä¸ºï¼WM_NOTIFY, æ§ä»¶IDï¼æåNMHDRçæéãNMHDRå å«æ§ä»¶éç¥çå å®¹ï¼ å¯ä»¥ä»»ææ©å±ã
2) ç¨åºå®ä¹æ¶æ¯(Application-Defined Messages)
ç¨æ·èªå®ä¹çæ¶æ¯ï¼ 对äºå ¶èå´æå¦ä¸è§å®ï¼
WM_USER: 0Ã0400-0Ã7FFF (ex. WM_USER+10)
WM_APP(winver>4.0): 0Ã8000-0xBFFF (ex.WM_APP+4)
RegisterWindowMessage: 0xC000-0xFFFF
3æ¶æ¯éå(Message Queues)
Windowsä¸æ两ç§ç±»åçæ¶æ¯éå
1) ç³»ç»æ¶æ¯éå(System Message Queue)
è¿æ¯ä¸ä¸ªç³»ç»å¯ä¸çQueueï¼è®¾å¤é©±å¨(mouse, keyboard)ä¼ææä½è¾å ¥è½¬åææ¶æ¯åå¨ç³»ç»éåä¸ï¼ç¶åç³»ç»ä¼ææ¤æ¶æ¯æ¾å°ç®æ çªå£æå¨ç线ç¨çæ¶æ¯éå(thread-specific message queue)ä¸çå¾ å¤ç
2) 线ç¨æ¶æ¯éå(Thread-specific Message Queue)
æ¯ä¸ä¸ªGUI线ç¨é½ä¼ç»´æ¤è¿æ ·ä¸ä¸ªçº¿ç¨æ¶æ¯éåã(è¿ä¸ªéååªæå¨çº¿ç¨è°ç¨GDIå½æ°æ¶æä¼å建ï¼é»è®¤ä¸å建)ãç¶å线ç¨æ¶æ¯éåä¸çæ¶æ¯ä¼è¢«éå°ç¸åºççªå£è¿ç¨(WndProc)å¤ç.
注æï¼ çº¿ç¨æ¶æ¯éåä¸WM_PAINTï¼WM_TIMERåªæå¨Queueä¸æ²¡æå ¶ä»æ¶æ¯çæ¶åæä¼è¢«å¤çï¼WM_PAINTæ¶æ¯è¿ä¼è¢«å并以æé«æçãå ¶ä»æææ¶æ¯ä»¥å è¿å åºï¼FIFOï¼çæ¹å¼è¢«å¤çã
4 éåæ¶æ¯(Queued Messages)åééåæ¶æ¯(Non-Queued Messages)
1)éåæ¶æ¯(Queued Messages)
æ¶æ¯ä¼å ä¿åå¨æ¶æ¯éåä¸ï¼æ¶æ¯å¾ªç¯ä¼ä»æ¤éåä¸åæ¶æ¯å¹¶ååå°åçªå£å¤ç
å¦é¼ æ ï¼é®çæ¶æ¯ã
2) ééåæ¶æ¯(NonQueued Messages)
æ¶æ¯ä¼ç»è¿ç³»ç»æ¶æ¯éåå线ç¨æ¶æ¯éåç´æ¥åéå°çªå£è¿ç¨è¢«å¤ç
å¦ï¼ WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSORï¼ WM_WINDOWPOSCHANGED
注æ: postMessageåéçæ¶æ¯æ¯éåæ¶æ¯ï¼å®ä¼ææ¶æ¯Postå°æ¶æ¯éåä¸ï¼ SendMessageåéçæ¶æ¯æ¯ééåæ¶æ¯ï¼ 被ç´æ¥éå°çªå£è¿ç¨å¤ç
5 Windowsæ¶æ¯å½æ°
1ï¼PostMessage(PostThreadMessage), SendMessage
PostMessage:ææ¶æ¯æ¾å°æå®çªå£æå¨ç线ç¨æ¶æ¯éåä¸åç«å³è¿åã PostThreadMessageï¼ææ¶æ¯æ¾å°æå®çº¿ç¨çæ¶æ¯éåä¸åç«å³è¿åã
SendMessageï¼ç´æ¥ææ¶æ¯éå°çªå£è¿ç¨å¤çï¼ å¤çå®äºæè¿åã
2ï¼GetMessage, PeekMessage
PeekMessageä¼ç«å³è¿å å¯ä»¥ä¿çæ¶æ¯
GetMessageå¨ææ¶æ¯æ¶è¿å ä¼å é¤æ¶æ¯
3ï¼ TranslateMessage, TranslateAccelerator
TranslateMessage: æä¸ä¸ªvirtual-keyæ¶æ¯è½¬åæå符æ¶æ¯(character message)ï¼å¹¶æ¾å°å½å线ç¨çæ¶æ¯éåä¸ï¼æ¶æ¯å¾ªç¯ä¸ä¸æ¬¡ååºå¤çã
TranslateAccelerator: å°å¿«æ·é®å¯¹åºå°ç¸åºçèåå½ä»¤ãå®ä¼æWM_KEYDOWN æ WM_SYSKEYDOWN转åæå¿«æ·é®è¡¨ä¸ç¸åºçWM_COMMAND æWM_SYSCOMMANDæ¶æ¯ï¼ ç¶åæ转ååç WM_COMMANDæWM_SYSCOMMANDç´æ¥åéå°çªå£è¿ç¨å¤çï¼ å¤çå®åæä¼è¿åã
6æ¶æ¯æ»é( Message Deadlocks
å设æ线ç¨AåBï¼ ç°å¨æ以ä¸ä¸æ¥éª¤
1ï¼ çº¿ç¨A SendMessageç»çº¿ç¨B, Açå¾ æ¶æ¯å¨çº¿ç¨Bä¸å¤çåè¿å
2ï¼çº¿ç¨Bæ¶å°äºçº¿ç¨Aåæ¥çæ¶æ¯ï¼å¹¶è¿è¡å¤çï¼ å¨å¤çè¿ç¨ä¸ï¼Bä¹å线ç¨A SendMessgaeï¼ç¶åçå¾ ä»Aè¿åã
å 为æ¤æ¶ï¼ 线ç¨Aæ£çå¾ ä»çº¿ç¨Bè¿åï¼ æ æ³å¤çBåæ¥çæ¶æ¯ï¼ ä»è导è´äº\线ç¨A,Bç¸äºçå¾ ï¼ å½¢ææ»éãå¤ä¸ªçº¿ç¨ä¹å¯ä»¥å½¢æç¯å½¢æ»éã
å¯ä»¥ä½¿ç¨ SendNotifyMessageæSendMessageTimeoutæ¥é¿å åºç°æ»éã
7 BroadcastSystemMessage
æ们ä¸è¬ææ¥è§¦å°çæ¶æ¯é½æ¯åéç»çªå£çï¼ å ¶å®ï¼ æ¶æ¯çæ¥æ¶è å¯ä»¥æ¯å¤ç§å¤æ ·çï¼å®å¯ä»¥æ¯åºç¨ç¨åº(applications), å¯å®è£ 驱å¨(installable drivers), ç½ç»è®¾å¤(network drivers), ç³»ç»çº§è®¾å¤é©±å¨(system-level device drivers)çï¼
BroadcastSystemMessageè¿ä¸ªAPIå¯ä»¥å¯¹ä»¥ä¸ç³»ç»ç»ä»¶åéæ¶æ¯ã
é£ä¹è¿äºæ¶æ¯æ¯ææ ·ä¼ éçå¢ãæ们以MFC为ä¾æ¥çä¸ä¸æ¶æ¯ä¼ éè¿ç¨ã
åãMFCæ¶æ¯æºå¶
å¨Windowsåºç¨ç¨åºç主å½æ°ä¸ï¼é¦å è¦æ³¨åçªå£ç±»ï¼ç¶åå建并æ¾ç¤ºçªå£ãå建çªå£åç¨åºå°±è¿å ¥æ¶æ¯å¾ªç¯ï¼å¨æ¶æ¯å¾ªç¯ä¸ï¼ç¨åºä¸æå°è·å¾æ¶æ¯å¹¶å°æ¶æ¯æ´¾éç»å¯¹åºççªå£å½æ°è¿è¡å¤çã
æ们å¯ä»¥çå°ï¼å¨MFCçæ¡æ¶ç»æä¸ï¼å¯ä»¥è¿è¡æ¶æ¯å¤ççç±»ç头æ件éé¢
é½ä¼å«æDECLARE_MESSAGE_MAP()å®,è¿é主è¦è¿è¡æ¶æ¯æ å°åæ¶æ¯å¤çå½æ°ç声
æãå¯ä»¥è¿è¡æ¶æ¯å¤ççç±»çå®ç°æ件éä¸è¬é½å«æå¦ä¸çç»æã
BEGIN_MESSAGE_MAP(CInheritClass, CBaseClass) //{{AFX_MSG_MAP(CInheritClass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
è¿é主è¦è¿è¡æ¶æ¯æ å°çå®ç°åæ¶æ¯å¤çå½æ°çå®ç°ã
ææè½å¤è¿è¡æ¶æ¯å¤ççç±»é½æ¯åºäºCCmdTargetç±»çï¼ä¹å°±æ¯è¯´CCmdTarget
ç±»æ¯ææå¯ä»¥è¿è¡æ¶æ¯å¤çç±»çç¶ç±»ãCCmdTargetç±»æ¯MFCå¤çå½ä»¤æ¶æ¯çåºç¡åæ ¸å¿ã
åæ¶MFCå®ä¹äºä¸é¢ç两个主è¦ç»æ:
AFX_MSGMAP_ENTRY
struct AFX_MSGMAP_ENTRY
{//âââ//
};
åAFX_MSGMAP
struct AFX_MSGMAP
{//âââ`//
};
å ¶ä¸AFX_MSGMAP_ENTRYç»æå å«äºä¸ä¸ªæ¶æ¯çææç¸å ³ä¿¡æ¯, èAFX_MSGMAP主è¦ä½ç¨æ¯ä¸¤ä¸ªï¼ä¸ï¼ç¨æ¥å¾å°åºç±»çæ¶æ¯æ å°å ¥å£å°åãäºï¼å¾å°æ¬èº«çæ¶æ¯æ å°å ¥å£å°åã
å®é ä¸ï¼MFCæææçæ¶æ¯ä¸æ¡æ¡å¡«å ¥å°AFX_MSGMAP_ENTRYç»æä¸å»ï¼å½¢æä¸ä¸ªæ°ç»ï¼è¯¥æ°ç»åæ¾äºææçæ¶æ¯åä¸å®ä»¬ç¸å ³çæ¶æ¯çåæ°ãåæ¶éè¿AFX_MSGMAPè½å¾å°è¯¥æ°ç»çé¦å°åï¼åæ¶ä¹å¾å°åºç±»çæ¶æ¯æ å°å ¥å£å°åï¼è¿æ¯ä¸ºä¾å½æ¬èº«å¯¹è¯¥æ¶æ¯ä¸ååºçæ¶åï¼å°±è°ç¨å ¶åºç±»çæ¶æ¯ååºã
ç°å¨æ们æ¥åæMFCæ¯å¦ä½è®©çªå£è¿ç¨æ¥å¤çæ¶æ¯çï¼å®é ä¸ææMFCççªå£ç±»é½éè¿é©åå½æ°_AfxCbtFilterHookæªè·æ¶æ¯ï¼å¹¶ä¸å¨é©åå½æ°_AfxCbtFilterHookä¸æçªå£è¿ç¨è®¾å®ä¸ºAfxWndProcãåæ¥ççªå£è¿ç¨ä¿åå¨æååém_pfnSuperä¸
1.MFCæ¡æ¶ä¸ï¼æ¥æ¶å¤çæ¥èªWindowsæ¶æ¯çè¿ç¨ï¼
2.MFCå é¨æ¶æ¯å¤çæ¹å¼
MFCæ¥æ¶ä¸ä¸ªå¯éçæ¶æ¯ï¼
MFCå¤çä¸ä¸ªå¯éååéæ¶æ¯çæä¸ææ¾ä¸åæ¯å¯éçæ¶æ¯è¦ååºç¨ç¨åºçæ¶æ¯éåä¸è±è´¹ä¸äºæ¶é´ãå¨æ¶æ¯æ³µï¼message pumpï¼å¼¹åºå®ä¹åï¼å®è¦ä¸ç´å¨éåä¸ãä¸é¢æ¯ææ ·æ¥åå¯éæ¶æ¯çè¿ç¨ãMFCåºç¨ç¨åºä¸çæ¶æ¯æ³µå¨CWinAppçæåå½æ°Runï¼ï¼ä¸ãåºç¨ç¨åºå¼å§è¿è¡æ¶ï¼Run()就被è°ç¨,Run()ææ¶é´åå²æ两é¨åãä¸é¨åç¨æ¥æ§è¡åå°å¤çï¼å¦åæ¶ä¸´æ¶CWnd对象ï¼å¦ä¸é¨åç¨æ¥æ£æ¥æ¶æ¯éåãå½ä¸ä¸ªæ°çæ¶æ¯è¿æ¥æ¶ï¼Run()æ½åå®âå³ç¨GetMessage( )ä»éåä¸ååºè¯¥æ¶æ¯ï¼è¿è¡PreTranslateMessage( )å::TranslateMessage( )两个æ¶æ¯ç¿»è¯å½æ°ï¼ç¶åç¨DispatchMessage( )å½æ°è°ç¨è¯¥æ¶æ¯é¢æçç®æ çªå£è¿ç¨ãå¦ä¸å¾ã
æ们ç¨ä¸ä¸ªå®ä¾å½æ°Aåéæ¶æ¯å°å½æ°Bçè¿ç¨æ¥çä¸ä¸MFCå é¨æ¶æ¯å¤çè¿ç¨ã
1. é¦å å½æ°Aåºè·åæ¶æ¯çCWnd类对象çæéï¼ç¶åï¼è°ç¨CWndçæåå½æ°SendMessageï¼ï¼ã
LRESULT Res=pWnd->SendMessage(UINT Msg, WPARAM wParam, LPARAM lParam);
pWndæéæåç®æ CWnd类对象ãåéMsgæ¯æ¶æ¯ï¼wParamålParamåéå å«æ¶æ¯çåæ°ï¼å¦é¼ æ ååå»åªéæéæ©äºä»ä¹èå项ãç®æ çªå£è¿åçæ¶æ¯ç»ææ¾å¨åéResä¸ã
åéæ¶æ¯å°ä¸ä¸ªæ²¡æCWndçå½æ°å¯¹è±¡ççªå£ï¼å¯ä»¥ç¨ä¸åç®æ çªå£çå¥æç´æ¥è°ç¨Windows APIï¼
LRESULT Res=::SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
è¿éçhWndæ¯ç®æ çªå£çå¥æã
å¦ææ¯å¼æ¥ä¼ è¾ä¹å¯ä½¿ç¨PostMessageï¼ï¼ï¼æ¶æ¯åä¸ç¸åï¼ä½è¿åå¼Resä¸ä¸æ ·ï¼Resä¸æ¯ä¸ä¸ªç±ç®æ çªä½è¿åçå¼ï¼èæ¯ä¸ä¸ªå¸å°å¼ï¼ç¨æ¥è¡¨ç¤ºæ¶æ¯æ¯å¦æåçæ¾å°æ¶æ¯éåä¸ã
2. æ£å¸¸æ åµä¸ï¼ä¸æ¦æ¶æ¯è¢«åéåï¼åºç¨ç¨åºåå°ä¼èªå¨çå°å®åéï¼ä½æ¯å¨ç¹æ®æ åµä¸ï¼éè¦ä½ èªå·±å»å é¤ä¸ä¸ªæ¶æ¯ï¼ä¾å¦æ³å¨åºç¨ç¨åºæ¥æ¶å°æç§æ¶æ¯ä¹ååæ¢åºç¨ç¨åºãæ两ç§æ¹æ³å¯ä»¥ä»åºç¨ç¨åºæ¶æ¯éåä¸å é¤ä¸ä¸ªæ¶æ¯ï¼ä½è¿ä¸¤ç§æ¹æ³é½æ²¡ææ¶åMFCã
第ä¸ç§æ¹æ³ï¼å¨ä¸å¹²æ°ä»»ä½äºæ ä¹ä¸çª¥è§æ¶æ¯éåï¼ççä¸ä¸ªæ¶æ¯æ¯å¦å¨é£éã
BOOL res=::PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg ) ;
第äºç§æ¹æ³ï¼å®é ä¸æ¯çå¾ ï¼ä¸ç´çå°ä¸ä¸ªæ°çæ¶æ¯å°è¾¾éå为æ¢ï¼ç¶åå é¤å¹¶è¿å该æ¶æ¯ã
BOOL res=::GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax);
å¨è¿ä¸¤ç§æ¹æ³ä¸ï¼åéhWndæå®è¦æªè·æ¶æ¯ççªå£ï¼å¦æ该åé设为NULLï¼ææçªå£æ¶æ¯å°è¢«æªè·ãwMsgFilterMinåwMsgFilterMaxåéä¸SendMessage( )ä¸çåéMsgç¸å¯¹åºï¼æå®æ¥çæ¶æ¯çèå´ãå¦æç¨â0,0ãï¼åææçæ¶æ¯é½å°è¢«æªè·ãå¦æç¨WM_KEYFIRST,WM_KEYLASTæWM_MOUSEFIRST,WM_MOUSELASTï¼åææé®çæé¼ æ çæ¶æ¯å°è¢«æªè·ãwRemoveMsgåéæå®PeekMessage( )æ¯å¦åºè¯¥çæ£å°ä»éåä¸å é¤è¯¥æ¶æ¯ã(GetMessage( )æ»æ¯å é¤æ¶æ¯)ã该åéå¯ä»¥å两个å¼ï¼
PM_REMOVEï¼PeekMessage( )å°å é¤æ¶æ¯ã
PM_NOREMOVEï¼PeekMessage( )å°ææ¶æ¯çå¨éåéï¼å¹¶è¿åå®çä¸ä¸ªæ·è´ã
å½ç¶ï¼å¦æææ¶æ¯çå¨æ¶æ¯éåä¸ï¼ç¶åå次è°ç¨PeekMessage( )æ¥çç¸åç±»åçæ¶æ¯ï¼åå°è¿åå®å ¨ç¸åçæ¶æ¯ã
lpMsgåéæ¯ä¸ä¸ªæåMSGç»æçæéï¼MSGå å«æ£ç´¢å°çæ¶æ¯ã
typedef struct tagMSG {
HWND hwnd; // window handle message is intended for
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time; // the time the message was put in the queue
POINT pt; // the location of the mouse cursor when the
// message was put in the queue
} MSG;
3. æ¶æ¯ä¼å°æ¶æ¯éåä¸ãCwinAppçæåå½æ°Runï¼å¨åºç¨ç¨åºè¿è¡æ¶ï¼Runå°±ææ¶é´åå²æ两é¨åï¼ä¸é¨åæ§è¡åå°çå¤çï¼å¦ä¸é¨åæ¥æ£æ¥æ¶æ¯çéåï¼å½åç°æ°æ¶æ¯æ¶ï¼Runå°±è°ç¨GetMessageï¼ï¼ä»éåæ¶æ¯ä¸ååºè¯¥æ¶æ¯ã
3.è¿è¡ä¸¤ä¸ªæ¶æ¯ç¿»è¯å½æ°PreTranslateMessageï¼ï¼åï¼ï¼TranslateMessageï¼ï¼ï¼è¿è¡ç¿»è¯ã主è¦æ¾å°å½æ°å¯¹è±¡çä½ç½®ãæ¶æ¯çå¨ä½æ è¯åè·æ¶æ¯ç¸å ³çæ§è¡æä½ã
4.ç¨DispatchMessageï¼ï¼å½æ°è°ç¨è¯¥æ¶æ¯é¢æçå½æ°Bè¿ç¨ï¼è¿è¡æ§è¡ã
温馨提示:答案为网友推荐,仅供参考
第1个回答 2017-06-20
标准windows消息、控制消息、命令消息