我正在和一个软件开发人员一起开发一个C程序,它有一个浮动的首选项窗口。如果在运行时使用Windows任务栏切换到另一个程序,则浮动窗口仍位于切换到的程序上。我不是一个程序员,我的程序员告诉我没有办法阻止这一切。有人告诉我,他正在使用SetWindowPosition和一种叫做TOPMOST的东西,让这个窗口有权保持在最上面。我喜欢在我的程序中工作时它在上面,但当我切换到另一个程序时它不在上面。
有什么我可以告诉他,这样当我切换到另一个程序时,这个窗口不会保持在最上面,但当我返回到我的程序时,它会保持在最上面吗?

最佳答案

您可以使用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消息,则不会删除最上面的标志。

关于c - SetWindowPostion TOPMOST,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27137276/

10-11 21:25