Has anyone figured out a way to have a macro read and change the setting for "Keep Desktop Objects on Layer" which is found on the Objects docker, "Gear"/settings menu? I would love to be able to check and change this using VBA.
If I understand correctly, "Keep Desktop Objects on Layer" is an application preference. As an example, I see in the Windows Registry a key named KeepDesktopObjectsOnLayer under Computer\HKEY_CURRENT_USER\SOFTWARE\Corel\CorelDRAW\23.0\Draw\Application Preferences\VGDoc Pref Settings.
As an aside: I really, really wish that they had made that a document property instead of an application preference.
I think that there is something in the API for checking and changing application preferences. See Application.GetApplicationPreferenceValue method and Application.SetApplicationPreferenceValue method.
I have messed aroud a little bit trying to use those methods for other settings, but never achieved success. If you learn more about using those methods, then please share, as I would love to learn more about them.
Thank you, Eskimo. I will follow up on the links you provided to see if I can figure anything out. Certainly will share, if I do.
Yes, this setting as a document property, and individual drawing scales per page rather than per document. Those are on my wish list.
God bless.
You and everyone else. I force clients to remove desktop item and turn keep desktop object on layer off!
Eskimo, I'm almost there. You're discovery of the Registry value for this setting was the key. After seeing that I thought, Hmm, I wonder if there is a way to edit Registry settings using VBA. Turns out, there is!
I wrote a quick macro that will read the Registry value for "KeepDesktopObjectsOnLayer" and then toggle it on or off based on what it finds. And it actually works. If you paste the script below into a module and step through the code using F8, you can see it do its thing. And if you have the Registry Editor open to this key and press F5 to refresh the window after running the script, you can see that it has changed the value.
Unfortunately, CorelDraw isn't aware that the setting was changed externally, so it remains the same. Closing CorelDraw will also overwrite the Registry value with whatever it was left as in the program.
So I'm wondering if you can figure out away to refresh/reload the application settings (or at least that value) with the update from the Registry. That will be the solution.
Here is my script:
Sub ToggleKeepDtObjOnLayer()'Toggle the CorelDraw application setting: Keep Desktop Objects on LayerOn Error GoTo OopsDim WS As ObjectDim RegKey As String, Value As Variant, sType As String'REG_SZ A string'REG_DWORD A Number An integer'REG_BINARY A binary value An integer'REG_EXPAND_SZ An expandable string (e.g., "%windir%\\calc.exe") A stringSet WS = VBA.CreateObject("WScript.Shell")RegKey = "HKEY_CURRENT_USER\SOFTWARE\Corel\CorelDRAW\23.0\Draw\Application Preferences\VGDoc Pref Settings\KeepDesktopObjectsOnLayer"If WS.RegRead(RegKey) = 0 ThenValue = 1ElseValue = 0End IfsType = "REG_SZ"WS.RegWrite RegKey, Value, sType
Done:Set WS = NothingExit Sub
Oops:MsgBox Err.Number & ": " & Err.DescriptionResume DoneResume 'For debuggingEnd Sub
Isn't this the feature you're looking for?
With this option unchecked, it’s as before! COo we like working!