detect key release

On 05/07/2018 at 21:59, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   R19 
Platform:   Windows  ;   Mac OSX  ; 
Language(s) :     C++  ;   PYTHON  ;

---------
Hello,

In continuation to the shortcut-key topic and the sticky-key bug, I was looking for a way to detect a key release.
Let's say I have a SceneHook, in its KeyboardInput I can detect a key being pressed.
This method is being called when the user presses a key, or when the key is kept pressed down.
Is there any way to detect the key being released?

Note, we're in a SceneHook, performing a while loop to check for the release of the key is thus not an option. Moving all the logic into a ToolData is not an option either.

On 09/07/2018 at 02:26, xxxxxxxx wrote:

Hi C4DS, thanks for writing us and sorry for coming back late.

With regard to your question, being looking into ToolData out of discussion as you stated above, a plausible, but non-official, way to be informed about the key release could be represented by the next sub-optimal worrkaround.

The idea is to store the key press state in a member variable of your SceneHookData plugin and at the SceneHookData::Execute() call time compare the stored value with the current one to detect a change in the state.

Could it be worthy to give it a try? Maybe there could be some lag between the key release and the Execute() method execution but maybe it's something you could live with.

Best, Riccardo

On 09/07/2018 at 03:08, xxxxxxxx wrote:

Cannot get the Execute to work in the SceneHook.
I mean, Execute isn't performed when I press a key, it only is called when I click the mouse button, which then leads to "Cinema 4D has triggered a breakpoint".

I am capturing the pressed key in KeyboardInput and check in Execute as follows

Bool WOTSceneHook::KeyboardInput(BaseSceneHook* node, BaseDocument* doc, BaseDraw* bd, EditorWindow* win, const BaseContainer& msg)  
{
    Int32 key = msg.GetData(BFM_INPUT_CHANNEL).GetInt32();  
  mKeyPressed = key;  
  GePrint(String::IntToString(mKeyPressed));  
  
  return SUPER::KeyboardInput(node, doc, bd, win, msg);  
}  
  
EXECUTIONRESULT WOTSceneHook::Execute(BaseSceneHook *node, BaseDocument *doc, BaseThread *bt, Int32 priority, EXECUTIONFLAGS flags)  
{  
  if (mKeyPressed)  
  {  
      BaseContainer bc;  
      if (GetInputState(BFM_INPUT_KEYBOARD, mKeyPressed, bc))  
      {  
          GePrint("mKeyPressed");  
      }  
  }  
  return  EXECUTIONRESULT_OK;  
}  
  

From the moment I pressed a key (with cursor in the viewport), I always get a "Cinema 4D has triggered a breakpoint" whenever the mouse leaves the viewport.

I must be missing something.