Wyłączanie przycisków systemowych

0

Witam szanownych forumowiczów... Mam takie pytanie, w jaki sposób wyłączyć systemowe przyciski okna... Ustawić je na Enabled := False; Zamknij, maksymalizuj i minimalizuj. Kiedyś udało mi się to zrobić, niestety po formatowaniu dysku nic nie zostało z projektów. Może ktoś z Was wie jak to zrobić umieścił bym ten post w Newbe ale nie wiem w jaki sposób to zrobić pozdrawiam ernest123

0

jak enabled false to nie wiem z głowy, ale visible false to jest kilka sposobów, najprościej wyłączyć w opcjach odpowiednie [BorderIcons]

2

@ernest123 - najprościej to we właściwości BorderIcons odepnij te ikony, których mieć nie chcesz; A jeśli chcesz się bawić WinAPI, to możesz skorzystać z funkcji EnableMenuItem.

0

dałem tak w buttonie

EnableMenuItem(form1.Menu.Handle,1,0);

wywala Acces Violation ;)

nie chcę odpinać ikon od formy, chcę je wszystkie wyłączyć Enabled := False, kiedyś mi się udało

`dodanie znaczników i ``` - @furious programming

0

zrobiłem tak:

 

procedure TForm1.Button1Click(Sender: TObject);
var
  AppMenu: THandle;
  i: Integer;
begin
AppMenu := GetSystemMenu(Self.Handle, FALSE);
EnableMenuItem(AppMenu, SC_CLOSE, MF_GRAYED);

end;


i pięknie wyłącza

pytanie brzmi jak wyłączyć pozostałe 2 ikony SC_MINIMIZE nie działa

0

Tak jak wspomniał @sapero - dla pozostałych przycisków funkcja EnableMenuItem nie zadziała i trzeba użyć SetWindowLong; Kiedyś szukałem tego jak zablokować (nie ukryć) pozostałe przyciski i znalazłem właśnie przykłady z EnableMenuItem i SetWindowLong; Poniżej przykłady wywołania:

// close disable
EnableMenuItem(GetSystemMenu(Self.Handle, LongBool(False)), SC_CLOSE, MF_BYCOMMAND or MF_GRAYED);
// maximize disable
SetWindowLong(Self.Handle, GWL_STYLE, GetWindowLong(Self.Handle, GWL_STYLE) and not WS_MAXIMIZEBOX);
// maximize enable
SetWindowLong(Self.Handle, GWL_STYLE, GetWindowLong(Self.Handle, GWL_STYLE) or WS_MAXIMIZEBOX);

Podobnie z SC_MINIMIZE - potestuj sobie.

0

dzięki za odpowiedzi chłopaki


SetWindowLong(Self.Handle, GWL_STYLE, GetWindowLong(Self.Handle, GWL_STYLE) and not WS_MAXIMIZEBOX);

 

zadziałało pięknie

pozostała jeszcze ikona minimalizacji na nią to nie działa

SC_MINIMIZE

0

Ustaw sobie własność BorderStyle Formatki na bsDialog i wyszarz kodem przycisk zamykania. A jeżeli chcesz mieć formatkę z ikonką. To wygoogluj sobie disable minimize delphi. I poczytaj stronę zwróconą jako trzeci wynik. Konkretnie tę: http://www.swissdelphicenter.ch/en/showcode.php?id=1207 - do tego wyszarz "X" jak wcześniej.

A i czy na prawdę nie mogłeś najpierw chwileczkę sam pogooglować, tylko od razu smarować na forum? Wiem, zaraz madmike z partyzanta napisze, że niby marudzę. Ale to niestety smutna prawda. Ludziom tutaj nie chcę się chwilę wcześniej nawet pogooglować. idzie się załamać :/

0

Olesio, kiedyś byłeś bardziej pomocny, teraz tylko marudzisz, ale najgorsze jest to że w tym przypadku kłania Ci się czytanie ze zrozumieniem.
Kolega nie chce ukryć przycisków tylko je zdezaktywować.

0

@jsss1: nie wiem czy to ponownie nie ktoś zarejestrowany, ale piszący "z partyzanta". Ale nie będę się teraz bawił w jakieś dochodzenie. I to Ty nie rozumiesz podstaw. System Windows, o ile mi wiadomo, uniemożliwia wyszarzenie minimalizacji oraz maksymalizacji. Takie okno "bez niczego" to jest dialog. A ten domyślnie nie posiada na ogół ikonki. Ale i na to jest sposób (poniżej). Ja tylko chcę aby ludzie przez chwile używali Google i pomyśleli zanim o cokolwiek spytają. Pomóc może im Google od ręki. A pomocny zawsze byłem, jestem i będę w miarę moich możliwości.

A i jeżeli jesteś taki wszystko wiedzący, to zamiast marudzić, że niby ja marudzę. Proszę bardzo, podaj gotowy sposób na to aby wszystko wyszarzyć, a nie ukrywać. Najlepiej w Delphi. Chętnie go poznam i za pewne nie tylko ja. Poniżej według mnie najprostszy sposób na osiągnięcie tego co chce pytający. Znikają przyciski do minimize i maximize, wyszarzamy "X" i ustawiamy ikonkę na tę aplikacji. Oczywiście można w razie konieczności podać Handle do innej ikonki załadowanej na przykład z zasobów lub fizycznego pliku. Więcej informacji na ten temat jest na MSDNie oraz w postaci mnóśtwa przykładów w Google. Na prawdę.

procedure TForm1.FormCreate(Sender : TObject);
begin
  Self.BorderStyle := bsDialog;
  EnableMenuItem(GetSystemMenu(Self.Handle, False), SC_CLOSE, MF_GRAYED);
  SendMessage(Self.Handle, WM_SETICON, 1, Application.Icon.Handle);
end;
0

@ernest123 - nie wiem w jaki sposób dezaktywować jednocześnie przyciki minimalizacji i maksymalizacji, bez ich ukrywania; Jeżeli spróbujemy je dezaktywować, osobną bądź jednocześnie, np. takim kodem:

var
  intWndLong: Integer;
begin
  intWndLong := GetWindowLong(Self.Handle, GWL_STYLE);
  SetWindowLong(Self.Handle, GWL_STYLE, intWndLong and not WS_MINIMIZEBOX and not WS_MAXIMIZEBOX);
  RedrawWindow(Self.Handle, nil, 0, RDW_INVALIDATE or RDW_FRAME or RDW_NOCHILDREN);
end;

to obie ikonki znikną - tym zajmują się wewnętrzne mechanizmy obsługi okien i komunikatów, które nie pozwalają (przynajmniej tak łatwo) na istnienie tych obu przycików zablokowanych; Być może istnieje jakiś sposób na to, jednak ja go nie znam.

0

googlowałem ale niewiele znalazłem. dzięki za pomoc temat uważam za zamknięty

1

System nie przewiduje takiej sytuacji. Jeśli oba przyciski są nieaktywne, to automatycznie znikają.
Dlaczego ci to przeszkadza?

Jeśli osiągnąłeś kiedyś sytuację, w której miałeś oba przyciski nieaktywne ale widoczne, to jest duża szansa że to było “undefined behavior”, coś czego się robić nie powinno i co może nie działać w innych wersjach systemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1