0

我正在与软件开发人员合作开发具有浮动首选项窗口的 C 程序。如果我在运行时使用 Windows 任务栏切换到另一个程序,我的浮动窗口仍然驻留在我切换到的程序之上。我不是程序员,我的程序员告诉我没有办法阻止这种情况。我被告知他正在使用 SetWindowPosition 和一个叫做 TOPMOST 的东西来让这个窗口保持在顶部。我喜欢在我的程序中工作时它处于领先地位,但当我切换到另一个程序时却不喜欢它。

有什么我可以告诉他的,这样当我切换到另一个程序时,这个窗口不会保持在最上面,而当我返回我的程序时,它会保持在最上面?

4

2 回答 2

3

一种方法是根本不使窗口位于最顶层(即不SetWindowPos使用HWND_TOPMOST标志调用,也不设置WS_EX_TOPMOST窗口样式),而是使窗口主窗口所有。

为此,在创建浮动窗口时(使用CreateWindowEx),您将主窗口的句柄指定为其父窗口。

拥有的窗口总是出现在它们的所有者之上,但它仍然是浮动的,并且会在其他应用程序的窗口后面。

于 2014-11-25T21:45:58.640 回答
0

您可以使用该WM_ACTIVATE消息。Windows 在激活或停用窗口时发送此消息。如果用户切换到另一个应用程序,则应用程序的当前窗口会收到一条WM_ACTIVATE消息,告诉它它正在被停用。

这是一个小示例,用于在用户切换到另一个应用程序时设置/删除最上面的标志(考虑hFloatingWindow到浮动窗口的窗口句柄):

LRESULT __stdcall YourWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {

    /* ... */

    case WM_ACTIVATE:
        DWORD pid = 0;

        GetWindowThreadProcessId((HWND)lParam, &pid);
        if (pid != GetCurrentProcessId())   /* switch to another task? */
        {
            if ((wParam == WA_ACTIVE) || (wParam == WA_CLICKACTIVE))
            {
                if (SetWindowPos(hFloatingWindow, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE) == FALSE)
                {
                    /* handle error */
                }
            }
            else
            {
                if (SetWindowPos(hFloatingWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE) == FALSE)
                {
                    /* handle error */
                }
            }
        }
        return (0);  /* message processed */

    /* ... */
}

请注意,您必须将代码添加WM_ACTIVATE到应用程序的所有窗口过程中。这是必要的,因为用户可以从任何处于活动状态的窗口切换到另一个任务。如果当前活动窗口不处理WM_ACTIVATE如上所示的消息,则不会删除最上面的标志。

于 2014-11-27T20:18:51.577 回答