Villa paid the price for one lapse of concentration as they slipped to a defeat which leaves them in the bottom three.
A slip by skipper Ciaran Clark on the stroke of half-time enabled substitute Edin Dzeko to set up Carlos Tevez for the only goal of Villa's 800th Premier League game.
Paul Lambert's men had been unfortunate not to go ahead when Christian Benteke's header was cleared off the line by Tevez, although City twice hit the post.
The manager will now be looking for a maximum points return from back-to-back games against fellows strugglers Reading on Saturday and QPR the following weekend.
Some of Villa's early play was a delight to watch and there was little indication that this was a contest between a team second in the table and one near the bottom.
Joe Bennett delivered a probing, curling sixth-minute cross which had City in trouble, the ball deflecting for a corner.
Benteke headed over from Ashley Westwood's flag kick.
And in the 21st minute the home side were desperately unlucky not to take the lead, Benteke meeting Charles N'Zogbia's corner from the left with a powerful header which cleared off the line by Tevez, the Argentine striker booting the ball away from just inside the post.
Even then, there was still danger, the ball running loose to Matt Lowton, who fired just over from 30 yards.
A minute later City produced their first real threat.
Jack Rodwell had earlier fired well off target but this time his powerful angled drive was heading towards the top corner until Brad Guzan managed to tip it away.
James Milner also tested Guzan, the former Villa man striking a free-kick low and hard from just outside the left-hand edge of the penalty area.
The ball skidded through a mass of legs but the American keeper held it firmly as he fell.
That was nothing, to be fair, with the save Guzan made on 37 minutes, when Villa were fortunate not to concede.
Pablo Zabaleta cut inside from the right to unleash a left-foot shot which the keeper, at full stretch, pushed against the inside of the far post.
Luckily, the ball rebounded across the goalmouth and was cleared, although Guzan was now the busiest player of the pitch and he saved from both Tevez and sub Dzeko in the space of a minute as the interval approached.
But in first half stoppage time, Clark was dispossessed by Dzeko, who strode forward before playing a short pass to Tevez.
The striker slipped past Guzan and rolled home as simple a goal as he will ever score.
The opening period ended with Andreas Weimann having a volley blocked, although City resumed on the offensive, Dzeko seeing a shot hit Bennett and go behind before Lowton cleared off the line from Tevez.
Villa had lost some of their earlier frisky ambition, although they suddenly burst into life just past the hour mark.
Lowton's fine pass down the right and Weimann's superb cross paved the way for a near-post Agbonlahor header which deflected for a corner.
Benteke's header from N'Zogbia's flag-kick suffered the same fate, and then Lowton ventured forward for a 20-yarder which flashed only narrowly wide as Hart scrambled across his line.
At the other end, Yaya Toure hit the inside of the post with a low left-foot drive before Dzeko curled his shot just beyond the far upright.
As Villa went in search of an equaliser, Weimann fired well over before Benteke tried a header which didn't carry sufficient power to worry Hart.
Villa: Guzan; Lowton, Clark, Baker, Bennett; Westwood, Delph; Weimann (El Ahmadi 85), N'Zogbia (Holman 65), Agbonlahor; Benteke. Unused subs: Given, Sylla, Bowery, Lichaj.
Man City: Hart; Zabaleta, K Toure, Nastasic, Clichy; Garcia, Rodwell (Dzeko 25); Milner, Y Toure, Silva (Barry 90); Tevez (Nasri 75). Unused subs: Pantilimon, Lescott, Sinclair, Kolarov.