訊息和訊息處理之訊息迴圈

2021-07-29 01:44:20 字數 1159 閱讀 3881



在win32程式設計中,訊息迴圈是相當重要的乙個概念,看似很難,但使用起來卻是非常簡單。在winmain函式的最後,有下列**:

while (getmessage (&msg, null, 0, 0)) 

windows應用程式可以接收以各種形式輸入的資訊,這包括鍵盤、滑鼠動作、計時器產生的訊息,也可以是其他應用程式發來的訊息等。windows系統自動監控所有的輸入裝置,並將其訊息放入該應用程式的訊息佇列中。

getmessage函式就是用來從應用程式的訊息佇列中按照先進先出的原則將這些訊息乙個個地取出來,放進乙個msg結構中去。它的原型如下:

bool getmessage(       lpmsg   lpmsg,    // 指向乙個msg結構的指標,用來儲存訊息    

hwnd   hwnd,     // 指定哪個視窗的訊息將被獲取    

uint   wmsgfiltermin,  // 指定獲取的主訊息值的最小值    

uint   wmsgfiltermax // 指定獲取的主訊息值的最大值

);getmessage函式用來將獲取的訊息複製到乙個msg結構中。如果佇列中沒有任何訊息,該函式將一直空閒直到佇列中又有訊息時再返回。如果佇列中已有訊息,它將取出乙個後返回。msg結構包含windows訊息的完整資訊,其定義如下:

typedef struct msg, *pmsg;

上述結構中的主訊息表明了訊息的型別,例如,是鍵盤訊息還是滑鼠訊息等,附訊息的含義則依賴於主訊息值,例如,如果主訊息是鍵盤訊息,那麼附訊息中則儲存了是鍵盤的哪個具體鍵的資訊。

事實上,getmessage函式還可以過濾訊息,它的第二個引數是用來指定從哪個視窗的訊息佇列中獲取訊息,其他視窗的訊息將被過濾掉。如果該引數為null,則getmessage從該應用程式執行緒的所有視窗的訊息佇列中獲取訊息。第三個和第四個引數是用來過濾msg結構中主訊息值的,主訊息值在wmsgfiltermin和wmsgfiltermax之外的訊息將被過濾掉。如果這兩個引數為0,則表示接收所有訊息。

特別地,當且僅當getmessage函式在獲取到wm_quit訊息後,將返回0值,於是程式退出訊息迴圈。

translatemessage函式的作用是把虛擬鍵訊息轉換到字元訊息,以滿足鍵盤輸入的需要。dispatchmessage函式所完成的工作是把當前的訊息傳送到對應的視窗過程中去。

用訊息對映處理訊息迴圈

為乙個vc程式新增乙個事件,那麼平台會自動生成時間處理的函式,我們只需要在裡面加 就可以了。比如新增wm lbuttondown大家都知道windows程式是事件驅動,每乙個事件都需要乙個函式來與之對應,也就是通過訊息迴圈在訊息佇列中來檢測事件,然後通過 函式來處理這一事件。那麼mfc是如何鏈結到這...

Wpf訊息迴圈之訊息傳遞

幾天遇見乙個問題需要檢查某個wpf程式是否已經執行,如果沒有執行則啟動傳遞引數,如果已執行則需要直接傳遞訊息。在沒有執行 情況下傳遞引數很簡單,我們只需要process cmd視窗啟動並傳遞引數,在程式中處理。但是如果程式已經啟動有點麻煩,憑著我曾winform的經驗第一時間想到的是win32 ap...

VC訊息處理之訊息對映

訊息的傳遞與傳送是windows應用程式的核心所在,任何事件的觸發與響應均要通過訊息的作用才能得以完成。在sdk程式設計中,對訊息的獲取與分發主要是 通過訊息迴圈來完成的,而在mfc程式設計中則是通過採取訊息對映的方式對其進行處理的。相比而言,這樣的處理方式要簡單許多,這也是符合物件導向程式設計中盡...