在编写上下文菜单shell扩展时,我喜欢只捕获用户右键单击的所选文件列表的方法,然后以某种方式将它们传递给外部程序。主要工作在外部程序中完成,该程序具有自己的GUI,并在单独的进程中运行。 shell扩展代码只是将所选文件列表传递给外部程序。
(在我看来,这种方法也遵循其他实用程序,如7-zip。)
但是可以创建例如在Explorer进程内直接从shell扩展内部的对话框?我的理解是shell扩展中的代码应尽量少做,并将控件返回给Explorer,不要挂起Explorer进程。
如果我在shell扩展处理程序中创建一个对话框(例如在IContextMenu::InvokeCommand
的实现中),那么最合适的方法是什么?
假设在对话框OnInitDialog()
实现中我设置了对话框的GUI,我是否应该调用类似DoMainWork()
的内容,并在此方法中插入消息循环来处理消息?<登记/>
e.g。
// 1. Inside context-menu shell extension implementation
//
HRESULT CMyContextMenuShellExt::InvokeCommand(...)
{
...
// Build a GUI to process the selected files
CMyDialog dlg( ...pass the list of selected files to the dialog-box ... );
dlg.DoModal();
...
}
// 2. Inside CMyDialog class
//
LRESULT CMyDialog::OnInitDialog()
{
... prepare the GUI of the dialog-box
DoMainWork();
}
// 3. Inside CMyDialog::DoMainWork():
//
for (... loop to iterate over selected files ...) {
... do some processing for current file
// Process messages
// (including e.g. the pressing of a "Stop" button by the user)
MSG msg;
while (PeekMessage(&msg, m_hWnd, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}