一個關於Windows下SetCursorPos和GetCursorPos的小坑

來源:互聯網
上載者:User

標籤:use   設定   point   amp   情況   系統   查詢   變化   int   

 這兩天在做一個編輯特定格式Mesh的小工具,需要檢查滑鼠的移動,一般來說可以用WM_MOUSEMOVE事件解決的,但是我為了省事用了定時查詢+設定的方式,也就是:

 1 void Frame(void) 2 { 3     //do something else... 4      5     POINT cursorPos; 6     GetCursorPos(&cursorPos); 7     curMoveX = cursorPos.x - cursorBaseX; 8     curMoveY = cursorPos.y - cursorBaseY; 9     cursorPos.x = cursorBaseX, cursorPos.y = cursorBaseY;10     SetCursorPos(&cursorPos);11     12     //do something else13 }

很簡單的邏輯,就是定期把Cursor設定到指定位置,然後過一會兒來檢查Cursor跑到哪裡了,看看這一段時間裡Cursor移動了多少,不斷重複這個過程就能得知滑鼠怎麼移動的(只是個小工具所以就這樣實現了)。但是跑起來的時候遇到一個詭異的問題:在我沒有移動滑鼠的情況下,得到的Cursor位置變化量居然不是0(拔掉滑鼠還是有這個現象,不是滑鼠的問題),網上沒有查到這個問題,我對Windows編程本來就不熟悉也不可能去仔細看文檔(至少GetCursorPos和SetCursorPos的條目裡沒提這種現象),所以就擱下了。

後來想了想,問題可能出在我SetCursorPos的時候。於是我在Set過後立刻Get一次,然後比對Set和Get得到的值,然後發現有的時候這兩個值竟然不一樣(在未移動滑鼠的情況下),差異也不大,但是足以幹擾程式運行。知道了這一點,立刻就得出幾種解決方案:一種是老老實實在視窗事件函數裡用WM_MOUSEMOVE,相當於避開了這個問題;一種是當檢測到的Cursor移動速度過慢的時候忽略這一移動,這樣雖然能工作但不怎麼漂亮;然後就是把Get和Set的量分開儲存,每次Set之後立刻Get一次,下一次計算位移量的時候就用這一次Get的值。最後我用了第三種方法,算是解決了問題。

問題本身不困難,但是算是個小坑,所以記錄一下。關於導致問題的原因,我現在暫不清楚,以後學習的過程中會留意。初步猜測是在我SetCursorPos的時候系統並沒有嚴格地把Cursor移動到我指定的位置,而是由於單位不同或者精度問題把Cursor設定到了離我指定的位置很近的另一個位置(比方說,位移了一個像素),結果就是我沒動滑鼠,卻發現Get和Set的值有時不一樣了。

一個關於Windows下SetCursorPos和GetCursorPos的小坑

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.