Window functions are typically used to reduce spectral leakage and scalloping loss in the frequency domain. Usually that means giving up a bit of amplitude and/or frequency resolution in the process. The different window functions exist so you can tune it depending on which of these properties is most important to your application. You are applying the window correctly and your observation about the reduced signal amplitude near the ends of the waveform is exactly what the window function is designed to do. Specifically, it is intended to reduce the discontinuity between the beginning and the end of the signal. Conceptually, the FFT assumes that the time domain waveform repeats forever, so if you can imagine pasting a bunch of copies of you signal together, then without the window function you'd have a big jump where they are spliced together, which would show up as harmonics in your FFT output.
Selecting a window function is more about what you're trying to measure in the frequency domain and less about how the time domain waveform looks after the window has been applied. For example, if you're looking to make an accurate amplitude measurement of a single sinusoidal tone, then a flat top window would be a good choice. However, it as very poor frequency resolution, so it would not be good at separating multiple tones. The Hanning window is a good middle of the road window function, so it is probably a good place to start. To find a more suitable window function, you need to decide what types of measurements you're trying to make and what types of input signals you expect.
Because you're essentially multiplying every point of your signal to something less than 1, the window function will apply some amount of gain (attenuation) equal to the average of the window function itself. Normalization just means compensating for this so that your amplitude measurement is correct. Some DSP libraries apply this compensation for you. If you're not sure, I think you can check by just averaging the window function itself. If it equals 1, then it's normalized. If not, then you need to divide your measured amplitude by this value to find the correct amplitude.