The Honeywell Voyager 9520/40 line worked well for me. The scanner itself was easily programmable by scanning "program barcodes" that they provided.
But I also needed my program to be able to detect barcode scans even if it wasn't the "active" window. And I did not want to create a global keyboard hook to check if any keyboard input was actually a barcode scan.
I found that Honeywell offered free drivers to convert this scanner's output into "serial port" input on the pc - though it was a USB scanner. This was good for programming because it's a cinch to read serial port data in most programming languages, and it would have been rough for me to create some native code to read USB port data.
When researching this I found that most scanners actually had the capability to emulate serial port input so I would recommend that you look out for that feature if you want your program to be able to detect scans without having to get the focus first.
I answered a similar question with some examples here.