Is there a way to sign a message without being allowed to see it?
Generally hashing is part of the signature generation. You can use an additional hash or perform the hashing beforehand (splitting the signature generation process), and then only present the hash to the signer. If the message is complex enough then the one-way-hash function hides the message so it cannot be guessed.

You can always include a large enough (128 bit or so) random value with the message so it is impossible to guess the input to the hash value. Of course the receiver has to receive the message and the random value to verify the signature.

A much bigger problem is to make sure that the signer signs the actual message displayed on screen, and not a different hash. So the normal use case of a signature is actually harder to accomplish than your specific task to hide the message.