GetMessage和PeekMessage的區別

2021-07-02 16:32:51 字數 1616 閱讀 5693

在win32中使用getmessage和peekmessage都可以獲取對應該程式產生的訊息。

他們有什麼區別呢?

getmessage的一般用法是getmessage(&msg,null,0,0);

這樣可以接受所有的訊息,getmessage在沒有產生訊息的時候並不返回,

而是一直在等待,直到乙個訊息返回;

當訊息不是wm_quit時,返回乙個非零值,也就是說,當是wm_quit時會返回乙個零。

如果你在使用中如下使用:

while(true)

則會出現問題,什麼問題呢,就是你結束程式時,視窗是結束了。

但是你去任務管理器裡看,還能看到那個程序。

所以正確的用法應是:

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

peekmessage不管有沒有訊息都會返回乙個值,有訊息是非零值,沒有訊息則是零值。

所以如果上面**用peekmessage的話就不會出現這樣的問題了。

在使用peekmessage的時候需要指定對訊息的處理方法,一般使用pm_remove,即刪除訊息。

peekmessage(&msg,null,0,0,pm_remove);

使用這個函式乙個問題是他會一直占用你的cpu,因為一般情況下我們會一直讓他迴圈,

而這個函式就會一直不停的取訊息。

當然這兩個函式各有各的好處,peekmessage可以在沒有輸入訊息的時候也處理一些事情。

關於這個兩個函式的詳細資訊:

bool getmessage(

lpmsg lpmsg, 

// 乙個msg的指標

hwnd hwnd, 

// 一般為當前視窗的控制代碼

uint wmsgfiltermin,  // 要取的訊息的最小值

uint wmsgfiltermax 

// 要取的訊息的最大值

);如果第三,四個引數都為零,則取所有的訊息。

如果出現錯誤,比如引數一或引數而指向的指標或控制代碼無效,則會返回-1.

bool peekmessage(

lpmsg lpmsg, 

hwnd hwnd, 

uint wmsgfiltermin, 

uint wmsgfiltermax, 

//前四個引數和getmessage的一樣

uint wremovemsg 

// 取完訊息要做的操作

);最後乙個引數有pm_noremove和pm_remove兩種方式,前一種就是取完訊息後不刪除訊息,

不知道這中方式在什麼情況下會採用,我目前還沒有見過。

一般都是採用後一種刪除的方法。

兩個函式主要有以下兩個區別:

1.getmessage將等到有合適的訊息時才返回,而peekmessage只是撇一下訊息佇列。

2.getmessage會將訊息從佇列中刪除,而peekmessage可以設定最後乙個引數wremovemsg來決定是否將訊息保留在佇列中。

在windows的內部,getmessage和peekmessage執行著相同的**。而兩者最大的不同之處則體現在沒有任何訊息返回到應用程式的情況下。在此種情況下,peekmessage會返回乙個空值到應用程式,getmessage會在此時讓應用程式休眠。

GetMessage和PeekMessage的區別

在win32中使用getmessage和peekmessage都可以獲取對應該程式產生的訊息。他們有什麼區別呢?getmessage的一般用法是getmessage msg,null,0,0 這樣可以接受所有的訊息,getmessage在沒有產生訊息的時候並不返回,而是一直在等待,直到乙個訊息返回 ...

C 中的Peek函式在C語言中實現

我朋友總是跟我說,c 是c的閹割版,我不反對,也不贊同。最近專案中,遇到乙個問題,就是如何在主程式執行的同時檢測串列埠的輸入,比如輸入 q 退出函式。同事推薦用c 的peek函式,可是我從進入工作以來,在linux專案中全部使用的是c,唯一知道去的輸入的就是getchar 了.該呼叫形式為cin.p...

和 區別和聯絡, 和 區別和聯絡

和 區別和聯絡,和 區別和聯絡,實際專案中,什麼情況用哪種?首先,和 的聯絡 共同點 和 都可以用作 邏輯與 運算子,都是雙目運算子。具體要看使用時的具體條件來決定。無論使用哪種運算子,對最終的運算結果都沒有影響。情況1 當上述的運算元是boolean型別變數時,和 都可以用作邏輯與運算子。情況2 ...