@Bug:
Das wird so nicht funktionieren, weil (zumindest bei mir) MsgWaitForMultipleObjects sofort zurückkehrt und konstant 1 als Resultat liefert. Zum Drücken einer Taste kommt es also gar nicht.
Ich habe mein Problem jetzt so gelöst:
Delphi-Quellcode:
PROCEDURE TMain.Speak(Const S:String);
var Res:DWord; EV:THandle;
begin
Timer.Enabled:=False;
Voice.Skip('SENTENCE',MaxInt);
fSpeakCancelled:=False;
Voice.Speak(S,1);
EV:=Voice.SpeakCompleteEvent;
repeat
Res:=WaitForSingleObject(Ev,100);
if Res=WAIT_TIMEOUT then Application.Processmessages;
until (Res<>WAIT_TIMEOUT) or SpeakCancelled;
if not SpeakCancelled then Timer.Enabled:=True;
end;
fSpeakCancelled wird in FormShortCut dann auf True gesetzt, wenn eine Taste gedrückt wird.
Mit Voice.WaitUntilDone klappte das merkwürdigerweise nicht.
Danke für Deinen Hinweis auf WaitForSingleObject, das ich von vornherein verworfen hatte.
Da ich ja nicht nur auf das Ende der Sprachausgabe sondern parallel auch auf Tastendrücke warten wollte war ich auf MsgWaitForMultipleObjects fixiert.