jak wyłączyć z poziomu kodu w konsoli to okno:

wyłączenie powiadomnienia w konsoli
- Rejestracja: dni
- Ostatnio: dni
- Postów: 683
0
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Poznań
- Postów: 540
0
ChatGPT podaje coś takiego ale nie potrafię zweryfikować czy działa bo mam Win11
#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;
}
- 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.
#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).
#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.