AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Aufruf des Systemmenü eines Fensters verhindern

Aufruf des Systemmenü eines Fensters verhindern

Ein Thema von TUX_der_Pinguin · begonnen am 17. Feb 2017 · letzter Beitrag vom 17. Feb 2017
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
3.866 Beiträge
 
Delphi 2010 Architect
 
#11

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 13:21
Zitat:
Bekommt das UNSICHTBARE Menü immer noch den Focus: JA
Quatsch.

Zitat:
Muss ich immer noch ZWEIMAL die ESC-Taste drücken um das Formular zu schließen: JA
Ich kann es selbst mit 100 ESC Klicks nicht schießen.
Wie denn auch wenn es nicht mehr existiert.
Also auch Quatsch.

Das Menu ist nicht mehr da wie denn auch.
Drück doch einfach mein dein besagtes ALT-SPACE

Aber natürlich hänge ich das Projekt auch noch an. (Weil ich dazu blöd genug bin)
Du bist ab sofort auf meiner Ignorier liste.

gruss
Angehängte Dateien
Dateityp: rar SystemMenu deaktivieren.rar (643,5 KB, 2x aufgerufen)

Geändert von EWeiss (17. Feb 2017 um 13:29 Uhr)
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
557 Beiträge
 
Delphi 10.1 Berlin Professional
 
#12

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 13:33
Das Menu ist nicht mehr da wie denn auch.
Drück doch einfach mein dein besagtes ALT-SPACE

gruss
Ja ich drücke ALT-Space, dann drücke ich ESC um mein Formular zu schließen und es passiert nichts weil DAS SYSTEMMENÜ DEN FOCUS HAT UND SICH DURCH DRÜCKEN DER ESC-TASTE SCHLIESST, drücke ich dann ein zweites mal ESC wird endlich das KeyDown Ereignis des Formulars ausgelöst und das Formular schließt sich.

Die Anwendung soll nur über die Tastatur zu bedienen sein und wenn der Anwender ausversehen in dem unsichtbaren Menü hängt und dann das Fenster schließen will und beim drücken der ESC-Taste nichts passiert finde ich das unsauber das er dann noch mal drücken muss.
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
3.866 Beiträge
 
Delphi 2010 Architect
 
#13

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 13:36
Ach lade dir mein Teil doch einfach und versuche dieses durch ESC zu schließen.
Sag bescheid wenn du es geschlossen hast.

Zitat:
in dem unsichtbaren Menü hängt
Wo ist das Problem dann entferne einfach den WindowStyle WS_SYSMENU nach dem du alle Items gelöscht hast.
Danach ist das Menu garantiert nicht mehr vorhanden.

gruss

Geändert von EWeiss (17. Feb 2017 um 13:43 Uhr)
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
557 Beiträge
 
Delphi 10.1 Berlin Professional
 
#14

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 13:42
Ach lade dir mein Teil doch einfach und versuche dieses durch ESC zu schließen.
Sag bescheid wenn du es geschlossen hast.

gruss
Das schließen wird ja auch über das OnKeyDown Event des Formulars gelöst, wie bereits beschrieben, dazu muss noch KeyPreview des Formulars aktiv sein. Rufe ich die Anwendung auf ohne irgendwas zu machen und drücke die ESC-Taste beendet sich die Anwendung sofort und umgehend. Drücke ich nach dem Start jedoch ALT+Leertaste und dann die ESC-Taste passiert nichts, erst beim erneuten drücken der ESC-Taste. Warum weil das Systemmenü obwohl nicht sichtbar doch den Focus oder sonst was bekommen hat. Du darfst das gerne selbst testen.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

  Close;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_ESCAPE then
  begin
    Close;
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
var
  Menu: HMENU;
  MenuItems: Integer;
  i: Integer;
begin

  Menu := GetSystemMenu(Handle, false);
  if Menu <> 0 then
  begin
    MenuItems := GetMenuItemCount(Menu);
    if MenuItems <> 0 Then
      for i := MenuItems - 1 DownTo 0 do
        RemoveMenu(Menu, i, MF_BYPOSITION);
  end;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
3.866 Beiträge
 
Delphi 2010 Architect
 
#15

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 13:46
Zitat:
Du darfst das gerne selbst testen.
Ich habe es mit meinem Projekt getestet

Da kann ich drücken wie blöde da schießt sich nichts mit ESC.
Aber gut hab meinen Beitrag über dir editiert.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
3.866 Beiträge
 
Delphi 2010 Architect
 
#16

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 13:54
Zitat:
Warum weil das Systemmenü obwohl nicht sichtbar doch den Focus oder sonst was bekommen hat. Du darfst das gerne selbst testen.
Was nicht existiert kann keinen Focus bekommen.

So es gibt kein SysMenu mehr überprüfe das einfach anhand der GWL_STYLE
Weder Unsichtbar noch sonst was.
Du kannst aber das Window nun trotzdem verschieben.

Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
  Menu: HMENU;
  MenuItems: Integer;
  i: Integer;
  Style: DWord;
begin

  Menu := GetSystemMenu(Handle, false);
  if Menu <> 0 then
  begin
    MenuItems := GetMenuItemCount(Menu);
    if MenuItems <> 0 Then
      for i := MenuItems - 1 DownTo 0 do
        RemoveMenu(Menu, i, MF_BYPOSITION);
  end;

  Style := GetWindowLong(Handle, GWL_STYLE);
  Style := Style and not WS_SYSMENU;
  SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, Style)
    or WS_BORDER or WS_SIZEBOX or WS_DLGFRAME or WS_OVERLAPPED);
end;
Entferne den Button auf der Form addiere dein ominöses
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_ESCAPE then
   begin
     Close;
   end;
end;
Klick einmal die ESC Taste dann beendet sich die Anwendung sofort.
Miniaturansicht angehängter Grafiken
17.02.jpg  

Geändert von EWeiss (17. Feb 2017 um 14:13 Uhr)
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
557 Beiträge
 
Delphi 10.1 Berlin Professional
 
#17

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 14:12
So es gibt kein SysMenu mehr überprüfe das einfach anhand der GWL_STYLE
Weder Unsichtbar noch sonst was.
Du kannst aber das Window nun trotzdem verschieben.

Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
  Menu: HMENU;
  MenuItems: Integer;
  i: Integer;
  Style: DWord;
begin

  Menu := GetSystemMenu(Handle, false);
  if Menu <> 0 then
  begin
    MenuItems := GetMenuItemCount(Menu);
    if MenuItems <> 0 Then
      for i := MenuItems - 1 DownTo 0 do
        RemoveMenu(Menu, i, MF_BYPOSITION);
  end;

  Style := GetWindowLong(Handle, GWL_STYLE);
  Style := Style and not WS_SYSMENU;
  SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, Style)
    or WS_BORDER or WS_SIZEBOX or WS_DLGFRAME or WS_OVERLAPPED);
end;
Danke für den Tipp aber leider kommt das auf das selbe raus wenn ich in der Option BorderIcons das Systemmenü abschalten, es verschwindet der X-Button, den ich aus Design Gründen ganz gerne behalten würde. Alles nicht so das ware, es läuft wohl auf einen Kompromiss hinaus.

Wobei meine erste Lösung zumindest die ALT+Leertaste Problematik behebt, danach war mir auf gefallen das schon das alleinige drücken von ALT das Menü aufruft, auch wenn es nicht sichtbar ist.

Delphi-Quellcode:
private
  procedure WMInitMenuPopup(var Msg: TWMInitMenuPopup); message WM_INITMENUPOPUP;

procedure TForm1.WMInitMenuPopup(var Msg: TWMInitMenuPopup);
begin
  inherited;
  if Msg.SystemMenu then
  begin
    //Beendet das Menü sofort wieder
    EndMenu;

    //Einträge können gelöscht werden, da aber eh nicht sichtbar also auch nicht nötig.
    //Außerdem sorgt dafür das löschen des "Schließen" Eintrags dafür das das "Rote X" deaktiviert wird und gräulich dargestellt wird
    DeleteMenu(msg.MenuPopUp, SC_MOVE, MF_BYCOMMAND);
    DeleteMenu(msg.MenuPopUp, SC_CLOSE, MF_BYCOMMAND);
  end;{if}

end;
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
3.866 Beiträge
 
Delphi 2010 Architect
 
#18

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 14:26
Zitat:
Alles nicht so das ware, es läuft wohl auf einen Kompromiss hinaus.
Abgesehen davon das nun der X-Button nicht mehr sichtbar ist läuft alles so wie gewünscht.

1.
Ich starte die Anwendung.
Drücke ALT-SPACE nichts passiert.
Drücke einmalig den ESC Key die Anwendung beendet.

2.
Ich starte die Anwendung.
Drücke einmalig den ESC Key die Anwendung beendet.

OK das war's für mich.

gruss
Angehängte Dateien
Dateityp: rar SystemMenu deaktivieren2.rar (637,1 KB, 1x aufgerufen)
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
557 Beiträge
 
Delphi 10.1 Berlin Professional
 
#19

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 14:28
Abgesehen davon das nun der X-Button nicht mehr sichtbar ist läuft alles so wie gewünscht.

1.
Ich starte die Anwendung.
Drücke ALT-SPACE nichts passiert.
Drücke einmalig den ESC Key die Anwendung beendet.

2.
Ich starte die Anwendung.
Drücke einmalig den ESC Key die Anwendung beendet.

OK das war's für mich.

gruss
Das wäre mir schon wichtig das der X-Button sichtbar wäre, aber danke dir trotzdem.
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
557 Beiträge
 
Delphi 10.1 Berlin Professional
 
#20

AW: Aufruf des Systemmenü eines Fensters verhindern

  Alt 17. Feb 2017, 16:01
So ich habe es jetzt scheinbar endlich geschafft ob die Lösung jetzt allem Standhält muss sich noch herausstellen.

Delphi-Quellcode:
private
  procedure WMInitMenu(var Msg: TWMInitMenu); message WM_INITMENU;

procedure TForm1.WMInitMenu(var Msg: TWMInitMenu);
begin
  //Behandlung abbrechen
  abort;
end;
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf