Normally, after a commodity processes a hot key input event, it needs to eliminate that input event. Other commodities may need to replace an input event with a different one. The translate cxobject can be used for these purposes. translateCxObj = CxObj *CxTranslate(struct InputEvent *newinputevent); The macro cxtranslate() creates a new translate cxobject. cxtranslate()'s only argument is a pointer to a chain of one or more inputevent structures. When a translate cxobject receives a cxmessage, it eliminates the CxMessage and its corresponding input event from the system. The translator introduces a new input event, which Commodities Exchange copies from the inputevent structure passed to cxtranslate() (newinputevent from the function prototype above), in place of the deleted input event. A translator is normally attached to some kind of filtering cxobject. if it wasn't, it would translate all input events into the same exact input event. Like the sender cxobject, a translator does not divert cxmessages down its personal list, so it doesn't serve any purpose to add any to it. void SetTranslate( CxObj *translator, struct InputEvent *ie ); It is possible to change the inputevent structure that a translator looks at when it creates and introduces new input events into the input stream. The function settranslate() accepts a pointer to the new inputevent structure, which the translator will duplicate and introduce when it receives a cxmessage. HotKey utilizes a special kind of translator. Instead of supplying a new input event, HotKey passes a NULL to cxtranslate(). if a translator has a NULL new input event pointer, it does not introduce a new input event, but still eliminates any cxmessages and corresponding input events it receives.