Try using the onobjectvalidate script trigger.
Tried that already with no luck. If cursor is in field with trigger and not modified or null, Clicking a button object will run button object script first, then script trigger on field in question.
There's possibly an easier solution, but what comes to (my) mind is to use the same validation script for both OnObjectEnter and OnObjectExit triggers, but with a different parameter for each trigger, e.g. "enter" and "exit".
Then add to your validation script an If [ Get ( Script Parameter ) = "enter" ] ; Set Variable [ $$someVariable ; Value: 1 ] ; Exit Script  ; End If, and in the button script check for $$someVariable, i.e. If [ $$someVariable ] ; Exit  ; End If.
Wrap the rest of the validation script into an If [ Get ( ScriptParameter ) = "exit" ] statement, and don't forget to Set Variable [ $$someVariable ; "" ] at the end to reset/delete it.
This is expected behaviour since clicking a button does not cause the active field to lose focus.
Without knowing specifically the button script's purpose it's hard to advise further; however, a couple of things:
1. You can check Get ( ActiveFieldName ) at the head of the button script and act accordingly - maybe by committing the record if there is an active field
2. If the button script performs any action that causes the active field to be exited - e.g. Commit Record or Go To Layout (which implicitly commits the record), the OnObjectExit (and/or OnObjectSave and/or OnObjectValidate) script will run before that action is completed; the validation script result can then be checked in the button script