Is it possible to add new values to the new windows 11 context menu, how does it work with the standard one? For example, by adding some entries to the registry:
HKEY_CLASSES_ROOT\*\OpenWithList
HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers
HKEY_CLASSES_ROOT\Directory\Background
HKEY_CLASSES_ROOT\Directory\shell
HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers
HKEY_CLASSES_ROOT\Drive\shell
HKEY_CLASSES_ROOT\Drive\shellex\ContextMenuHandlers
HKEY_CLASSES_ROOT\Folder\shell
HKEY_CLASSES_ROOT\Folder\shellex\ContextMenuHandlers
Important: I don't need any third party programs, I want to write my own context menu editor.
If somehow it is possible to work with the context menu in addition to the registry, let me know, it will be very useful.
For example, I found a program that works with the new context menu, but I can't figure out how it works under the hood: https://github.com/ikas-mc/ContextMenuForWindows11
I did not find any information on the new context menu on the Internet.
Related
Question
when you right-click on the desktop (or folder, file, etc) the context menu entries that appear are either statically generated or dynamically generated via a loaded DLL that implements specific interfaces. read more about the differences between static entries and dynamic ones here.
I just bought a new computer and decided to fully customize my windows context menu.
Basically, this question asks about complete control over your windows context menus, even the dynamic ones, and even the built-in ones(if possible).
The static entries are easy to manage and can be easily managed via the registry or a tool.
the dynamically generated entries are the problem because it's hard to understand which of the loaded DLLs caused a certain entry label to apear.
For example: context menu on certain file types(like .txt) will load an entry "Move to OneDrive". how do I find the DLL that loaded that sentence?
so to summer up, how do i:
get from the context menu entry label(eg 'Move to OneDrive') the path of the ContextMenuHandlers DLL that loaded it. Alternatively, finding out the ContextMenuHandler that generated this entry.
✅ disable its loading. (can be done by editing the UID to something else,for example prefixing with '-')
some values are restored after reboot, how do I cancel that?
('Move to OneDrive' is a true and annoying example but I asking about any entry, even the 'Rename' or 'Properties')
Possible directions:
Using Sysinternals process explorer we can search a handle or a loaded DLL, however, how can you tell in a DLL generated a specific string(eg 'Move to OneDrive')?
Example:
for documentation purposes, not actual part of the question
Following this example we can understand,
The registry entries that are responsible for the dynamic entries on the directory context menu are listed in Computer\HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers
let's take the EPP Key for example:
we can see that the value of the EPP key is {09A47860-11B0-4DA5-AFA5-26D86198A780}
following this example:
HKEY_CLASSES_ROOT
.myp
(Default) = MyProgram.1
CLSID
{00000000-1111-2222-3333-444444444444}
InProcServer32
(Default) = C:\MyDir\MyCommand.dll
ThreadingModel = Apartment
{11111111-2222-3333-4444-555555555555}
InProcServer32
(Default) = C:\MyDir\MyPropSheet.dll
ThreadingModel = Apartment
MyProgram.1
(Default) = MyProgram Application
Shellex
ContextMenuHandler
MyCommand
(Default) = {00000000-1111-2222-3333-444444444444}
PropertySheetHandlers
MyPropSheet
(Default) = {11111111-2222-3333-4444-555555555555}
using our value for the EPP entry {09A47860-11B0-4DA5-AFA5-26D86198A780}, we can understand that the DLL that loaded this entry is listed here Computer\HKEY_CLASSES_ROOT\CLSID\{09A47860-11B0-4DA5-AFA5-26D86198A780}\InprocServer32, and in this case the value of this entry is C:\Program Files\Windows Defender\shellext.dll
We can 'Windows Defender' in the path, so we can assume it's responsible for loading the context entry with the label 'Scan with windows defender'
However, seems that that story does not end here, after disabling all static and dynamic entries for context directory there are still entries in the context menu. how do I revel which DLL loaded them?
I'm working in Epicor 10.1 SaaS writing a customization on New PO Suggestions. The customization works and I can access it through Developer mode. I'm trying to allow users to always see this customization when they launch New PO Suggestions, but there are at least two entry points: from the Main Menu and from the Buyer's Workbench. In the past, I've created a new Main Menu Icon and made it the only visible icon for all users; however, this would not work in this case, because most users access New PO Suggestions from the Buyers Workbench. This Process calls:
Process Key: Erp.UI.POSuggEntry
Calling App: Erp.UI.BuyerWorkbenchEntry
Menu ID: PMGO2011
How can I direct users to the customization in all cases?
I was able to make other applications call the customization by:
1) Creating a customized Menu Item for New PO Suggestion with a new Menu ID
2) Opening Process Calling Maintenance, creating a new Process, and entering the Called Process Reference "Erp.UI.POSuggEntry", leaving Called From blank, and entering the new Menu ID
I notice on Mac, every app on docker, when it's not opened and ctrl click it, there will be a pop-up menu, inside has a menu item called "show recents", when open the app this item will become "show all windows". I want to know how to make it work cuz right now, when I click it on my own app, it has nothing to show.
I have tested using doc controller and use noteNewRecentDocumentURL: method, but still, both "open recent" item in "file" and "show recents" in docker, it doesn't show my url I just added.
I do not know, where you click on the app to show the menu. The recent documents list is shown
in the app's File menu in the submenu Open Recent
in the dock menu for the app as a list with one item per document
likely at some other places related to the app
However where it is shown, the list is automatically managed by [NSDocumentController sharedDocumentController], which is added to the project template for document-based applications. If you do not have a document-based application you should re-check, whether this would be the better choice. But you can use [NSDocumentController sharedDocumentController] in a non-document-based application as well:
In some situations, it is worthwhile to subclass NSDocumentController in non-NSDocument-based applications to get some of its features. For example, the NSDocumentController management of the Open Recent menu is useful in applications that don’t use subclasses of NSDocument.
Documentation
There is a section Managing the Open Recent Menu containing the description of the method -noteNewRecentDocumentURL: in the documentation of NSDocumentController. You have to send this message to the shared instance,
whenever you want to add an item to the recent docs list:
[[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:theURLOfTheDocYourAppOpens];
Please note:
Applications not based on NSDocument must also implement the application:openFile: method in the application delegate to handle requests from the Open Recent menu command.
If you do not want to use the document controller, you have to maintain the list yourself and add it to the different locations manually. You can start here. I do not recommend that.
Here's code for use with Xamarin.Mac.
// Add the file to the menu. Note creation of file url.
void AddFileToOpenRecentMenu(string filePath)
{
var fileUrl = NSUrl.FromFilename(filePath);
NSDocumentController.SharedDocumentController.NoteNewRecentDocumentURL(fileUrl);
}
// Open the file selected from the menu (in AppDelegate.cs)
[Export("application:openFile:")]
public override bool OpenFile(NSApplication sender, string filename)
{
var keepFileInMenu = ProcessFile(filename);
return keepFileInMenu;
}
In Windows 7's Windows Explorer list view (what allegedly is not list view at all) in the Details view, you can start selection marquee in the first (Name) column. You just need to start outside the actual name.
The same is true for default-style list view control in Details view.
But if you set the list view control to the Explorer style (using the SetWindowTheme), what should mimic the Windows Explorer, this does not work anymore. You can start selection in the second and later columns only.
SetWindowTheme(listView1.Handle, "explorer", null);
Is there any way to make list view mimic the Explorer selection style?
I suppose there's no settings to enable such behavior and this would have to be coded. Like handling the mouse down and triggering selection. But I have no idea how to do that.
Thanks.
Ntb, I'm using C++Builder, but this should be purely Win32 issue. I've tested this with WinForms too (hence the C# sample above).
Is there any way to make list view it mimic the Explorer selection style?
No, SysListView32 in explorer theme does not behave that way. The control used by the modern Explorer is actually DirectUIHwnd. And you are not able to use one of them.
The only way to get the behaviour of DirectUIHwnd is to code it yourself. I expect that's possible to do but I'd also expect it to be very difficult to achieve.
Actually there is a way to mimic Explorer selection behavior. It requires a lot of additional declarative work, but it is possible.
You need to get undocumented IListView interface via undocumented LVM_QUERYINTERFACE message (note that interface declaration and GUIDs are different for Windows Vista and Windows 7+). Details about constants and declarations can be found here:
IListView at Geoff Chappell - Software Analyst or
Undocumented List View Features at Code Project.
After acquiring the interface all you need is simply a call to SetSelectionFlags(1, 1) method. Voila you are done.
I am looking for a good plugin showing Windows Explorer context menu directly from editor window in Eclipse. Does anybody know such plugin?
I'm a little late to the game with this answer, however since I found this article when trying to find a solution to this i'll post it here. There's an answer over at http://www.eclipsezone.com/eclipse/forums/t77655.html that solves this simply.
under Window -> External Tools -> External Tools Configuration
(1) Create a new Program (select Program in the tree)
(2) name it shell (or whatever you want)
(3) set the location to ${env_var:SystemRoot}\explorer.exe
(4) set the arguments to /select,${resource_loc}
(5) run it
for me it appears up in the tool bar at the top in it the little external tool run (run with a toolbox)
simple, effective and doesn't require any installation especially when all i really needed was to have a file focused, and rapidly get to the windows folder that contains it.
For people who don't want to install Aptana (It's kinda huge), here are a few plugins for a windows context menu in eclipse(and more):
contextmenu
Basic
Eclipse Navigator Extension
Basic + copy path
StartExplorer
Only opens explorer, but also does it on selected text (if it's a path) and has custom commands.
Some more info on Eclipse explorer menu's after trying them:
Failed to install (Some error with osgi)
Has 2 Eclipse context menu's:
Copy path (full, file, parent)
Show Context Menu (it's the basic version though, some of the context menu items that I can see in real Explorer don't show up here)
Has 1 Eclipse context menu (StartExplorer) with submenu's:
Show in File manager
Start Shell here
Open file with default application
Copy resource path to clipboard
Custom commands, which you can set in preferences and default ones:
Edit in notepad
echo to temp file
So, although (3) StartExplorer doesn't really have a context menu and everything sits in a submenu, the custom commands dominates in my opinion. It should allow a contextmenu through it (command to be found) or achieve what you want by cloning the behavior you want from your context menu.
It also seems like the code has been updated more recently than the others (and it supports multiple platforms)
For my custom paste I am not using the Paste from eclipse , I have created a new context menu Paste Objects by adding a new command .
I have added the handler : PasteObjectsHandler for the command which extends AbstractHandler .
Command
<command
categoryId="org.eclipse.ui.category.edit"
description="%pasteobjectscommand.description_xmsg"
id="com.test.pasteobjectscommand"
name="%pasteobjectscommand.name_xtit">
</command>
Handler
<handler
class="com.test.PasteObjectsHandler"
commandId=" com.test.pasteobjectscommand ">
</handler>
public class PasteObjectsHandler extends AbstractHandler {
#Override
public Object execute(ExecutionEvent event) {
Clipboard clipBoard = new Clipboard(Display.getDefault());
LocalTransfer instance = LocalTransfer.getInstance();
IResource clipboardData = (IResource) clipBoard.getContents(instance);
}
}
And in the handler I try to access the clipboard in the execute method . And I get null here .
I have written a plug-in that can open the Windows Explorer context menu:
ContextMenuPlugin
I wrote it a long time ago, but I still maintain it.
I will add EasyShell plugin for Eclipse, it has that functionality and more.
Have a look at that:
https://anb0s.github.io/EasyShell/
Aptana, it will give you context menu.