unit Unit1; {$mode objfpc}{$H+}interfaceuses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;type { TForm1 } TForm1 = class(TForm) Button1: TButton; Label1: TLabel; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation{$R *.lfm}{ TForm1 }procedure TForm1.Button1Click(Sender: TObject);begin if OpenDialog1.Execute() then label1.Caption := OpenDialog1.FileName else label1.Caption := '';end;end.
function OpenFileDialogCallBack(Wnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): UINT_PTR; stdcall;begin Result := 0; if uMsg = WM_INITDIALOG then begin SetWindowPos(GetParent(Wnd), HWND_TOP, Form1.Left, Form1.Top, 0, 0, SWP_NOSIZE); end else if (uMsg = WM_NOTIFY) and (lParam<>0) and (LPOFNOTIFY(lParam)^.hdr.code= CDN_SELCHANGE) then begin SetWindowPos(GetParent(Wnd), HWND_TOP, Form1.Left, Form1.Top, 0, 0, SWP_NOSIZE); result:=Form1.OldHook(Wnd,uMsg,wParam,lParam); end else result:=Form1.OldHook(Wnd,uMsg,wParam,lParam);end;procedure TForm1.OpenDialog1Show(Sender: TObject);begin if LPOPENFILENAME(OpenDialog1.Handle)^.lpfnHook<>@OpenFileDialogCallBack then begin OldHook:=LPOPENFILENAME(OpenDialog1.Handle)^.lpfnHook; LPOPENFILENAME(OpenDialog1.Handle)^.lpfnHook:=@OpenFileDialogCallBack; end else LPOPENFILENAME(Form1.OpenDialog1.Handle)^.lpfnHook:=Form1.OldHook;end;