AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Thema durchsuchen
Ansicht
Themen-Optionen

Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

Ein Thema von Luckie · begonnen am 2. Mai 2005 · letzter Beitrag vom 3. Jun 2005
 
MathiasSimmack
(Gast)

n/a Beiträge
 
#11

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 10:35
Zitat von Mephistopheles:
Wenn ich statt 185 die 191 (die Unicode-Variante) aufrufe, bekomme ich stattdessen den Fehler 1400.
Den Fehler habe ich in beiden Varianten (Ansi und Unicode) erhalten. Laut der Funktion von Luckie (SystemErrorMsg) bedeutet er in Klartext übersetzt Ungültiges Fensterhandle. Er verschwindet erst, wenn du den Dialog nicht mehr anzeigen lässt.
Egal, ich habe beides (Ansi und Unicode) auf einem XP SP2- und auf einem 2000 SP4-Rechner ausprobiert. Ging in beiden Fällen tadellos. Warum sich also XP SP1 beim blutigen Anfänger verschluckt, kann ich nicht erklären. Und warum im PSDK XP SP2 die Funktion genannt wird, nicht aber die Tatsache, dass sie sich offenbar nur mit den numerischen Indexwerten laden lässt, weiß ich ebenso wenig.

Generell finde ich den Dialog etwas nutzlos. Solange man sich den Dialog anzeigen lässt, solange hat man die freie Auswahl. Sobald man ihn jedoch per Option beim nächsten Mal nicht mehr sehen will, benutzt er den Defaultwert. Im PSDK steht ja auch, dass man das nicht mit dem "Diese Antwort merken und beim nächsten Mal nicht mehr fragen"-Dialog durcheinander bringen soll. Wollen wir nicht den suchen? Der muss doch auch irgendwo stecken. Na ja, notfalls hätte ich ein paar kleine API-Registryfunktionen, die das für "SHMessageBoxCheck" nachrüsten
Delphi-Quellcode:
function SHDeleteEmptyKeyA(regKey: HKEY; pszSubKey: PAnsiChar): dword;
  stdcall; external 'shlwapi.dll';

const
  RememberThisAnswerPath =
    'Software\Microsoft\Windows\CurrentVersion\Explorer\RememberThisAnswer';
  HideDialogPath =
    'Software\Microsoft\Windows\CurrentVersion\Explorer\DontShowMeThisDialogAgain';

function RememberThisAnswer(const DialogGuid: PAnsiChar;
  const DialogResult: dword): boolean;
var
  reg : HKEY;
begin
  Result := false;

  if(RegCreateKeyEx(HKEY_CURRENT_USER, RememberThisAnswerPath, 0, nil,
    REG_OPTION_NON_VOLATILE, KEY_READ or KEY_WRITE, nil, reg, nil) =
    ERROR_SUCCESS) then
  try
    Result := RegSetValueEx(reg, DialogGuid, 0, REG_DWORD, @DialogResult,
      sizeof(DialogResult)) = ERROR_SUCCESS;
  finally
    RegCloseKey(reg);
  end;
end;

function GetRememberedAnswer(const DialogGuid: PAnsiChar;
  const DefaultValue: dword): dword;
var
  reg : HKEY;
  dwType,
  dwLen : dword;
begin
  Result := DefaultValue;

  if(RegOpenKeyEx(HKEY_CURRENT_USER, RememberThisAnswerPath, 0,
    KEY_READ, reg) = ERROR_SUCCESS) then
  try
    dwType := REG_NONE;
    dwLen := 0;

    if(RegQueryValueEx(reg, DialogGuid, nil, @dwType, nil, @dwLen) = ERROR_SUCCESS) and
      (dwType = REG_DWORD) and
      (dwLen = sizeof(dword)) then
    begin
      if(RegQueryValueEx(reg, DialogGuid, nil, @dwType,
        @Result, @dwLen) <> ERROR_SUCCESS) then
      Result := DefaultValue;
    end;
  finally
    RegCloseKey(reg);
  end;
end;

procedure DeleteValAndEmptyKey(const RegKey, DialogGuid: PAnsiChar);
var
  reg : HKEY;
begin
  if(RegOpenKeyEx(HKEY_CURRENT_USER, RegKey, 0,
    KEY_READ or KEY_WRITE, reg) = ERROR_SUCCESS) then
  try
    RegDeleteValue(reg, DialogGuid);
  finally
    RegCloseKey(reg);
  end;

  SHDeleteEmptyKeyA(HKEY_CURRENT_USER, RegKey);
end;

procedure DeleteRememberedAnswer(const DialogGuid: PAnsiChar);
begin
  DeleteValAndEmptyKey(RememberThisAnswerPath, DialogGuid);
end;

procedure EnableHiddenDialog(const DialogGuid: PAnsiChar);
begin
  DeleteValAndEmptyKey(HideDialogPath, DialogGuid);
end;


procedure TForm1.Button1Click(Sender: TObject);
const
  RegVal = '2A622957-D0A5-41CA-8571-898247531A2C';
var
  defaultVal,
  dialogResult : dword;
begin
  defaultVal := GetRememberedAnswer(RegVal, ID_YES);
  dialogResult := SHMessageBoxCheckA(self.Handle,'Dies ist nur ein Testtext.',
    'Und dies ist der Titel',MB_YESNO or MB_ICONINFORMATION,defaultVal,RegVal);
  RememberThisAnswer(RegVal, dialogResult);
end;
  Mit Zitat antworten Zitat
 


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:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz