[Erledigt] Fenster schließen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: [Erledigt] Fenster schließen

Beitrag von ts-soft »

Ich hab hier noch eine andere Lösung, die kannst Du auch jetzt schon einsetzen:

Code: Alles auswählen

EnableExplicit

Prototype SHMessageBoxCheck(hWnd, Text.s, Caption.s, uType, iDefault, RegVal.s)
Procedure MessageRequesterCheck(Titel.s, Text.s, RegVal.s, Flags = 0)
  Protected hDLL = OpenLibrary(#PB_Any, "Shlwapi.dll")
  Protected SHMessageBoxCheck.SHMessageBoxCheck
  Protected result
 
  CompilerIf #PB_Compiler_Unicode
    SHMessageBoxCheck = GetFunctionEntry(hDLL, 191)
  CompilerElse
    SHMessageBoxCheck = GetFunctionEntry(hDLL, 185)
  CompilerEndIf
  If SHMessageBoxCheck
    result = SHMessageBoxCheck(0, Text, Titel, Flags, #PB_Ignore, RegVal)
  Else
    result = MessageRequester(Text, Titel, Flags)
  EndIf
  CloseLibrary(hDLL)
  ProcedureReturn result
EndProcedure

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "bla")
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Select MessageRequesterCheck("Nervende Frage:", "Willst Du das Fenster wirklich schliessen oder " + #LF$ + "haste aus Langeweile das Schliessenkreuz gedrückt?", "Pure_Beginner_EinmaligerString", #PB_MessageRequester_YesNo)
        Case #PB_MessageRequester_Yes, #PB_Ignore
          Break
      EndSelect
  EndSelect
ForEver
Den Text: "Pure_Beginner_EinmaligerString" solltest Du nur in einem Programm nutzen!

// geändert
Zuletzt geändert von ts-soft am 14.03.2012 15:24, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: [Erledigt] Fenster schließen

Beitrag von Shardik »

Hallo Thomas,

Dein Code-Beispiel produziert bei mir unter Windows XP SP3
einen "Ungültigen Speicherzugriff (Lesefehler an Adresse 0)"
beim Aufruf von SHMessageBoxCheck()... :mrgreen:

Unter Windows 7 SP1 x32 funktioniert Dein Beispiel. Der Grund
liegt darin, daß Du nicht überprüfst, ob GetFunction() einen Wert
von 0 zurückgegeben hat. In der Shlwapi.dll von Windows XP
werden anscheinend die Funktionsnamen SHMessageBoxCheckA
und SHMessageBoxCheckW nicht exportiert, sondern nur der
Index ihrer Funktionseinträge:
http://www.codeguru.com/forum/archive/i ... 55698.html

In Paules PC-Forum hattes Du auch schon einmal einen Thread mit
einem Code-Beispiel gestartet. Auf den dort geäußerten Hinweis
eines Anwenders, daß die Funktion in der Shlwapi.dll seines
Windows XP SP2 nicht gefunden wird, hattest Du lediglich
geantwortet:
ts-soft hat geschrieben:Shlwapi.dll (version 5.0 or later)
Ab Windows 2000 immer vorhanden! Lediglich der Registry-Eintrag könnte
unter älteren Systemen leicht woanders sein.
Das Problem ist aber nicht, daß die Shlwapi.dll nicht vorhanden ist,
sondern daß der Funktionsname anscheinend in einigen Versionen
der DLL nicht exportiert wird... :wink:

Ich habe daher Dein Beispiel entsprechend angepaßt:

Code: Alles auswählen

EnableExplicit

Prototype SHMessageBoxCheck(hWnd, Text.s, Caption.s, uType, iDefault, RegVal.s)
Procedure MessageRequesterCheck(Titel.s, Text.s, RegVal.s, Flags = 0)
  Protected hDLL = OpenLibrary(#PB_Any, "Shlwapi.dll")
  Protected SHMessageBoxCheck.SHMessageBoxCheck
  Protected result
 
  CompilerIf #PB_Compiler_Unicode
    SHMessageBoxCheck = GetFunction(hDLL, "SHMessageBoxCheckW")

    If SHMessageBoxCheck = 0
      If OSVersion() = #PB_OS_Windows_XP
        SHMessageBoxCheck = GetFunctionEntry(hDLL, 191)
      EndIf
    EndIf
  CompilerElse
    SHMessageBoxCheck = GetFunction(hDLL, "SHMessageBoxCheckA")

    If SHMessageBoxCheck = 0
      If OSVersion() = #PB_OS_Windows_XP
        SHMessageBoxCheck = GetFunctionEntry(hDLL, 185)
      EndIf
    EndIf
  CompilerEndIf

  If SHMessageBoxCheck
    result = SHMessageBoxCheck(0, Text, Titel, Flags, #PB_Ignore, RegVal)
  EndIf

  CloseLibrary(hDLL)
  ProcedureReturn result
EndProcedure

OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "bla")
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Select MessageRequesterCheck("Nervende Frage:", "Willst Du das Fenster wirklich schliessen oder " + #LF$ + "haste aus Langeweile das Schliessenkreuz gedrückt?", "Pure_Beginner_EinmaligerString", #PB_MessageRequester_YesNo)
        Case #PB_MessageRequester_Yes, #PB_Ignore
          Break
      EndSelect
  EndSelect
ForEver
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: [Erledigt] Fenster schließen

Beitrag von ts-soft »

@Shardik
Danke für den Hinweis und den Code. Habe diesen oben in kürzerer Version geändert und
gleich noch ein Fallback eingebaut!
Der FunctionEntry funktioniert nämlich auch unter den anderen OS, zumind. XP und 7.

Zum Rückgängigmachen kann man einfach in RegEdit nach "Pure_Beginner_EinmaligerString" suchen,
dieser sollte sich in einem Eintrag Namens "DontShowMeThisDialogAgain" befinden. Dort den Eintrag
"Pure_Beginner_EinmaligerString" löschen. Auch wenn der Eintrag mehrmals auftaucht, er muss nur
einmal gelöscht werden.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: [Erledigt] Fenster schließen

Beitrag von Pure_Beginner »

das ist eine ziemlich Coole Sache,

auch wenn ich gestehen muss, dass ich nix strahle :oops:

Grüße
Pure_Beginner

Ps.
komme schon noch drauf, aber nie dahinter :lol:
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: [Erledigt] Fenster schließen

Beitrag von ts-soft »

Wenn Du nicht mehr Anzeigen ankreuzt, wird ein Eintrag in der Registry gemacht.
Findet der MessageRequesterCheck diesen Eintrag, gibt er als Ergebnis den Wert
zurück, den ich als "Default" registriert habe, also in diesem Falle: #PB_Ignore.
#PB_Ignore habe ich gewählt, weil die MessageBox diesen Wert normalerweise
nie zurückgeben würde, somit Verwechslungen ausgeschlossen sind.
Auf #PB_Ignore muss ich so reagieren wie es normal sein sollte, also Fenster
schließen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: [Erledigt] Fenster schließen

Beitrag von RSBasic »

Wenn man wissen möchte, wo dieser Eintrag erstellt wird: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\DontShowMeThisDialogAgain\
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Pure_Beginner
Beiträge: 247
Registriert: 29.09.2011 21:49
Computerausstattung: i7 9XX 4000 MHZ / 12 GB RAM / Win 8.1 64Bit / Win 7 64Bit
Wohnort: Brühl

Re: [Erledigt] Fenster schließen

Beitrag von Pure_Beginner »

Hallo TS-Soft,

besten Dank für die Erklärung, jetzt wir es etwas verständlicher.

Grüße
Pure_Beginner
PureBasic 5.30 Beta 3 (X64/X86) | Win 8 (64) Pro / Win 7 (64) Pro | Es ist der Hobbyist[/col
Antworten