2017-08-29 37 views
-3

今、私は、ウィンドウの位置をリセットするためのアプリを開発しています。 注意すべき点は、グローバルマウスフックを使用してデスクトップマウスイベントを聞くことでした。 グローバルマウスフックがうまく機能しています。 私の問題は、SetWindowPos()メソッドが不思議なことです。 次は私のコードです:私はアプリを構築する場合C++:グローバルマウスフックとウィンドウの位置をリセット

case WM_LBUTTONUP: 
    mouselbut_clicked = false; 

    if (mousewnd_drag) 
    { 
     TRACE("mouse - lbutton release\n"); 

     if (window_moved) 
     { 
      ::SetWindowPos(hWnd, 0, 0, 0, 500, 500, SWP_ASYNCWINDOWPOS | SWP_NOZORDER); 
      window_moved = false; 
     } 
    } 
    break; 

、ウィンドウがデスクトップの左上隅になりますが、突然、それは元の位置に戻ってきます。

この問題を解決するにはどうすればよいですか?

答えて

0

ウィンドウを移動/サイズ変更すると、DefWindowProcは内部移動またはサイジングモーダルループを実行します。操作が完了し、操作とメッセージの正確な処理が文書化されない限り、コントロールはアプリケーションに戻りません。

より前にCallNextHookExを呼び出してみましたか?

ハックとして、あなたのフックが返ってくるまであなたの電話をSetWindowPosに遅らせることができます(自分自身にメッセージを投稿するか、ワーカースレッドを使用する)。

また、移動操作の終了をキャッチするために別のフックを使用して試みることができる:

+0

ねえ、アンダース は、私はあなたの答えと質問があります。 「あなたはSetwindowPosの前にCallNextHookExを呼び出そうとしましたか?」と言いましたが、詳細を教えてください。 –

+0

さらに、注入するもう一つのことは、SetWindowPosメソッドをWM_LBUTTONUPのケースに追加したときに、Ifのケースではなく、うまく動作することです。 これがなぜ起こるのか説明しますか? –

+0

フックは通常、CallNextHookExを呼び出す必要があります。そのため、他のフックもメッセージを取得します。別のフックも同様のことをした場合、他のフックの後でアクションを実行した場合にのみ "勝利"します。あなたがすべてのコードを投稿していないので、他の質問に答えることができない場合。 – Anders

関連する問題