This took me a while to realize, so I though I'd share it: If you want to install a custom active scheduler in a UI thread, you have to derive your scheduler from CCoeScheduler (and not, e.g., CBaActiveScheduler), otherwise you'll get no UI events. And if you override the WaitForAnyRequest function, call CCoeScheduler::WaitForAnyRequest in it. I assume that the CCoeScheduler is doing the requesting of UI events.