It was Price's first shutout of the season and 20th of his career. Ondrej Pavelec faced 25 shots for the Jets (3-4-0).
Brandon Prust, P.K. Subban and Daniel Briere, with an empty netter on the power play, scored for Montreal (4-2-0), which ended a four-game road trip and returns home for five straight.
It was the third of a six-game homestand for the Jets, the longest of their season. They host St. Louis on Friday.
With a number of fans wearing Habs jerseys in the stands at MTS Centre, the visitors quickly opened the scoring.
A Briere shot off the boards led to Prust's goal, as the puck bounced to him at the corner of the net and he poked it in behind Pavelec to make it 1-0 at 2:06.
It took the Jets just under seven minutes to get their first shot on goal, a span that included their own power play, as the Habs kept most of the action in Winnipeg's end.
Winnipeg killed off a penalty, but about a minute later Subban blasted a one-timer past Pavelec at 11:28, his eighth point in six games. The shots on goal at that point were 7-1 for Montreal.
The Jets finally turned it on during another power play, boosting their shots on goal to close Montreal's advantage to 10-8 at the end of the first period.
Canadiens forward Max Pacioretty fell to the ice during the first period after getting tangled between a couple of Jets players on the way to the net. He didn't put any weight on his left leg as he was helped off the ice and didn't return.
The Jets kept pace with the Habs in the scoreless second period and took the lead in shots on goal 21-19.
Despite quickly starting the third period shorthanded, Winnipeg had some early scoring chances, including two by captain Andrew Ladd.
Head coach Claude Noel kept the same lines he did in Sunday's 3-0 win over New Jersey, which saw Ladd move from the top line to the second one with rookie centre Mark Scheifele and Michael Frolik.
Evander Kane was on the top line with centre Bryan Little and right-winger Blake Wheeler.
Winnipeg went on the power play with seven minutes left in the game after Briere was called for hooking, but Price made one save and Ryan White blocked the other shot.
With Pavelec pulled and the Jets shorthanded because of a Little cross-checking penalty, Briere scored his first of the season at 18:42.
Notes — Canadiens captain Brian Gionta returned to the lineup for his 700th career NHL game after missing one game to attend to family matters in Montreal. … Habs defenceman Josh Gorges played in his 500th game and assisted on Subban's goal. … Tomas Plekanec is two points shy of 400th point with the Canadiens.