wyłączenie powiadomnienia w konsoli

wyłączenie powiadomnienia w konsoli
wilkwielki
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 683
0

jak wyłączyć z poziomu kodu w konsoli to okno:
screenshot-20251221065328.png

tBane
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 540
0

ChatGPT podaje coś takiego ale nie potrafię zweryfikować czy działa bo mam Win11

Kopiuj
#include <iostream>
#include <windows.h>

void disableQuickEdit()
{
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
    DWORD mode;

    GetConsoleMode(hInput, &mode);
    mode &= ~ENABLE_QUICK_EDIT_MODE;   // wyłącz Quick Edit
    mode |= ENABLE_EXTENDED_FLAGS;     // wymagane!
    SetConsoleMode(hInput, mode);
}

int main() {

    disableQuickEdit();

    
	return 0;
}
BR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 32
0

Z ciekawości również zapytałem LLM'a i trzyma się wersji że trzeba wyłączyć Quick Edit Mode.

To menu jest ściśle powiązane z funkcją Quick Edit Mode w klasycznej konsoli Windows (conhost.exe). Wyłączenie Quick Edit powoduje, że prawy klik nie otwiera tego menu (zamiast tego może wklejać tekst, jeśli tryb insert jest włączony, ale menu nie pojawia się). Nie ma bezpośredniej flagi tylko do menu kontekstowego – jest ono integralną częścią Quick Edit

Dał kod podobny do powyższego.

Kopiuj
#include <windows.h>
#include <iostream>

int main() {
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE);
    if (hInput == INVALID_HANDLE_VALUE) {
        std::cerr << "Błąd: Nie można uzyskać uchwytu wejścia konsoli." << std::endl;
        return 1;
    }

    DWORD prevMode;
    if (!GetConsoleMode(hInput, &prevMode)) {
        std::cerr << "Błąd: Nie można odczytać trybu konsoli." << std::endl;
        return 1;
    }

    // Wyłącz Quick Edit Mode (wymaga ustawienia ENABLE_EXTENDED_FLAGS)
    DWORD newMode = (prevMode | ENABLE_EXTENDED_FLAGS) & ~ENABLE_QUICK_EDIT_MODE;

    if (!SetConsoleMode(hInput, newMode)) {
        std::cerr << "Błąd: Nie można ustawić trybu konsoli." << std::endl;
        return 1;
    }

    std::cout << "Menu kontekstowe (Quick Edit) zostało wyłączone." << std::endl;
    std::cout << "Prawy klik nie powinien już otwierać menu Edit/Mark itp." << std::endl;

    // Tutaj Twój główny kod programu...

    // Na końcu (opcjonalnie) przywróć poprzedni tryb
    // SetConsoleMode(hInput, prevMode);

    system("pause");  // Przytrzymaj okno otwarte do testów
    return 0;
}

Zaproponował też coś innego choć tego nie poleca.

Aby zablokować obsługę wiadomości WM_CONTEXTMENU w oknie klasycznej konsoli (conhost.exe), co uniemożliwi pojawienie się menu kontekstowego po prawym kliku w obszarze klienta (Edit/Mark/Copy itp.), możesz spróbować subclassingu procedury okna za pomocą SetWindowLongPtr(GWLP_WNDPROC).
Kopiuj
#include <windows.h>
#include <iostream>

WNDPROC originalWndProc = nullptr;

LRESULT CALLBACK ConsoleWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    if (msg == WM_CONTEXTMENU) {
        // Blokujemy menu kontekstowe – po prostu ignorujemy wiadomość
        // Opcjonalnie: możesz obsłużyć prawy klik samodzielnie
        return 0;  // Nie przekazujemy dalej
    }

    // Dla wszystkich innych wiadomości wywołujemy oryginalną procedurę
    return CallWindowProc(originalWndProc, hwnd, msg, wParam, lParam);
}

int main() {
    HWND consoleWnd = GetConsoleWindow();
    if (!consoleWnd) {
        std::cerr << "Błąd: Nie można uzyskać HWND konsoli." << std::endl;
        return 1;
    }

    // Subclassing
    originalWndProc = (WNDPROC)SetWindowLongPtr(consoleWnd, GWLP_WNDPROC, (LONG_PTR)ConsoleWndProc);
    if (!originalWndProc) {
        std::cerr << "Błąd subclassingu: " << GetLastError() << std::endl;
        return 1;
    }

    std::cout << "Subclassing ustawiony – WM_CONTEXTMENU powinno być blokowane." << std::endl;
    std::cout << "Prawy klik w obszarze klienta nie powinien otwierać menu." << std::endl;

    // Twój kod programu...

    system("pause");

    // Przywróć oryginalną procedurę przed końcem (ważne!)
    SetWindowLongPtr(consoleWnd, GWLP_WNDPROC, (LONG_PTR)originalWndProc);

    return 0;
}

Na koniec dodał:

Zdecydowanie polecam trzymać się wyłączenia Quick Edit Mode (poprzednia odpowiedź) – to oficjalny, stabilny i zalecany sposób. Blokowanie WM_CONTEXTMENU to hack, który rzadko jest potrzebny i może przestać działać w przyszłych aktualizacjach Windows

Przetestować tego nie mogę bo nie używam Windows.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.