Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Zmiana rozmiaru konsoli w skrypcie


MrKris7100

Rekomendowane odpowiedzi

Opublikowano

Witam, piszę konsolową aplikację (kolejną z resztą) i napotkałem problem przy zmianie rozmiaru bufforu konsoli jak i zmienie rozmiaru samego okna. Mianowicie w C++ napisałem kod który zmienia te rozmiary i on działa. Zaś w autoit ten sam kod nie działa.

Kod C++:
 

void set_window_size(int Width, int Height) {
       _COORD coord;
       coord.X = Width;
       coord.Y = Height;
       _SMALL_RECT Rect;
       Rect.Top = 0;
       Rect.Left = 0;
       Rect.Bottom = Height - 1;
       Rect.Right = Width - 1;
       HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);
       SetConsoleScreenBufferSize(Handle, coord);
       SetConsoleWindowInfo(Handle, TRUE, &Rect);
   }

Kod autoit:

 

Func _Console_SetSize($iWidth, $iHeight)
	Local $tConsoleWindow = DllStructCreate($tagSMALL_RECT)
	DllStructSetData($tConsoleWindow, "Left", 0)
	DllStructSetData($tConsoleWindow, "Top", 0)
	DllStructSetData($tConsoleWindow, "Right", $iWidth - 1)
	DllStructSetData($tConsoleWindow, "Bottom", $iHeight - 1)
	DllCall($vKernel, "bool", "SetConsoleWindowInfo", _
			"handle", $CONSOLE_OUTPUT, _
			"bool", True, _
			"ptr", DllStructGetPtr($tConsoleWindow))
	Local $tConsoleCOORD = DllStructCreate($tagCOORD)
	DllStructSetData($tConsoleCOORD, "X", $iWidth )
	DllStructSetData($tConsoleCOORD, "Y", $iHeight )
	DllCall($vKernel, "bool", "SetConsoleScreenBufferSize", _
			"handle", $CONSOLE_OUTPUT, _
			"ptr", DllStructGetPtr($tConsoleCOORD))
EndFunc

Cóż jest źle w kodzie autoit? Dodam iż kod autoit zmienia tylko wymiary okna zaś buffor pozostaje bez zmian.

PS. Użycie "mode con cols=X lines=Y" z cmd.exe odpada.

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

Sprawdź co zwracają te DllCall'e, może coś z wywoływaniem funkcji poszło źle(wtedy DllCall ustawia @error) albo sama funkcja odmówiła posłuszeństwa(DllCall zwraca tablicę gdzie pierwszy element jest wartością zwróconą, jak 0 to coś walneło - a wtedy sprawdzić GetLastError i dostaniesz kod błędu).

Opublikowano

Sprawdziłem. Brak @error i $tablica[0] <> 0. Inny pomysł?

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Opublikowano

Mam - SetConsoleScreenBufferSize nie przyjmuje jako 2 argumentu COORD*, tylko po prostu COORD.

Opublikowano

@Edit

Dobra przyznaję ci rację. Chyba muszę się podszkolić w DllCall

Działa:

 

	Local $tConsoleWindow = DllStructCreate($tagSMALL_RECT)
	DllStructSetData($tConsoleWindow, "Left", 0)
	DllStructSetData($tConsoleWindow, "Top", 0)
	DllStructSetData($tConsoleWindow, "Right", $iWidth - 1)
	DllStructSetData($tConsoleWindow, "Bottom", $iHeight - 1)
	$aRet = DllCall($vKernel, "bool", "SetConsoleWindowInfo", _
			"handle", $CONSOLE_OUTPUT, _
			"bool", True, _
			"ptr", DllStructGetPtr($tConsoleWindow))
	DllCall($vKernel, "bool", "SetConsoleScreenBufferSize", _
			"handle", $CONSOLE_OUTPUT, _
			"int", BitShift($iHeight, -16) + $iWidth)

:)

Dzięki za pomoc, poleciała naj i lajk :P

Cipka - Najlepszy silnik na świecie. Działa z tłokiem każdej średnicy, wbudowana funkcja samosmarowania, odpalasz jednym palcem i co miesiąc sam się wymienia olej. Szkoda tylko że ma taki pojebany komputer pokładowy.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...