Консольное приложение C ++ всегда наверху?

Я НЕ ищу:

  • сделать другое окно всегда наверху
  • создание любого графического интерфейса - диалогов и т. д. вверху

Однако я ищу способ, чтобы мое простое приложение C ++ console всегда оставалось на вершине,
просто для ясности - я ищу способ сделать это программно :) Я пытался усердно искать, но нашел только вышеперечисленное - то, что мне не нужно ...

Итак, есть ли способ сделать ваше консольное приложение всегда программным на C ++ в Windows?

PS: Да, существует существующий вопрос с соответствующим заголовком но OP этого вопроса на самом деле ищет что-то еще (крючки для клавиатуры, ...) - поэтому ответы на мой вопрос не по теме.

Решение:

Быстрый ответ = ›см. принятый ответ от @AlexanderVX

Пример и объяснение = ›мой ответ ниже


person jave.web    schedule 21.11.2014    source источник
comment
Если это для Windows, я могу сказать, что вам нужно. Это?   -  person Alexander V    schedule 21.11.2014
comment
Скорее всего, это зависит от конкретной оконной структуры. Можете уточнить, на что вы нацелены? Windows, X Window, ...?   -  person Angew is no longer proud of SO    schedule 21.11.2014
comment
@Nit и другие - что неясно? (поскольку это намного страннее после того, как я добавил, что цель - для окон ...)   -  person jave.web    schedule 22.11.2014


Ответы (2)


Ссылка в сообщении OP относится к Windows.

Сначала вам нужно получить дескриптор окна консоли: https://support.microsoft.com/kb/124103

Или даже лучше и современнее: GetConsoleWindow способ получить дескриптор консоли.

Тогда вам нужно проделать довольно простой трюк:

::SetWindowPos(hwndMyWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
::ShowWindow(hwndMyWnd, SW_NORMAL);
person Alexander V    schedule 21.11.2014
comment
Ваша ссылка описывает слишком сложный метод получения доступа к версиям Windows до XP. В XP и более поздних версиях вы можете просто использовать GetConsoleWindow(). - person chris; 21.11.2014
comment
Согласитесь, что GetConsoleWindow его улучшает. - person Alexander V; 21.11.2014

Поскольку @ AlexanderVX answer дает быстрый ответ, я хотел также покажу вам мою окончательную реализацию с соответствующими комментариями, объясняющими, что и что делает :):

Не забудьте установить версию Windows такую ​​же или выше 0x0500 и включить windows.h библиотеку:

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

Я поместил пример мини-приложения на: http://ideone.com/CeLQj3

Пример с пояснением:

// 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 :(";
}

Ссылки:

PS: Я хотел опубликовать это как редактирование ответа @ AlexanderVX, но большинство рецензентов stackoverflow почему-то подумали, что «Это редактирование отклоняется от первоначального намерения сообщения» ...

person jave.web    schedule 22.11.2014