草稿--Windows消息机制
生活随笔
收集整理的這篇文章主要介紹了
草稿--Windows消息机制
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
消息本身是作為一個記錄傳遞給應(yīng)用程序的,這個記錄中包含了消息的類型以及其他信息。
MSG含有來自windows應(yīng)用程序消息隊列的消息信息,它在Windows中聲明如下:typedef struct tagMsg{HWND hwnd; // 接受該消息的窗口句柄UINT message; // 消息常量標(biāo)識符,也就是我們通常所說的消息號// 通常是一個與消息有關(guān)的常量值,也可能是窗口或控件的句柄。WPARAM wParam; // 32位消息的特定附加信息,確切含義依賴于消息值// 通常是一個指向內(nèi)存中數(shù)據(jù)的指針。LPARAM lParam; // 32位消息的特定附加信息,確切含義依賴于消息值DWORD time; // 消息創(chuàng)建時的時間POINT pt; // 消息創(chuàng)建時的鼠標(biāo)/光標(biāo)在屏幕坐標(biāo)系中的位置
}MSG;// 注意:由于WParam、lParam和Pointer都是32位的,因此,它們之間可以相互轉(zhuǎn)換。
消息可以由系統(tǒng)或者應(yīng)用程序產(chǎn)生。系統(tǒng)在發(fā)生輸入事件時產(chǎn)生消息。消息的種類:窗口消息: 是系統(tǒng)中最為常見的消息,它是指由操作系統(tǒng)和控制其他窗口的窗口所使用的消息。命令消息: 這是一種特殊的窗口消息,他用來處理從一個窗口發(fā)送到另一個窗口的用戶請求??丶ㄖ? 只適用于標(biāo)準(zhǔn)的窗口控件如按鈕、列表框、組合框、編輯框,以及Windows公共控件如樹狀視圖、列表視圖等。窗口消息及控件通知消息主要由窗口類即直接或間接由CWND類派生類處理。命令消息的處理對象范圍就廣得多,它不僅可以由窗口類處理,還可以由文檔類,文檔模板類及應(yīng)用類所處理。附:控件通知消息:按扭控件BN_CLICKED 用戶單擊了按鈕BN_DISABLE 按鈕被禁止BN_DOUBLECLICKED 用戶雙擊了按鈕BN_HILITE 用/戶加亮了按鈕BN_PAINT 按鈕應(yīng)當(dāng)重畫BN_UNHILITE 加亮應(yīng)當(dāng)去掉組合框控件CBN_CLOSEUP 組合框的列表框被關(guān)閉CBN_DBLCLK 用戶雙擊了一個字符串CBN_DROPDOWN 組合框的列表框被拉出CBN_EDITCHANGE 用戶修改了編輯框中的文本CBN_EDITUPDATE 編輯框內(nèi)的文本即將更新CBN_ERRSPACE 組合框內(nèi)存不足CBN_KILLFOCUS 組合框失去輸入焦點(diǎn)CBN_SELCHANGE 在組合框中選擇了一項(xiàng)CBN_SELENDCANCEL 用戶的選擇應(yīng)當(dāng)被取消CBN_SELENDOK 用戶的選擇是合法的CBN_SETFOCUS 組合框獲得輸入焦點(diǎn)編輯框控件EN_CHANGE 編輯框中的文本己更新EN_ERRSPACE 編輯框內(nèi)存不足EN_HSCROLL 用戶點(diǎn)擊了水平滾動條EN_KILLFOCUS 編輯框正在失去輸入焦點(diǎn)EN_MAXTEXT 插入的內(nèi)容被截斷EN_SETFOCUS 編輯框獲得輸入焦點(diǎn)EN_UPDATE 編輯框中的文本將要更新EN_VSCROLL 用戶點(diǎn)擊了垂直滾動條消息含義列表框控件LBN_DBLCLK 用戶雙擊了一項(xiàng)LBN_ERRSPACE 列表框內(nèi)存不夠LBN_KILLFOCUS 列表框正在失去輸入焦點(diǎn)LBN_SELCANCEL 選擇被取消LBN_SELCHANGE 選擇了另一項(xiàng)LBN_SETFOCUS 列表框獲得輸入焦點(diǎn)消息的發(fā)送:
把一個消息發(fā)送到窗口有3種方式:發(fā)送、寄送和廣播。發(fā)送消息的函數(shù)有SendMessage、SendMessageCallback、SendNotifyMessage、 SendMessageTimeout;寄送消息的函數(shù)主要有PostMessage、PostThreadMessage、 PostQuitMessage;廣播消息的函數(shù)我知道的只有BroadcastSystemMessage、 BroadcastSystemMessageEx。函數(shù)示例:// 發(fā)送消息,會被立即處理,處理完畢后函數(shù)才會返回;
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);解析:這個函數(shù)主要是向一個或多個窗口發(fā)送一條消息,消息被處理后才返回。注意: 如果接收消息的窗口是同一個應(yīng)用程序的一部分,那么這個窗口的窗口函數(shù)就被作為一個子程序馬上被調(diào)用;如果接收消息的窗口是被另外的線程所創(chuàng)建的,那么窗口系統(tǒng)就切換到相應(yīng)的線程并且調(diào)用相應(yīng)的窗口函數(shù),這條消息不會被放進(jìn)目標(biāo)應(yīng)用程序隊列中。函數(shù)的返回值是由接收消息的窗口的窗口函數(shù)返回,返回的值取決于被發(fā)送的消息。// 寄送消息,不會被立即處理,他被放到一個先進(jìn)先出的隊列中,一直等到應(yīng)用程序空線的時候才會被處理,不過函數(shù)放置消息后立即返回。
BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);解析:該函數(shù)把一條消息放置到創(chuàng)建hWnd窗口的線程的消息隊列中,該函數(shù)不等消息被處理就馬上將控制返回。注意: 如果hWnd參數(shù)為HWND_BROADCAST,消息將被寄送給系統(tǒng)中的所有的重疊窗口和彈出窗口,但是子窗口不會收到該消息;如果hWnd參數(shù)為NULL,則該函數(shù)類似于將dwThreadID參數(shù)設(shè)置成當(dāng)前線程的標(biāo)志來調(diào)用PostThreadMEssage函數(shù)。// 廣播消息,
long BroadcastSystemMessage(DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam);解析:該函數(shù)可以向指定的接收者發(fā)送一條消息,這些接收者可以是應(yīng)用程序、可安裝的驅(qū)動程序、網(wǎng)絡(luò)驅(qū)動程序、系統(tǒng)級別的設(shè)備驅(qū)動消息和他們的任意組合。注意:如果dwFlags參數(shù)是BSF_QUERY并且至少一個接收者返回了BROADCAST_QUERY_DENY,則返回值為0;如果沒有指定BSF_QUERY,則函數(shù)將消息發(fā)送給所有接收者,并且忽略其返回值。消息的處理:VC中的消息泵:while(GetMessage(&msg, NULL, 0, 0)){if(!TranslateAccelerator(msg.hWnd, hAccelTable, &msg)){ TranslateMessage(&msg);DispatchMessage(&msg);}}
轉(zhuǎn)載于:https://www.cnblogs.com/xuejianhui/archive/2012/11/14/2770146.html
總結(jié)
以上是生活随笔為你收集整理的草稿--Windows消息机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对方说梦到你怎样幽默的回答
- 下一篇: SAP使用表空间传输异构系统迁移