CLEVELAND (AP) -- Jake Westbrook was so focused he hardly noticed an approaching thunderstorm.
"I didn't really know about the storm, I just wanted to go out and get it over with," said Westbrook (4-2), who maintained his focus in a rainy ninth inning to complete his second career shutout and first since June 14, 2004, against Baltimore.
Cleveland got only three hits but took advantage of seven walks to win for the second time after a six-game losing streak. Hafner broke that streak with a game-winning two-run homer in a 6-4 win over the Royals on Tuesday night.
The Royals fell to 2-19 on the road, tying the worst start away from home in major-league history. They have lost five straight overall and are a season-low 17 games under .500.
"It's ridiculous, without a doubt," third baseman Tony Graffanino said. "Whatever we are doing isn't good enough."
Westbrook won for just the second time in seven starts since April 9. He didn't walk a batter and struck out two -- both in the first inning. Then he used a sharp sinker to record 18 outs on grounders, including every out of the third through fifth innings.
"He lives and dies with that sinker," said Graffanino, who got one of the Royals' six singles. "When he spots it like that, he's pretty effective."
It was Cleveland's first complete-game shutout since C.C. Sabathia did it Sept. 4, 2004, at Seattle.
"Every starting pitcher's goal is to finish the ballgame," Westbrook said. "It's a nice feeling."
Hafner was 0-for-7 in his career against Jeremy Affeldt (2-3) until connecting in the third. He joined Texas' Kevin Mench as the
only players with two grand slams this season. Hafner also did it May 1 against the Chicago White Sox.
Affeldt walked Grady Sizemore and Jason Michaels with one out in the third. Jhonny Peralta reached on an error by Graffanino to load the bases for Hafner, who hit the next pitch into the right-field seats for a 5-0 lead.
"He throws a cutter to me quite a bit, but this time it was a fastball down the middle," said Hafner, who homered in consecutive games for the seventh time this season.
Six of Hafner's 13 homers, including the last two against Kansas City, have come against left-handers.
"I'm feeling more comfortable against them," said Hafner, who is hitting .365 (23-for-63) with 20 RBI against lefties. "I hit them pretty well in the minors, but they are a lot tougher in the big leagues. It's been a progressive thing for me and I do feel good up there this year against them."
Casey Blake put Cleveland ahead 1-0 with an RBI single in the second. The sharp single to right extended his career-high hitting streak to 14 games and gave him a .529 (9-for-17) average with runners in scoring position and two outs this season.
Affeldt allowed four earned runs and three hits over six innings. He walked six and struck out one.
"The walks pretty much buried our team," he said. "I just couldn't find the plate. Then Hafner did exactly what he should have done with that pitch -- put it in the seats."
Indians catcher Victor Martinez went 0-for-3 and is mired in an 0-for-21 slump. ... Hafner also walked three times and is 6-for-10 over his last three games. ... Indians second baseman Ronnie Belliard went 1-for-3 and is 7-for-15 over his last four games against Kansas City. ... Royals first baseman Doug Mientkiewicz is hitting .385 (10-for-26) against Cleveland this year. ... The Royals have been outscored 134-57 on the road.