Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    AddShortcut() [SOLVED]

    SDK Help
    0
    2
    247
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      Helper
      last edited by

      On 02/06/2015 at 07:34, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   R13.061  
      Platform:   Windows  ;   
      Language(s) :     C++  ;

      ---------
      Hi there,

      the problem:

      Our plugin needs access to the CTRL+"C",  CTRL+"V" and CTRL+"X" keyboard shortcuts. Meaning, the plugin must be started when the modeler uses these shortcuts in the scenegraph window.

      I experimented with the api and found the following issues:

      1.) adding the shortcut via  AddShortcut() does not work. AddShortcut()  returns True, but probably the shortcut is overwritten by a previous set shortcut?
      Here is the code i use:

        
        BaseContainer bc;  
            bc.SetLong(SHORTCUT_PLUGINID, PID_CMD_AMT_COPY);   
            bc.SetLong(SHORTCUT_ADDRESS, 0);   
            bc.SetLong(SHORTCUT_OPTIONMODE, 0);   
        
            bc.SetLong(0, 2);   
            bc.SetLong(1, 67);   
            Bool res= AddShortcut(bc);   
      

      2.) Finding other shortcuts which use the same keys, removing them and then adding the shortcut does not work. Here is the code:

        
        
            BaseContainer bc;  
            bc.SetLong(SHORTCUT_PLUGINID, PID_CMD_AMT_COPY);   
            bc.SetLong(SHORTCUT_ADDRESS, 0);   
            bc.SetLong(SHORTCUT_OPTIONMODE, 0);   
        
            bc.SetLong(0, 2);   
            bc.SetLong(1, 67);   
        
        
            LONG nr= FindShortcuts(bc, shortCuts, sizeof(shortCuts)/sizeof(LONG));   
        
            for (int i=0; i< nr; i++)  
            {  
                Bool ok= RemoveShortcut(shortCuts[i]);        // failes   
            }  
        
            Bool res= AddShortcut(bc); // succeeds, but does not work  
      

      FindShortcuts() in the code above finds 2 shortcuts (indizes are: 13543,  12107), trying to remove them fails. LONG im= GetShortcutCount(); gives 319, so both these indizes are out of range.

      3.) The only way to assign the shortcut correctly is via  LoadShortcutSet(Filename("AMTShortcuts.txt"), FALSE); but this deletes all registered shortcuts, making it impossible for the modeler to set her own shortcuts. Using  LoadShortcutSet(Filename("AMTShortcuts.txt"), TRUE);  does not work.

      So how can I get these three shortcuts to work?

      Thanks in advance.

      1 Reply Last reply Reply Quote 0
      • H
        Helper
        last edited by

        On 03/06/2015 at 02:28, xxxxxxxx wrote:

        Just fyi, found a way how  to do it. Don't use FindShortcuts(), instead search all shortcuts manually, Remove() them and add your shortcut.

          
          // remove all global ctrl+c  
              LONG im= GetShortcutCount();   
              for (int i=0; i< im; i++)  
              {  
                  BaseContainer bc= GetShortcut(i);   
          
                  LONG commandID= bc.GetLong(SHORTCUT_PLUGINID);            // e.g: PID_CMD_AMT_COPY  
                  LONG shortcutAdress= bc.GetLong(SHORTCUT_ADDRESS);        // 0  
                  Bool shortcutOptionMode= bc.GetBool(SHORTCUT_OPTIONMODE); // 0  
                    
                  LONG shortcutQualifier= bc.GetLong(0);    // =2, probably ctrl  
                  LONG shortcutKey= bc.GetLong(1);        // =67,  == ascii 'C'  
                    
                  if (shortcutAdress ==0 && shortcutOptionMode==0 && shortcutQualifier==2 && shortcutKey==67)  
                  {  
                      // found global CTRL+C  
                      RemoveShortcut(i);           
                      i--;  
                  }  
              }  
          
              // add ctrl+c:  
              BaseContainer bc;  
              bc.SetLong(SHORTCUT_PLUGINID, PID_CMD_AMT_COPY);   
              bc.SetLong(SHORTCUT_ADDRESS, 0);   
              bc.SetLong(SHORTCUT_OPTIONMODE, 0);   
          
              bc.SetLong(0, 2);   
              bc.SetLong(1, 67);   
              Bool res= AddShortcut(bc);   
          
        
        1 Reply Last reply Reply Quote 0
        • First post
          Last post