Although I agree that protection will always be cracked no matter what you do, I think there is a certain amount of prudence in putting something in. If you can fend off the pirates for a few days or, with luck, a week or two, that helps sales, and it's about all you can realistically ask for. Well, I suppose we could realistically ask people to not do unethical and illegal things, but let's not start THAT thread again!
As DillRye said though, you have to make sure it's not inconvenient for the user. That will kill you worse than being pirated.
I'm currently toying with some ideas for my next game release, but I haven't made any decisions yet... What I've come up with is this (feel free to steal the idea if you want)...
When you purchase the game from Handango (which will be the only distributor it's available from for reasons you'll see later), the user will download essentially a trial version, or they would have done that already, either way is fine.
When the purchase occurs, Handango sends an eMail to alert me of the sale. I now have an automated process set up that is activated when that eMail is recieved.
Based on the Handango sales number (which is a God-awful long-ass number, that's why I said only they would distribute for me) I create a 10-digit code based on my own custom algorithm. I then send this number to the user via the eMail address they entered. They can also at any time log on to my web site, enter their name and purchase number, and retrieve the code (in case the return eMail doesn't go through).
Once they get this, they enter it and off they go. eMail is fairly reliable in general, and Handango seems to send the notification eMails immediately, so I would expect a user to not wait more than a minute or two before they get their code. I will of course inform them of all this at the time of purchase. In addition, Handango sends a nightly file containing all your purchases. I will have a process that compares this with what got added throughout the day, make sure nothing got missed.
Now, the protection itself is checked at numerous points throughout the game, using variations on the check code, so a would-be cracker would have a little tougher time of it. It also stores the values that are checked to indicate the game is registered in a number of locations (registry, various files, datastore, etc.). Lastly, I do a custom checksum check on the executable and check this in various spots throughout the program, again with varying code. Should make it tougher to tamper with the executable.
I know that sounds like a lot of work, but a while back I wrote a program that takes in source code and basically re-writes it randomly. It winds up being functionally equivalent, but it usually looks totally different each iteration, so I'm really just writing the code once or maybe twice and using this process on it after.
This to me seemed like a reasonable compromise in convenience and protection. Again, it's not going to stop anyone cold, but I do believe it would slow them down. It's elaborate enough to give crackers headaches for a while, but not such an inconvenience on me to implement or end-users to deal with (I think).
In addition, should a code be released, one of two things is true: either (a) they figured out my algorithm and wrote a keygen, or (b) someone bought a copy and gave out the code. In the second case, I at least theoretically know something about the purchaser and could potentially do something about it, but chances are they used fake information, so it'd probably be a dead-end anyway.
I suppose the web site could be hacked too, but presuming I'm a half-way decent admin and web developer, that shouldn't be a huge concern. Besides, you can't cover EVERY base I figure.
Like I said, these are just ideas I'm tossing around, what I've implemented already wasn't actually done specifically for this protection scheme, so I've basically put no real work into this yet. Feel free to use the ideas, or derivates, if you want.
...and so I said to Mr. Gates: "$640 billion should be enough for anyone!"