Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 

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