0

アプリケーションのフォーカスをマウスオーバーした他のウィンドウに変更しようとしています。いくつかのドラッグ アンド ドロップ機能を実装しようとしていますが、欠けているように見えるのは、マウスがアプリケーションを別のアプリケーションに移動するときのフォーカスの変更だけです。

これが私の現在のテスト機能です(私は笑いのために今メインのコールバック手順でWM_MOUSEMOVEでそれを行います)

case WM_MOUSEMOVE:
{
    POINT pt;
    GetCursorPos(&pt);
    HWND newHwnd = WindowFromPoint(pt);

    if (newHwnd != g_hSelectedWindow)
    {
        cout << "changing windows" << endl;
        cout << SetWindowPos(newHwnd, HWND_TOP, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE) << endl;
        g_hSelectedWindow = newHwnd;
    }

    CallWindowProc(listproc, hwnd,message,wParam,lParam);
    break;
}

AllowSetForegroundWindow を使用してみましたが、指定されたスコープで見つけることができませんでしたが、含まれていました。

ヘルプや提案をいただければ幸いです。

4

1 に答える 1

1

AllowSetForegroundWindow他のウィンドウが を呼び出してフォアグラウンド ウィンドウになろうとしない限り、役に立ちませんSetForegroundWindow

この別のウィンドウを前面に表示する必要がある場合は、SetForegroundWindow直接呼び出してみませんか?

更新:したがって、これを正しく機能させるために必要なコードは次のとおりです。

HWND ResolveWindow(HWND hWnd)
{ /* Given a particular HWND, if it's a child, return the parent. Otherwise, if
   * the window has an owner, return the owner. Otherwise, just return the window
   */
    HWND hWndRet = NULL;

    if(::GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD)
        hWndRet = ::GetParent(hWnd);

    if(hWndRet == NULL)
        hWndRet = ::GetWindow(hWnd, GW_OWNER);

    if(hWndRet != NULL)
        return ResolveWindow(hWndRet);

    return hWnd;    
}

HWND GetTopLevelWindowFromPoint(POINT ptPoint)
{ /* Return the top-level window associated with the window under the mouse 
   * pointer (or NULL) 
   */
    HWND hWnd = WindowFromPoint(ptPoint);

    if(hWnd == NULL)
        return hWnd;    

    return ResolveWindow(hWnd);
}

GetTopLevelWindowFromPoint(pt)ハンドラーから呼び出すだけWM_MOUSEMOVEで、有効な HWND が返された場合は、SetForegroundWindow を使用して前面に表示できるトップレベル ウィンドウになります。

これが役立つことを願っています。

于 2012-11-27T05:36:30.953 に答える