2015-10-02 21 views
2

我需要軟件中的應用程序空閒時間。出於這個原因,我做了一個幫助類ApplicationIdleHelper,它實現了IMessageFilter接口。DevExpress WaitForm和PreFilterMessage - 意外的MouseMove消息

這工作得很好,如果我的應用是在閒置了一段時間,我展示一個DevExpress WaitForm使用此行代碼:

SplashScreenManager.ShowForm(typeof(WaitForm)); 

在這種WaitForm我告訴用戶關於現在得到了什麼樣的一些信息在背景中。如果用戶移動鼠標或按下某些鍵我關閉WaitForm這樣的:

SplashScreenManager.CloseForm(); 

下面是步驟的問題解釋說:

  1. 鼠標光標是一個形式。
  2. 用戶在一段時間內沒有做任何事 - >空閒時間 - >所以我顯示WaitForm
  3. 現在我在PreFilterMessage方法中得到一個MouseMove message?但爲什麼?鼠標沒有移動。沒有按鍵?因爲我的應用程序認爲我得到了一個MouseMove message,用戶做了一些輸入並自動關閉WaitForm

如果關閉WaitForm,則會出現相同的行爲。

下面是一個示例應用程序,所以你應該能夠重現行爲: https://drive.google.com/file/d/0BxabrokJG-OWV3FLV2hNNVk5NjQ/view?usp=sharing

的DevExpress的文件說:

等待表單和閃屏是由一個閃屏經理 在顯示一個單獨的線程。

也許這與這種行爲有關?

希望有人能解釋我,爲什麼我在PreFilterMessage函數中出現MouseMove message,在顯示或關閉WaitForm之後。

預先感謝您。

+1

我以前遇到過這個bug。在第一個事件中保存鼠標的位置,如果在下一個事件中位置相同,則不執行任何操作。如果它已移動,請按照您的要求更新鼠標位置 –

+0

非常感謝!簡單的解決方案,但它工作正常。您是否也使用過WaitForm控件,或者您是否遇到過其他控件的問題? – roli09

回答

2

這最可能的原因是鼠標對環境噪音敏感。鼠標完全有可能經歷一點點的抖動,導致它報告非常小的移動,最終達到零位變化。或者,這並未得到驗證,系統中的Windows或某些其他軟件可能會生成額外的鼠標移動消息,以確保每個人都與當前鼠標位置保持同步。

無論哪種方式,最穩定的解決辦法是在你認爲「真正」的運動量決定(見下文threshold),然後輸入:

  1. 捕捉,當你睡覺的鼠標位置。
  2. 每當你得到一個WM_MOUSEMOVE消息(或MouseMove事件)計算出的運動量,如:

    Point cached; // from when you went to sleep 
    Point current; // determined from the window message/event 
    double move = Math.Sqrt(Math.Pow(cached.X - current.X, 2) + 
             Math.Pow(cached.Y - current.Y, 2)) 
    
    if (move > threshold) 
    { 
        // Wake up 
    } 
    else 
    { 
        // Ignore and optionally update the cached position 
        // in case the mouse is slowly drifting 
    } 
    

    (請注意,您不一定需要計算實際距離這樣,你可以只使用Δ X + Δ Y)

當你正在處理的硬件,你需要準備好送你,你是不是期待更新。例如,按下一個按鈕會導致物理接觸反彈,從而導致電平的多個按壓/斷開信號。大多數時候,硬件設計用於過濾噪音,但有時會滲透。

相關問題