2011-10-27 2 views
2

私はwin apiで小さなウィンドウを作成しました。このウィンドウは、別のスレッドのウィンドウの子です。Win32 Api WM_MOUSEMOVEマウスを素早く動かす

私は右の右ボタンでマウスを動かすことによって私のウィンドウを動かすことを許可します。マウスを通常の速度で動かすと、ウィンドウが問題なく動きます。しかし、私が非常に速く移動すると、非常に奇妙なメッセージのいくつかがウィンドウで受信されます。例えば、

P WM_MOUSEMOVE fwKeys:MK_BUTTON XPOS:-32703 YPOS:9

あなたはXPOSは-32000まで低下見ての通り。私はマウスを素早く動かすとすぐに起こります。私はどのように窓が私にそのようなメッセージを送ることができるか分かりません。

なぜメッセージが送信され、修正するのか?

私はSetCaption関数を使用していますので、マウスが外にいてもメッセージは記録されます。

Upd。解決済み。問題は私の固有の数学にあった。 lParamからハイとローワードを得ることは適切ではありませんでした。

+2

'xPos'は16ビットの値ですが、' lParam'から 'xPos'をデコードしている間、おそらくあなたの計算にオーバーフローがあります。 –

+0

しかし、そのメッセージはSpy ++で見ています。 – HelloWorld

+0

右ボタンでウィンドウを移動させるために特別なことを行う可能性がありますか?そして、間違ったメッセージが送信されている可能性があります。 –

答えて

0

ドラッグ操作をサポートしているときに同じ問題が発生しました。左ボタンを押しながら画面の中央に素早く小さな円を描き、適切な操作にもかかわらず-32000や-64000などの範囲外の位置を生成しますlParamの座標変換の)。これは私のバグのように見えたので、最大値の場合は現在の画面サイズ(ピクセル単位)にして、負の値を負の画面サイズのボックスまで下げることができるように、xyをクリッピングしていました。

これは(Red/Systemで書かれた)よりよい理解のためのコードの抜粋です:私のためにそれを解決し

WM_MOUSEMOVE [ 
    lParam: msg/lParam 
    x: GET_X_LPARAM(lParam) 
    y: GET_Y_LPARAM(lParam) 
    if any [ 
     x < (0 - screen-size-x) 
     y < (0 - screen-size-y) 
     x > screen-size-x 
     y > screen-size-y 
    ][ 
     return 0  ;-- ignore this event 
    ] 
    ... 
] 

関連する問題