The hosts at the BayArena survived the late dismissal of Tin Jedvaj to win their fourth game of the season and condemn Di Matteo to defeat in his third game in charge.
© Getty Images
There were early chances aplenty as Emir Spahic headed over and Karim Bellarabi shot at Ralf Fahrmann for Bayer, while Julian Draxler went close at the near post following a good run and cross from Atsuto Uchida.
Schalke rarely threatened again during the remainder of a first half in which Calhanoglu twice tested Fahrmann from distance and Jedvaj dragged a Heung-Min Son layoff wide from the edge of the box.
Stefan Kiessling missed a glorious chance to head in only his second Bundesliga goal of the season before Calhanoglu's unstoppable free kick from the left of centre on 53 minutes put Leverkusen ahead.
Klaas Jan Huntelaar, who scored to help Di Matteo to wins over Werder Bremen and Sporting Lisbon, saw his only effort of the game blocked by Wendell on 68 minutes as Schalke struggled in their search for an equaliser.
In contrast, Leverkusen were threatening on every attack as Kiessling, Bellarabi and Calhanoglu went close to extending their lead, but they handed the visitors a lifeline when Jedvaj lunged in on Jan Kirchhoff on 85 minutes.
However, they hung on comfortably to end a run of three consecutive draws and climb to fourth in the table.