• 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++)

Object Storage Arubacloud
0 głosów
441 wizyt
pytanie zadane 14 kwietnia 2019 w C i C++ przez randinpa Początkujący (450 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 2019 przez Chess Szeryf (76,710 p.)
edycja 15 kwietnia 2019 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 2019 przez randinpa Początkujący (450 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 2019 przez randinpa Początkujący (450 p.)

@Chess, Wielkie dzięki działa

Podobne pytania

0 głosów
0 odpowiedzi 178 wizyt
0 głosów
1 odpowiedź 566 wizyt
pytanie zadane 19 maja 2020 w PHP przez Mateusz_MM Początkujący (430 p.)
0 głosów
0 odpowiedzi 1,277 wizyt

92,567 zapytań

141,420 odpowiedzi

319,615 komentarzy

61,952 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...