rplusg
rplusg

Reputation: 3446

how to project my window as active window on foreground

There were some windows opened, And from my process I want to launch one more window(high priority) in which user has to enter credentials. And i want to put this credentials window to foreground, in turn it might give good experience to user as he need not manually select the credentials window. And this is one time launching, definitely not annoying but compulsory for user to enter creds.

what is the best way to achieve this? I don't think simulating mouse click is good idea. Is there a way to send msg to rest of windows to lose their focus? so that when i launch my window, it will come foreground.

Upvotes: 2

Views: 1845

Answers (4)

Chris Guzak
Chris Guzak

Reputation: 131

Users expect programs to only come to the foreground when they are supposed to. This technique enables programs to violate that contract, stealing foreground and subverting the design. Do not apply this without considering other options. For example using the owner window relationship between related windows and passing the ability to become foreground, when needed, using AllowSetForegroundWindow().

Upvotes: -1

MSalters
MSalters

Reputation: 180303

This UI pattern (window to enter mandatory values) is commonly known as a modal dialog. In MFC, you'd look for CDialog::DoModal. I.e. you derive your credential window from CDialog, and then call the inherited DoModal method.

A modal dialog blocks user input in other windows in your app, and therefore is automatically moved before the blocked windows.

Upvotes: 0

Rob
Rob

Reputation: 78758

This works for me without having to use SetWindowPos to make the window 'always on top':

HWND foreGround = GetForegroundWindow();
if (foreGround != m_hWnd)
{
    if (!::SetForegroundWindow(m_hWnd))
    {
        if (!foreGround)
        {
            foreGround = FindWindow(_T("Shell_TrayWnd"), NULL);
        }

        DWORD idForeground = GetWindowThreadProcessId(foreGround, NULL);
        DWORD idTarget = GetWindowThreadProcessId(m_hWnd, NULL);

        AttachThreadInput(idForeground, idTarget, TRUE);

        ::SetForegroundWindow(m_hWnd);

        AttachThreadInput(idForeground, idTarget, FALSE);
    }

    BringWindowToTop();
}

I use this in a chat application so a new chat message can steal focus (optional obviously as some users don't like this.)

Upvotes: 3

Aamir
Aamir

Reputation: 15576

You need to call SetWindowPos with wndTopMost parameter to set your window at the top of all other windows.

Upvotes: 0

Related Questions