Three players were dismissed as the Reds held on to take all three points, thanks to goals from Szabolcs Huszti, who received one of the red cards, and Mame Diouf.
Adam Szalai scored Schalke's consolation, but they lost Benedikt Howedes and Christian Fuchs, as well as their second game in three this season.
Schalke came into the game under enough pressure following a 1-1 draw with PAOK in the Champions League play-offs in midweek and the last thing they needed was to be reduced to 10 men after just 15 minutes.
Howedes was shown the third red card of his career after giving away a penalty for a foul on Diouf inside the penalty area.
As the Schalke captain was heading down the tunnel, Huszti swept in his 11th successful penalty to give the Reds the lead.
The home side had a good shout for another penalty in the 22nd minute when Diouf went down once again, but this time the referee waved away their appeal.
Diouf continued to menace a disorganised Schalke defence to the point when Keller had to respond and he sent defender Felipe Santana on for midfielder Leon Goretzka.
The former Dortmund defender was nowhere to be seen when Diouf stole in to nod Hannover two up from Huszti's cross just before half-time as Hannover made their pressure count.
Diouf and Artur Sobiech both missed chances to make it 3-0 before Szalai reduced the arrears and gave the Royal Blues hope going into the final 35 minutes.
Roman Neustadter laid the ball down for the Hungarian to score his second of the season to open the game up.
Szalai should have scored again 10 minutes later, but managed to miss an open goal.
Schalke's hopes of levelling were given a further boost when Huszti was shown a straight red card for a foul on Tim Hoogland.
As they searched for an equaliser, they were reduced to nine men with Fuchs receiving his second yellow card five minutes from the end.