The system does alert when the user gains the privilege to vote up, along with a link to a help page explaining how up voting works. And when up voting an answer to their own question, a reminder to accept is shown as well.
The problem is that most unaccepted questions stem from drive-by askers — users that are having trouble, find Stack Overflow, get the solution and then leave without really getting to know how the system works. Sometimes they'll come back after a while - I've had answers accepted six months to a year after I posted an answer.
If an active user forgets to accept your answer and they hinted that yours might be correct - post a comment along the lines of
@user: do you need any more help with this question?
This achieves two things; it reminds the user to accept if he just plain forgot and it's further offering your help if the solution wasn't quite right. I do this regularly and often the answer gets accepted (although not always). Kind of reminds me of my training when I was a B2B sales assistant — we had to pro-actively follow-up on potential leads.
For the drive-by asker, there's not much you can do except hope that they return to the site at some point to ask further questions. When they get to 5 and haven't accepted any, other users will pull them up on that 0% accept rate and they might just revisit old questions and accept your answer.
Another potential solution to this particular problem (thanking but not accepting) would be to detect words like "thanks", "thx", "worked" or "great" and highlight the accept icon (anyone remember the yellow check highlight for bounty-accepted answers?), perhaps also displaying a message:
Don't forget: you can accept this answer if it was the correct solution. Read more about accepting answers here.
Of course, the message might be annoying if the comment was along the lines of "thanks, but it didn't work" or "it has not worked for me".