如何用自己的文件替换对话框中的默认右键单击上下文菜单

问题描述

我想创建一个自定义“文件打开”对话框,用我自己的上下文菜单替换当用户右键单击列表中的文件之一时显示的默认上下文菜单选项。

基于thisthis等文章,我尝试添加:

UINT CALLBACK OfnHookProc(HWND hDlg,UINT uMsg,UINT wParam,LONG lParam)

,然后使用

进行引用
ofn.lpfnHook = OfnHookProc;

我想理想的解决方案是从 OPENFILENAME 派生的类。不确定如何。

解决方法

对于Explorer-style Open dialog框:

  • 默认模板不可修改
  • 挂钩过程不接收消息,该消息用于对话框中的标准控件。

因此通过编辑或子类化打开的对话框本身替换默认上下文菜单的可能性很小。

从用户的角度来看,普通对话框的主要好处 框是它的一致外观和功能 应用到应用。 隐藏原始控件或其他 更改是原始控件的预期功能,是不合适的自定义项。

但是,有一种解决方法可能会有所帮助:

将您的上下文菜单项添加到默认项中,作为一项附加项。像这样:

enter image description here

有关更多详细信息,请参阅“ Creating Cascading Menus with the ExtendedSubCommandsKey Registry Entry”。

注意:修改注册表会影响所有应用程序,而不仅是您自己的应用程序。因此,请确保将此修改保留在所需的最小范围内。例如,如果将此更改放入 HKEY_CURRENT_USER\Software\Classes 就足够了,则不要将其放入 HKEY_LOCAL_MACHINE\SOFTWARE\Classes

,

如@ remy-lebeau所述,您可以使用下面列出的窗口子类来做到这一点:

  1. 获取“文件打开”对话框的hWnd
  2. 通过SetWindowLong(hWnd,GWL_WNDPROC,..)替换WndProc
  3. 之后,您将能够跟踪鼠标位置并处理WM_RBUTTONDOWN

要获取窗口句柄,可以使用FindWindowEx,EnumWindows甚至SetWindowsHookEx。不要忘记将未处理的消息传递给原始窗口过程。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...