type
TSaveDialog = class(Dialogs.TSaveDialog)
private
FHooking: Boolean;
FHookProc: Pointer;
FParent: HWND;
FWndHook: HHOOK;
procedure HookProc(var Message: THookMessage);
procedure SetParent(const Value: TWinControl);
protected
function TaskModalDialog(DialogFunc: Pointer;
var DialogData): LongBool; override;
public
function Execute: Boolean; override;
property Parent: TWinControl write SetParent;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveDialog1.Parent := Self;
SaveDialog1.Execute;
end;
{ TSaveDialog }
function TSaveDialog.Execute: Boolean;
begin
try
try
FHookProc := MakeHookInstance(HookProc);
FWndHook := SetWindowsHookEx(WH_CALLWNDPROCRET, FHookProc, 0,
GetCurrentThreadID);
Result := inherited Execute;
finally
if FWndHook <> 0 then
UnhookWindowsHookEx(FWndHook);
if FHookProc <> nil then
FreeHookInstance(FHookProc);
end;
except
Result := False;
end;
end;
procedure TSaveDialog.HookProc(var Message: THookMessage);
var
Data: PCWPRetStruct;
Title: array[0..MAX_PATH] of Char;
ParentRect: TRect;
Rect: TRect;
X: Integer;
Y: Integer;
begin
if (not FHooking) and (Message.nCode = HC_ACTION) then
begin
Data := PCWPRetStruct(Message.lParam);
if Data.message = WM_WINDOWPOSCHANGED then
begin
GetWindowText(Data.hwnd, @Title, SizeOf(Title));
if String(Title) = 'Opslaan als' then
begin
FHooking := True;
GetWindowRect(FParent, ParentRect);
GetWindowRect(Data.hwnd, Rect);
with ParentRect do
begin
X := ((Right - Left - Rect.Right + Rect.Left) div 2) + Left;
Y := ((Bottom - Top - Rect.Bottom + Rect.Top) div 2) + Top;
end;
SetWindowPos(Data.hwnd, 0, X, Y, 0, 0, SWP_NOACTIVATE or
SWP_NOOWNERZORDER or SWP_NOSIZE or SWP_NOZORDER);
end;
end;
end;
with Message do
if nCode < 0 then
Result := CallNextHookEx(FWndHook, nCode, wParam, lParam)
else
Result := 0;
if FHooking then
begin
UnhookWindowsHookEx(FWndHook);
FWndHook := 0;
FreeHookInstance(FHookProc);
FHookProc := nil;
FHooking := False;
end;
end;
procedure TSaveDialog.SetParent(const Value: TWinControl);
begin
if Value = nil then
FParent := GetDesktopWindow
else
FParent := Value.Handle;
end;
Bookmarks