Heisey, a backup outfielder, also made a perfect throw from the center-field wall to second baseman Kristopher Negron, who threw out Alcides Escobar trying to stretch an extra-base hit into a triple in the fifth.
"He's stayed with his approach. He's putting the barrel of the bat on the ball," Reds' manager Bryan Price said. "I'm very impressed with Chris and the way he's handling himself. He really trusts that he has an approach that will work. Chris is at the point where he can be an everyday player. He is working very hard to get there."
Escobar played his first game since March 9 after recovering from a sore right forearm.
"Escobar hit a nice double and looked good in the field," Royals manager Ned Yost said.
Brett Marshall started in place of Homer Bailey, who threw a bullpen session and is expected to pitch in a minor league game on Sunday. Marshall allowed two runs, two hits and three walks in four innings with four strikeouts.
Royals starter James Shields gave up five runs and six hits in six innings with six strikeouts and no walks.
"He got his work in. He's ready to go," Yost said.
Reds left fielder Skip Schumaker left the game holding his left arm in the seventh after diving to try for Angel Franco's liner, which landed for a double.
"These guys are playing so hard," Price said. "It was a hustle play, trying to keep the ball from getting into the gap. He represents everything we want to do here. I hope he's not out a long period of time because he is really important to our club."