標籤: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的小坑