将焦点更改为另一个程序Windows API

时间:2012-11-27 05:30:38

标签: c++ winapi

我正在尝试让我的应用程序将焦点更改为鼠标悬停时发生的任何其他窗口。我正在尝试实现一些拖放功能,所有似乎都缺少的是当鼠标将我的应用程序移动到另一个时,焦点会发生变化。

这是我目前的测试功能(我现在在主要回调程序中的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,但它帮助它在给定的范围内找不到它,但我已经包含了。

任何帮助或建议都将不胜感激。

1 个答案:

答案 0 :(得分: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将其带到前台。

我希望这会有所帮助。