Acredito que não exista uma forma de substituir a ação do botão fechar. Ele simplesmente executa o método End() da MsDialog, fechando a janela.
O que você pode fazer é inibir a exibição do botão fechar e criar um botão fechar customizado, podendo fazer algumas verificações antes de fechar a tela.
Exemplo:
Private oDlg
// o style DS_MODALFRAME inibe a exibição do botão X/fechar
Define MsDialog oDlg Title '' From 001, 001 To 140, 380 Pixel Style DS_MODALFRAME
TButton():New(040, 075, 'Fechar', oDlg, { || FechaDialog() }, 040, 014, , , , .T., , '', , , , .F.)
// impede o usuário de fechar a janela ao apertar o Esc
oDlg:lEscClose := .F.
Activate MsDialog oDlg Centered
Dentro da função FechaDialog, chamado no botão Fechar, você pode criar sua lógica e então finalizar a tela.
Exemplo:
Static Function FechaDialog
// crio minha lógica antes de fechar a janela
// fecho a janela
oDlg:End()
Return