AddShortcut() [SOLVED]
-
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.
-
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);