Vancouver took the lead in the final minute of the first period on a terrific breakaway pass from Henrik Sedin and an even better finish from the speedy Hansen.
With the puck inside his own blue-line, Sedin spotted Hansen darting up the ice. Looking like a quarterback waiting for his receiver to get open, Sedin paused as Hansen got open behind Mark Giordano and lofted a long pass that hit him on the fly at the Flames' blue-line.
Hansen took a moment to control the puck and when he did, he quickly whipped a shot into the far corner on Reto Berra.
That would be all the offence Lack would need. Making his third consecutive start with Roberto Luongo (lower body) on injured reserve, Lack won his fifth game in a row and collected his second shutout of the season. On the season, Lack improves to 7-2-0.
Mike Santorelli also scored for Vancouver (23-11-6) , which is 10-1-1 in its last 12. The Canucks, who were playing for the first time in a week, are right back in action Monday night when they take on the Philadelphia Flyers at Rogers Arena.
Calgary (14-19-6) falls to 1-2-0 with two games remaining on its five-game homestand. The Flames next opponent is also Philadelphia, hosting them on New Year's Eve.
Coming off a 2-0 loss to the Edmonton Oilers on Friday, Calgary has been shut out at the Scotiabank Saddledome since before Christmas, a span of 125 minutes and 5 seconds.
In net for the Flames doing pretty much everything he could to keep his team in the game was Berra. With some spectacular saves all game, he kept the game 1-0 until 18:44 of the third period when Santorelli converted a two-on-one on Vancouver's 30th shot of the night.
Berra falls to 5-10-2.
Trailing 1-0 after two periods despite being outshot 24-8, the Flames came out flying in the third pouring on early pressure on Lack.
Two minutes later, Lack stretched out to get a toe on TJ Galiardi's shot from a scramble in front.
It took a while for Lack to face his first shot. The Canucks had built up a 10-0 edge in shots in the first period before Lack was forced to make a solid save at the 13 minute mark off Mike Cammalleri.
The game got off to a rousing start when rugged Flames fourth liner Brian McGrattan got his arm up high on a heavy hit along the side boards in the Canucks end that caught defenceman Andrew Alberts in the head and flattened him.
While Alberts remained down and not , McGrattan squared off in a fight with giant Canucks enforcer Tom Sestito.
McGrattan, who entered the night with 34 penalty minutes in 35 games, got tagged with 20 minutes in the sequence getting a fighting major along with an elbowing major and game misconduct.
Alberts did not return.
Notes: Henrik Sedin needed stitches after getting hit in the ear by a puck in warm-up. He played in his 669 consecutive game, which is the second longest active iron man streak and sixth longest in league history... Flames C Markus Granlund, recalled early this morning from Abbotsford (AHL), did not end up playing when Mikael Backlund was ruled good to go after the warm-up. Granlund, 20, has never played an NHL game... Calgary's only line-up change was inserting Derek Smith on defence for Chris Breen... Twenty-five of the Flames 39 games have been decided by one goal, which leads the NHL. Five more would have been one-goal games if not for an empty goal.