Seite 2 von 2

Re: [Erledigt] Fenster schließen

Verfasst: 14.03.2012 00:36
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

Re: [Erledigt] Fenster schließen

Verfasst: 14.03.2012 12:59
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

Re: [Erledigt] Fenster schließen

Verfasst: 14.03.2012 15:26
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

Re: [Erledigt] Fenster schließen

Verfasst: 14.03.2012 19:46
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:

Re: [Erledigt] Fenster schließen

Verfasst: 14.03.2012 20:37
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.

Re: [Erledigt] Fenster schließen

Verfasst: 14.03.2012 20:46
von RSBasic
Wenn man wissen möchte, wo dieser Eintrag erstellt wird: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\DontShowMeThisDialogAgain\

Re: [Erledigt] Fenster schließen

Verfasst: 14.03.2012 20:47
von Pure_Beginner
Hallo TS-Soft,

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

Grüße
Pure_Beginner