SetWindowPostion TOPMOST

时间:2014-11-25 21:42:31

标签: c winapi topmost

我正在与C程序上的软件开发人员合作,该程序具有浮动首选项窗口。如果我在运行时使用Windows任务栏切换到另一个程序,我的浮动窗口仍然驻留在我切换到的程序上。我不是程序员,我的程序员告诉我,没有办法阻止这一点。我被告知他正在使用SetWindowPosition和一个名为TOPMOST的东西来给这个窗口保留最高权利。我喜欢在我的程序中工作时,但是当我切换到另一个程序时却不是。

有什么我可以告诉他这样做,当我切换到另一个程序但当我返回我的程序时,这个窗口不会保持最顶层吗?

2 个答案:

答案 0 :(得分:3)

一种方法是不要使窗口最顶端(即不用SetWindowPos标志调用HWND_TOPMOST,而根本不设置WS_EX_TOPMOST窗口样式),而是制作主窗口拥有的窗口。

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

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

答案 1 :(得分: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消息,则不会删除最顶部的标记。