Nevermind, I've already found a solution which works:
MF := UniApplication.UniMainModule.MainForm;
if (MF <> nil) and (MF is TUniForm) and (TUniForm(MF).WebForm <> nil) then
begin
EF := TUniExtFormAccess(TUniForm(MF).WebForm);
CBF := TCallbackExtFunction.Create(aCallback);
CBF.FAjaxIntercept := EF.AjaxParamIntercept;
CBF.FAjaxParamListIntercept := EF.AjaxParamListIntercept;
CBF.Ajax('callback', ['ButtonID', '%0'], True);
...
procedure TCallbackExtFunction.HandleEvent(const AEventName: string);
var
MR: Integer;
begin
if SameText(AEventName, 'callback') then
begin
if Assigned(FCallback) then
begin
if (ButtonsDict = nil) or not ButtonsDict.TryGetValue(ParamAsString('ButtonID'), MR) then
MR := mrNone;
FCallback(MR);
end;
FCallback := nil;
end
else
inherited;
end;
initialization
ButtonsDict := TTextDictionary<Integer>.Create;
ButtonsDict.AddOrSetValue('ok', mrOk);
ButtonsDict.AddOrSetValue('cancel', mrCancel);
ButtonsDict.AddOrSetValue('yes', mrYes);
ButtonsDict.AddOrSetValue('no', mrNo);