"We're playing better," MacTavish said. "This was a really solid game for us. It was another one-goal win but at the same time it wasn't indicative of some of the other ones where we are trying to hang on at the end. We had lots of chances in the third period to widen the lead.
"It's as complete a game as we have played from start to finish this season, he said."
The Oilers (21-21-4) moved back to the .500 mark and have a winning record at home after taking the first four of a five-game homestand.
"This was a big step for us," Horcoff said. "We had won three in a row and we could have had a real letdown if we had come out and had a bad effort against these guys. We need wins. We need to go on a roll. And we came out and played hard and it was a good result for us."
It was the third loss in a row for the Flames following a five-game winning streak.
Daymond Langkow had the lone goal for Calgary.
"In our last few games, let's be honest, we've slipped a bit and we have to get back at it," Calgary captain Jarome Iginla said.
The Oilers took a 1-0 lead eight minutes in when Jarret Stoll's point shot caromed off the boards behind the net straight to the stick of Horcoff. He swept in his 19th of the season, past Calgary goaltender Miikka Kiprusoff during a power play.
Edmonton had 11 first-period shots, and Calgary put eight on Oilers goalie Mathieu Garon.
The Oilers stretched their lead 35 seconds into the second period on a tremendous effort by Hemsky. He danced around Flames defenseman Robyn Regehr and then deked Kiprusoff before putting a backhander into the net to make it 2-0.
"We all saw the irony in that," MacTavish said. "Regehr roughs him up a bit after a whistle and 15 seconds later he's past him and it's in the net."
Calgary got on the board three minutes into the third. Garon allowed a big rebound on Iginla's shot, and Langkow was there to pick it up and backhand a shot through the legs of Steve Staios.
The Flames applied some late pressure but Garon proved to be up to the task, stopping 27 shots to preserve the victory.
"It was a huge win," said Garon, who made his sixth straight start and has eclipsed Dwayne Roloson as Edmonton's main goaltender. "We wanted to win as much as possible on this homestand and right now we are doing a really good job. I think the way everyone is playing, there is so much confidence right now."
- Calgary LW Marcus Nilson, a healthy scratch in 14 of Calgary's previous 15 games, was in the lineup in place of Wayne Primeau.
- D Joni Pitkanen returned to the Oilers lineup after missing one game with the flu. Dick Tarnstrom was a healthy scratch.
- Edmonton hadn't won four straight since November 2006.
- The teams have split four games this season.