2017-07-04 84 views
2

MSDN文檔說,Lparam型第15位被用於重複計數,但它說,它不是累計WM_KEYDOWN重複計數?

現在,除非我在這裏失去了一些東西,它爲什麼稱之爲重複計數,但說這是不累積?

這是一個矛盾的陳述?它說它有,但它不?或者我在這裏錯過了什麼?

我實際測試,並與位運算符掩蓋它LParam&0xFFFF提取前15位,不管我有多麼按住鍵,這個值也保持爲1

,除非我做錯了什麼或失蹤一些東西,我不知道這個計數器不重要的是什麼?或者我誤解了一些東西,並且做錯了這個方法,並且有一些事情需要使用這個

這將是非常有效和方便的有這個計數器,所以我不必運行所有這些其他的代碼爲按下並保持的按鍵計算重複計數,那麼可以使用前15位來完成嗎?也許增加前15位?

+0

它沒有累積,因爲它不會按順序按鍵,直到鍵被釋放。我期望如果你的消息循環緩慢地處理消息,使得多個按鍵在循環之間進行註冊,那麼GetMessage(或者它是否爲TranslateMessage?)將生成一個大於1的計數的單個消息。 –

回答

2

讓我們開始在documentation

當前消息的重複計數。該值是由於用戶按下鍵而導致鍵擊自動重複的次數。

這部分是比較直接的。重複計數字段是鍵的「按鍵次數」。

如果按鍵持續時間足夠長,則會發送多條消息。

根據您的消息循環,可以發送多條消息。只要密鑰關閉,Windows就會一直髮送消息,因此您可以繼續處理重複。

但是,重複計數不是累積的。

重複計數不會在消息之間傳遞。換句話說,每條消息表示自上次處理消息後的重複次數。

您從未看到重複次數超過1的原因是您正在處理窗口消息的速度太快。通過在您的WM_KEYDOWN消息處理程序中加入延遲,可以看到更高的數字,以允許更多的重複排隊到下一個消息中。 (在C#在這裏,因爲有樣板代碼更少,但你應該能夠將其翻譯爲你使用任何語言。)

private const int WM_KEYDOWN = 0x0100; 
protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == WM_KEYDOWN) 
    { 
     System.Threading.Thread.Sleep(1000); 
     this.Text = $"Keydown Count: {m.LParam.ToInt32() & 0xFF}"; 
    } 
    base.WndProc(ref m); 
} 

運行這段代碼,我看近20-30重複計數。

如果需要重複次數,則需要從第一WM_KEYDOWN保持流水賬,直到WM_KEYUP。設計使您可以在事件進入時處理事件。(圖片一個文本框:響應性要求您在進入時處理這些鍵,而不是等到該鍵被釋放。)

+0

所以基本上,在處理該消息之後,WND_PROCEDURE函數結束,下一個消息在消息隊列中處理,它恰好與WM_KEYDOWN中的自動重複中的鍵相同,並且它僅將前15個位顯示爲1,並且之前完成前15位再次遞增並去處理下一個消息等,這是正確的? – sporingGT

+0

是的,你明白了。 – theB

+0

謝謝你,是的,我實際上是在WNDPROC函數中打印出WM_KEYDOWN的開關子句中的前15位的值,所以由於程序流由該函數指針控制,所以我可以看到它爲什麼做什麼它現在確實 – sporingGT