The system software translates hardware interrupts from various input devices into messages according to the current input context (e.g. the active window of the frontmost application). Each message is a short piece of information. A message's format depends on its type, which is usually encoded in its first field. The message is sent to the client application using some communication protocol (e.g. shared memory, internal socket, network socket). The client application dispatches the message and performs any actions required. The messages can also be sent by client applications. This provides convenient and flexible inter-process communication.