C++ console application always on top? [closed]
Asked Answered
S

2

5

I am NOT looking for:

  • making another window always on top
  • making any sort of GUI - dialogs etc... on top

I am however looking for a way how to make my simple C++ console application to stay always on top,
just to be clear - I am looking for a way how to do this programaticly :) I tried hard searching but only found the above - what I do not want...

So is there a way how to make your console app always on top programaticly in C++ on Windows?

PS: Yes there is an existing question with a coresponding title but the OP of that question is actually looking for something else (keyboard hooks,...) - so answers there are off-topic to my question.

Solution:

Quick answer => see accepted answer by @AlexanderVX

Example & explanation => my answer below

Squeeze answered 21/11, 2014 at 19:14 Comment(3)
If that is for Windows I can tell what you need. Is it?Prestige
This is quite likely to be window-framework-specific. Can you clarify what you're targetting? Windows, X Window, ...?Baggott
@Nit and others - what is unclear? (As this is much weirder coming after I've add that the purpose is for windows...)Squeeze
P
11

The link in OP post refers to Windows.

First you need to obtain a handle for your console window: https://support.microsoft.com/kb/124103

Or even better and modern: GetConsoleWindow way to get that console handle.

Then you need to do quite a simple trick:

::SetWindowPos(hwndMyWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
::ShowWindow(hwndMyWnd, SW_NORMAL);
Prestige answered 21/11, 2014 at 19:26 Comment(2)
Your link describes an overly complicated method of getting the handle for pre-XP versions of Windows. In XP and onward, you can just use GetConsoleWindow().Tysontyumen
Agree that GetConsoleWindow improves it.Prestige
S
5

As @AlexanderVX's answer shows an quick answer, I wanted to also show you my final implementation with appropriate comments explaining what does what :) :

Don't forget to set Windows version same or greater than 0x0500 and include windows.h library:

#define _WIN32_WINNT 0x0500
#include <windows.h>

I've put mini-app example on: http://ideone.com/CeLQj3

Example with explanation:

// GetConsoleWindow() => returns:
// "handle to the window used by the console
// associated with the calling process
// or NULL
// if there is no such associated console."
HWND consoleWindowHandle = GetConsoleWindow();

if( consoleWindowHandle ){
    cout << endl << "Setting up associated console window ON TOP !";
    SetWindowPos(
        consoleWindowHandle, // window handle
        HWND_TOPMOST, // "handle to the window to precede
                      // the positioned window in the Z order
                      // OR one of the following:"
                      // HWND_BOTTOM or HWND_NOTOPMOST or HWND_TOP or HWND_TOPMOST
        0, 0, // X, Y position of the window (in client coordinates)
        0, 0, // cx, cy => width & height of the window in pixels
        SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW // The window sizing and positioning flags.
    );
    // OPTIONAL ! - SET WINDOW'S "SHOW STATE"
    ShowWindow(
        consoleWindowHandle, // window handle
        SW_NORMAL // how the window is to be shown
                  // SW_NORMAL => "Activates and displays a window.
                  // If the window is minimized or maximized,
                  // the system restores it to its original size and position.
                  // An application should specify this flag
                  // when displaying the window for the first time."
    );
    cout << endl << "Done.";
} else {
    cout << endl << "There is no console window associated with this app :(";
}

References:

PS: I wanted to post this as an edit to @AlexanderVX's answer, but most of stackoverflow's reviewers somehow thought that "This edit deviates from the original intent of the post"...

Squeeze answered 22/11, 2014 at 11:4 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.