I am in a GeDialog and have a button that is by default disabled.
I want to enable it as long as CTRL key is being pressed.
Solved How to detect CTRL being pressed in a GeDialog
The following works in R20
Int32 MyDialog::Message(const BaseContainer& msg, BaseContainer& result)
{
BaseContainer keyChannels;
if (GetInputEvent(BFM_INPUT_KEYBOARD, keyChannels))
{
const Int32 qualifier = keyChannels.GetInt32(BFM_INPUT_QUALIFIER);
ApplicationOutput("qualifier @", qualifier);
}
It shows a value '2' when I press CTRL key, '0' when I let go.
But in R23 (and above), I don't get any output in console window.
Hi @C4DS this has indeed changed, I will check with the UI team to know the exact reason. To retrieve qualifier I find out that only GetInputState is working, so in the meantime you can do this like that and it work as expected
def Message(self, msg, result):
res = c4d.BaseContainer()
self.GetInputState(c4d.BFM_INPUT_KEYBOARD, c4d.QCTRL, res)
if res[c4d.BFM_INPUT_QUALIFIER]:
print(msg.GetId())
isShiftPressed = bool(res[c4d.BFM_INPUT_QUALIFIER] & c4d.QSHIFT)
isCtrlPressed = bool(res[c4d.BFM_INPUT_QUALIFIER] & c4d.QCTRL)
isAltPressed = bool(res[c4d.BFM_INPUT_QUALIFIER] & c4d.QALT)
print(f"{isShiftPressed=}, {isCtrlPressed=}, {isAltPressed=}")
print("----------------------------")
return c4d.gui.GeDialog.Message(self, msg, result)
Cheers,
Maxime.
MAXON SDK Specialist
Thanks @m_adam
I can confirm that the following does work with R20, R23 and 2023
Int32 MyDialog::Message(const BaseContainer& msg, BaseContainer& result)
{
BaseContainer keyChannels;
if (GetInputState(BFM_INPUT_KEYBOARD, QCTRL, keyChannels))
{
Bool ctrlModifier = (keyChannels.GetInt32(BFM_INPUT_QUALIFIER) & QCTRL) != 0;