Full-time from Oakwell
Winnall was perfectly placed to head home Hammill's 12th-minute cross to put the home side ahead, but Morison equalised just past the hour-mark only for Hammill to secure victory for The Tykes with a super 70th-minute finish to settle this match in the drizzle on a heavy Oakwell pitch.
The Lions twice had efforts cleared off the line and hit the woodwork in a barnstorming finale, but Neil Harris' men just could not force that all-important second goal to claim the share of the points that their second-half display deserved.
Boss Harris was forced to make one change from the team that started against Southend United with right-back Shaun Cummings unavailable after sustaining a slight knock in that game. Carlos Edwards slotted in to another otherwise unchanged team, although fit-again striker Lee Gregory made a timely return from a hamstring strain to take his place on the bench.
Barnsley, fresh from a 4-2 Bank Holiday Monday thrumping of Blackpool, stuck with the same side for a second consecutive match.
There was an early scare for The Lions when left-back Joe Martin went to ground following a heavy challenge by Reece Wabara with barely 65 seconds on the clock, but thankfully he was able to rejoin the action after treatment from physio Bobby Bacic.
The Lions forced two corners in the opening seven minutes, but it was the home side who created the first clear scoring chance of the game.
The home side were on the attack again on 12 minutes when an attempted clearance by Byron Webster smashed against Marley Watkins, the ball ran straight to Winnall but he was denied by a last-ditch tackle from Mark Beevers.
There was to be no respite, however, and when the resulting corner was played short to Hammill he whipped over an inviting cross and Winnall ghosted in at the back post to head home with keeper David Forde rooted to the spot.
Hammill was a whisker away from doubling Barnsley's tally midway through the first-half, drifting in from the left and letting fly with a 20-yarder that dipped over the bar.
Barnsley had the ball in the back of the net in the 31st-minute when Watkins headed home from a near-identical position to goal-scorer Winnall, but on this occasion The Lions were saved by the assistant linesman who had spotted a foul on Beevers and the effort was ruled out.
A wayward pass from deep in the Barnsley half by Fred Onyedinma was intercepted on the halfway line and The Reds surged forward again, with the lively Winnall denied by a superb sliding tackle from Martin as he prepared to pull the trigger.
It took until the 41st-minute of the half for Millwall to test Adam Davies in the home goal; Shaun Williams dinked over a free-kick from the right after Onyedinma had been fouled by Aidan White and defender Beevers rose high to direct a header towards goal that the keeper held at the second attempt.
That proved to be a rare moment of excitement for The Lions fans in the opening 45 minutes, who expressed their frustration as the teams left the field at half-time.
Millwall made a double change at the break, bringing on Shane Ferguson and Gregory for Ed Upson and Onyedinma in a bid to add a cutting edge up front.
Ferguson found himself in referee James Adcock's book just four minutes after entering the fray for a sliding lunge that brought down Lloyd Isgrove.
The Lions had to dig in and defended well as Barnsley enjoyed a spell of possession, but Harris' men nearly grabbed an equaliser on 54 minutes. Martin and Ferguson combined on the left and the latter's delivery was met by skipper Morison, whose header was blocked on the line.
It took two cracking saves from Forde - the first a flying parry from Hammill's free-kick and the second a sprawling block with his legs to deny Winnall - to keep Millwall in the game as Johnson's men looked to extend their lead.
How important those saves proved to be, because by the 61st-minute Harris' men had forced a leveller. There looked to be little on for left-back Martin as he picked up the ball 18 yards out, but he managed to squeeze in a shot that flew past a posse of players, smacked the foot of the post and fell invitingly for Morison, who lashed home the rebound.
That should have set The Lions up to give it a real go, but the wind was knocked out of their sails just six minutes later when a sublime flick by Winnall set Hammill clear. He still had plenty to do and picked his way past three defenders before thumping a crisp shot beyond Forde's reach to put Barnsley 2-1 ahead.
On came Jimmy Abdou for Carlos Edwards as The Lions made their final change of the game, but Barnsley continued to look threatening and it took a stupendous save by Forde to tip Hammill's effort over as the ball curled towards the top corner with 20 minutes remaining.
The Lions tried to work up a head of steam on a sodden Okwell surface and were a whisker away from snatching a second goal as the game entered the final five minutes, only to see Webster's powerful header cleared off the line.
It looked as if Harris' men had finally hauled themselves level in the dying seconds, but Morison's looping header dropped onto the woodwork and the follow-up hacked off the line as Barnsley rode their luck to hang on for all three points.
Barnsley: Davies, Wabara, Long, Mawson, White (Bree, 87mins), Watkins (Smith, 87mins), Pearson, Isgrove, Hurihane, Hammill, Winnall. Subs not used: Townsend, Williams, White, Roberts, Templeton.
Booking: Hammill (79mins)
Scorers: Winnall (12mins), Hammill (67mins)
Millwall: Forde, Edwards (Abdou, 68mins), Martin, Beevers, Webster, Upson (Ferguson, 46mins), Williams, Saville, Onyedinma (Gregory, 46mins), O'Brien, Morison. Subs not used: Archer, Nelson, Thompson, Philpot.
Bookings: Ferguson (49mins), Martin (64mins)
Scorer: Morison (61mins)
Ref: J. Adcock
Att: 8,700 (away 385)
Tweets by @MillwallFC