Also wenn es nur ums Repainten geht, dann wäre vll sowas interessant:
stackoverflow.com/a/2183938/1974021
Wenn du das aufrufst (statt Application.ProcessMessages) dann werden nur Paint-Nachrichten verarbeitet, also keine Button-Callbacks oder ähnliches. Natürlich auch keine Tastendrücke.
Wenn das immer noch nicht das ist, was du willst, dann muss ich nochmal nachhaken um dein Problem zu verstehen. Szenario:
1. User klickt Button A. Dieser erledigt viel Arbeit im GUI Thread.
2. User klickt Button B.
3. Callback aus Schritt 1 ruft Application.ProcessMessages auf, was zur Ausführung des Callbacks von Button B führt.
4. Button B soll jetzt "warten" bis das Callback von Button 1 abgeschlossen ist?
Wenn ja: No way. Geht nicht.
Du könntest dir eine eigene ProcessMessages-Funktion schreiben, die einen "Abbruch"-Rückgabewert hat. Aber dann kommst du ja auch nur aus der innersten Funktion raus
Alternativ kannst du auch eine "zweite Messagequeue" aufmachen, in der du diese Sachen einträgst. Deine eigene ProcessMessages-Funktion incrementiert vor dem Aufruf van Application.ProcessMessages eine globale Variable und fecrementiert danach. Wenn am Ende Wert = 0 ist, eine Message an das eigene Fenster posten. In dem Callback dann nochmal prüfen und ggf. den ersten Wert aus dieser zweiten Queue ausführen.
Zusammengefasst: Mach es halt gleich richtig. Lied: Kurzes Einfrieren kann man vll. in Kauf nehmen, lange Berechnungen in einen Thread auslagern.