The goals were 34 seconds apart and gave the Oilers, who scored on their first shots of each period, a commanding 3-0 lead. Tjarnqvist and Lupul counted after the Canucks had to juggle a depleted lineup after defenceman Sami Salo and forwards Taylor Pyatt and Rick Rypien to first-period injuries.
The Canucks outshot Edmonton 36-18, but Oilers goalie Dwayne Roloson earned his second shutout of the season and 20th of his career. He was helped by Canuck shooters who missed several scoring opportunities.
Tjarnqvist scored when his deflected shot found its way through traffic in front of Vancouver netminder Roberto Luongo.
Lupul made it three goals on six shots by stealing the puck off defenceman Lukas Krajicek and going unchecked to the front of the Vancouver net where Shawn Horcoff was screening Luongo.
Horcoff got Edmonton's first goal while Raffi Torres scored in the third period after Jarret Stoll intercepted Daniel Sedin's outlet pass up the middle.
The win snapped a three-game Oilers losing streak - all at home - and moved them two points ahead of the Minnesota Wild and three ahead of Vancouver.
Edmonton improved to 14-10-2 without Ryan Smyth (broken thumb), their leading goal-scorer, and Ales Hemsky (shoulder), the club's assist leader.
The Canucks, who have won only two of 10 division games, missed a chance to overtake both Edmonton and Minnesota and slipped to 13-14-1.
Roloson, who was pulled from his last two starts - 4-0 and 7-3 losses - saw his team outshot but the Canucks couldn't find a way to score.
Daniel Sedin put the puck in the net after it was 3-0 but twin brother Henrik was called for goaltender interference.
The chance came after Kevin Bieksa beat Roloson but hit the post. Trevor Linden then shot wide on a two-on-one shorthanded breakaway.
Alex Burrows, who hasn't scored for 37 games, appeared to stuff the puck past Roloson but a video review showed it didn't cross the goal line.
Vancouver's anemic offence has produced two or fewer goals in 15 of the last 17 games.
The Canucks outshot Edmonton 11-4 in the first period but the Oilers took a 1-0 lead on a double-deflection power-play goal.
Horcoff was credited for his third goal of the season when he fired from 35 feet after taking Petr Sykora's pass.
Bieksa partly blocked the shot with his stick but the puck hit teammate Willie Mitchell and floated past Luongo.
The goal came after the Oilers had killed two early Vancouver power plays. It was only the fifth power-play goal yielded by the Canucks in 14 home games.
NOTES: Canuck Jan Bulis played his 500th NHL game ... Luongo leads NHL goalies with 26 games played and in ice time ... Matt Cooke was back in the Vancouver lineup after missing one game with a rib injury ... the two teams split their previous games, each winning 2-1 at home ... it was the Oilers' first road game in three weeks ... Brad Winchester, a healthy scratch on Saturday, drew into the lineup to replace Smyth ... Edmonton has also recalled Alexei Mikhnov from AHL Wilkes-Barre who could provide power-play help.