Avalanche center Nathan MacKinnon hit three posts, linemate Mikko Rantanen hit one, and John Mitchell missed an open net.
"It's a game of millimeters," said MacKinnon, who is friends with Crosby, a fellow Nova Scotia native. "I think Sid could have had three or four points tonight. [Goalie Calvin Pickard] made some big saves. Sid made some great passes and eventually you say, 'Wow, how does he do that?' That's why he's been the best for 12 years."
Colorado (15-34-2) won its previous two games by a combined 9-2 score. The Avalanche haven't won three in a row since March of last season.
Hornqvist scored twice in the second period when the Penguins grabbed a 3-0 lead, and Chris Kunitz scored into an empty net with 36.5 seconds remaining.
"We didn't play as good as we wanted, but in the end we won 4-1 and that's what matters," Hornqvist said. "We got goals, but we didn't play the right way. We have to get back to playing more consistently."
Hornqvist made it 2-0 on a power play at 3:50 after Crosby drew a holding penalty against Nikita Zadorov. Justin Schultz dumped the puck into the corner and Phil Kessel passed to Hornqvist for a shot past Pickard, who had 26 saves.
Hornqvist gave the Penguins a 3-0 lead at 18:38 after Schultz intercepted Avalanche defenseman Francois Beauchemin's clearing attempt. He passed to Hornqvist for his 17th goal.
"The first one bounced off I don't know how many guys and came right on my stick," Hornqvist said. "The other one, [Schultz] did a good job keeping it in and shot it. Some nights you find those loose pucks."
Kessel gave the Penguins a 1-0 lead at 4:01 of the first period on a 2-on-1 rush for his 18th goal.