Luka Jovic scored with his heel after a corner with 15 minutes remaining for Frankfurt to reach Germanys season-ending showpiece in Berlins Olympiastadion for the second year in a row. Frankfurt lost to Borussia Dortmund last season.
The win means Frankfurt coach Niko Kovac will face his future club in the final, with Bayern announcing last week that he will take charge of the Bundesliga champions this summer.
Franco di Santo thought hed equalized in injury time after a dramatic finale, but referee Robert Hartmann ruled the goal out after determining that the Argentine controlled the dropping ball with his arm before firing the ball into the top left corner.
It had been a game of little goalmouth action until Jovic scored. Lukas Hradecky got the better of Schalkes Guido Burgstaller in a one-on-one just minutes before, and the Frankfurt goalkeeper followed up with another good save to deny Yevhen Konoplyanka.
The home sides chances of a comeback were boosted when Gelson Fernandes was sent off with 10 minutes left for a bad challenge on Leon Goretzka just 33 seconds after coming on as a substitute. Hartmann initially showed a yellow card but changed it to red after getting prompted to take another look by the video referee.
Despite Schalkes relentless attempts, Frankfurt held on to reach the May 19 final.
Bayern booked its spot with a 6-2 win at Bayer Leverkusen on Tuesday. Jupp Heynckes side, which secured the Bundesliga title with five rounds to spare, faces Real Madrid in the Champions League semifinals and is targeting a repeat of the treble it secured in 2013 in the veteran coachs previous stint in charge.
Heynckes is going back into retirement at the end of the season, and Bayern has already lined up Kovac as his replacement.