• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zmiana opcji w wierszu poleceń z poziomu kodu(C++)

0 głosów
85 wizyt
pytanie zadane 14 kwietnia w C i C++ przez randinpa Początkujący (340 p.)

Cześć

Szukam funkcji która pozwoli mi zmienić opcje w wierszu poleceń(cmd) "Zawiń tekst wyjściowy przy zmianie rozmiaru" (znajduje się ona w właściwości->układ).



Szukałem takiej opcji na stronie cpp0x.pl w kategorii Biblioteki c/c++->WinAPI ->Konsola ale nic nie znalazłem.

1 odpowiedź

+1 głos
odpowiedź 14 kwietnia przez Chess Maniak (71,290 p.)
edycja 15 kwietnia przez Chess

Nie ma takiej możliwości chyba poprzez standardowe API Windows. O ile się nie mylę, to jest nowość, która weszła wraz z Windows 10. Zmienić to w dość prosty sposób mógłbyś zapewne poprzez znalezienie np. w assembly x86_64 odpowiedniego adresu i ustawienie jemu wartości na 1 lub 0 w zależności, czy "enabled", czy "disabled". Gdy jednak nie znasz za bardzo języka assembly (niskopoziomowego), to możesz chyba sprawdzić, czy w rejestrze jest ten klucz ustawiony na jakąś wartość (enable), np. true i wtedy za pomocą kodu zmienić go na false i/lub odwrotnie, ale to moim zdaniem tylko obejście. Najlepszym wyborem w tej sytuacji, byłaby opcja numer jeden, ale musiałbyś znać na jakimś poziomie assembly.

Jednak, jeśli opcja pierwsza odpada, to zostaje Ci manipulowanie rejestrem, co może być w niektórych przypadkach chyba niebezpieczne. Zamiast tego możesz wykorzystać poradę/skorzystać z porady ze StackOverflow.

Możliwe, że jest do tego API, ale ciężko jest je znaleźć, gdzieś w odmętach stron internetowych.

https://stackoverflow.com/questions/34210216/how-to-detect-whether-windows-10-buffer-wrapping-mode-is-currently-enabled-in-th

Pozwolę sobie wkleić ten kod z powyższego link'a tutaj poniżej:

int main()
{
    // largest possible console size for given font and desktop
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD cd = GetLargestConsoleWindowSize(hOut);
    SHORT nScrMaxXch = cd.X, 
        nScrMaxYch = cd.Y;

    // current and max console sizes for given screen buffer
    CONSOLE_SCREEN_BUFFER_INFOEX csbix = { sizeof(csbix) };
    GetConsoleScreenBufferInfoEx(hOut, &csbix);
    SHORT nWndXch = csbix.srWindow.Right - csbix.srWindow.Left + 1,
        nWndYch = csbix.srWindow.Bottom - csbix.srWindow.Top + 1;
    SHORT nWndMaxXch = csbix.dwMaximumWindowSize.X,
        nWndMaxYch = csbix.dwMaximumWindowSize.Y;

    wprintf(L"chars:   wnd-size %d %d, max-wnd-size %d %d, largest-size %d %d\n",
        nWndXch, nWndYch, nWndMaxXch, nWndMaxYch, nScrMaxXch, nScrMaxYch);

    // current window size
    HWND hWnd = GetConsoleWindow();
    RECT rc; GetWindowRect(hWnd, &rc);
    LONG nWndXpx = rc.right - rc.left,
        nWndYpx = rc.bottom - rc.top;

    // max window tracking size
    MINMAXINFO mmi = { 0 };
    SendMessage(hWnd, WM_GETMINMAXINFO, 0, (LPARAM)&mmi);
    LONG nWndMaxXpx = mmi.ptMaxTrackSize.x,
        nWndMaxYpx = mmi.ptMaxTrackSize.y;

    wprintf(L"pixels:  wnd-size %lu %lu, max-tracking-size %lu %lu\n",
        nWndXpx, nWndYpx, nWndMaxXpx, nWndMaxYpx);

    if (nWndXch == nWndMaxXch   // full buffer width, no h-scrollbar 
    && nWndXch < nScrMaxXch     // not already stretched to full screen width
    && nWndMaxXpx > nWndXpx)    // allowed to resized wider
        wprintf(L"\n...most likely a Win10 console with ForceV2 enabled\n");

    return 0;
}

Nie wiem, czy ten kod działa zgodnie z Twoim zamysłem.

https://docs.microsoft.com/en-us/previous-versions/orphan-topics/ws.11/mt427362(v=ws.11)

Edit:

Kod ze StackOverflow (lekko zmodyfikowałem):


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


int main() {
	
	HKEY hKey;
	
	RegOpenKeyEx(HKEY_CURRENT_USER, "Console", 0, KEY_SET_VALUE, &hKey);
	DWORD value = 0; // Here put 0 or 1
	printf("%i", RegSetValueEx(hKey, TEXT("LineWrap"), 0, REG_DWORD, (const BYTE*)&value, sizeof(value)));
	RegCloseKey(hKey);
	
	return 0;
	
}

Link do pełnej odpowiedzi ze SO: https://stackoverflow.com/questions/5437800/setting-a-dword-value-in-the-registry

Jeśli wartość nie będzie chciała się zmienić to spróbuj otworzyć konsolę jako Administrator.

Dobrze by było, gdybyś utworzył kopię rejestru (regedit).

komentarz 15 kwietnia przez randinpa Początkujący (340 p.)
Znalazłem tą opcje w rejestrze(HKEY_CURRENT_USER->Console->LineWrap) ale czy ta się włączyć/wyłączyć tą opcje po przez kod?

Jakoś wskazać tą ścieżkę HKEY_CURRENT_USER\Console\LineWrap i zmienić wartość tego LineWrap na 0 lub 1?
komentarz 15 kwietnia przez randinpa Początkujący (340 p.)

@Chess, Wielkie dzięki działa

Podobne pytania

0 głosów
0 odpowiedzi 118 wizyt
0 głosów
2 odpowiedzi 95 wizyt
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

66,407 zapytań

113,168 odpowiedzi

239,568 komentarzy

46,673 pasjonatów

Przeglądających: 292
Pasjonatów: 5 Gości: 287

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...