Windows messages are a key ingredient in communication between Windows and (your) application and also in communication between (two) applications.
Even without your knowledge Windows messages are being posted and handled by forms in your application.
For example, when the user closes the form in your application, the WM_CLOSE message is sent to the window/form and the form gets closed (if you do not react programmatically).
For an application to receive a Window message, the application must provide a *window* a message will be sent to. In normal situation this window is the (main) form in your application. You write a procedure to handle a specific message, like WM_NCHitTest, and you are done.
BUT, what if you do NOT have a window to receive a message? What if you want to handle messages in your custom class derived from TObject?