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;