private MmcConsoleVerb GetDefaultVerb() { MmcConsoleVerb verb = MmcConsoleVerb.None; GetIConsoleVerb().GetDefaultVerb(ref verb); return(verb); }
/// <summary> /// Delegate to the relevent node or handle it directly. /// </summary> public int Notify(IntPtr lpDataObject, uint notifyEvent, IntPtr arg, IntPtr param) { int hr = Constants.Win32.HResults.S_FALSE; try { // There are some sneaky values for the IDataObject parameters that make // interop with this interface a little trick. This is why lpDataObject is an IntPtr // not an actual IDataObject interface. if (lpDataObject == (IntPtr)DataObject.CUSTOMOCX || lpDataObject == (IntPtr)DataObject.CUSTOMWEB) { return(hr); } hr = Constants.Win32.HResults.S_OK; IDataObject dataObject = null; if (lpDataObject != (IntPtr)0) { dataObject = (IDataObject)Marshal.GetObjectForIUnknown(lpDataObject); } // Get the node. SnapinNode node; if (dataObject != null) { node = ((DataObject)dataObject).Node; } else { // Try to get the node of the selected item. ResultDataItem item = m_snapin.GetSelectedItem((IResultData)m_console); if (item.Index != -1) { node = m_snapin.FindNode(item.Param); } else { node = m_snapin.CurrentScopeNode; if (node == null) { node = m_snapin.RootNode; } } } Debug.WriteLine("IComponent.Notify: " + ((MmcNotify)notifyEvent) + " " + node.DisplayName); // Dispatch the event to the node. switch ((MmcNotify)notifyEvent) { case MmcNotify.Activate: node.OnActivate(arg.ToInt32() != 0); break; case MmcNotify.AddImages: // arg actually contains the IImageList interface. We need to // marshall that manually as well. IImageList imageList = (IImageList)Marshal.GetObjectForIUnknown(arg); // Param contains the HScopeItem so use it to get the node it represents. node = m_snapin.FindNodeByHScopeItem(param); if (node != null) { node.OnAddResultPaneImages(imageList); } break; case MmcNotify.BtnClick: node.OnBtnClick(param.ToInt32()); break; case MmcNotify.Click: node.OnClick(); break; case MmcNotify.ColumnClick: node.OnColumnClick((int)arg, (int)param == 0); break; case MmcNotify.CutOrMove: dataObject = (IDataObject)Marshal.GetObjectForIUnknown(arg); if (!node.OnCutOrMove(dataObject)) { hr = Constants.Win32.HResults.S_FALSE; } break; case MmcNotify.DblClick: // Check if the default verb is enabled. If it is let MMC invoke it, otherwise // say that the action was handled. This prevents it from asking for a property page // when the Properties verb is disabled. IConsoleVerb consoleVerb; Console.QueryConsoleVerb(out consoleVerb); MmcConsoleVerb defaultVerb = MmcConsoleVerb.None; consoleVerb.GetDefaultVerb(ref defaultVerb); int state = 0; consoleVerb.GetVerbState(defaultVerb, MmcButtonState.Enabled, ref state); hr = (state == 0 ? Constants.Win32.HResults.S_OK : Constants.Win32.HResults.S_FALSE); break; case MmcNotify.Delete: node.OnDelete(); break; case MmcNotify.DeselectAll: node.OnDeselectAll(); break; case MmcNotify.Expand: if (arg == IntPtr.Zero) { node.OnExpand(false); } else { node.OnCollapse(); } break; case MmcNotify.MenuBtnClick: MenuButtonData data = (MenuButtonData)(Marshal.PtrToStructure(param, typeof(MenuButtonData))); node.OnMenuBtnClick(data.CommandId, data.X, data.Y); break; case MmcNotify.Minimized: if (arg.ToInt32() == 0) { node.OnMaximized(); } else { node.OnMinimized(); } break; case MmcNotify.Paste: dataObject = (IDataObject)Marshal.GetObjectForIUnknown(arg); if (node.OnPaste(dataObject)) { param = Marshal.GetIUnknownForObject(dataObject); } else { hr = Constants.Win32.HResults.S_FALSE; } break; case MmcNotify.PropertyChange: break; case MmcNotify.QueryPaste: dataObject = (IDataObject)Marshal.GetObjectForIUnknown(arg); if (!node.OnQueryPaste(dataObject)) { hr = Constants.Win32.HResults.S_FALSE; } break; case MmcNotify.Refresh: node.OnRefresh(); break; case MmcNotify.Print: node.OnPrint(); break; case MmcNotify.Rename: if (arg == IntPtr.Zero) { // Check. if (!node.OnTryRename()) { hr = Constants.Win32.HResults.S_FALSE; } } else { if (node.OnRename(Marshal.PtrToStringAuto(param))) { SetStatusText(node.GetStatusText()); } else { hr = Constants.Win32.HResults.S_FALSE; } } break; case MmcNotify.Select: bool scope = ((short)arg) != 0; bool select = ((((int)arg) >> 16) & 0xffff) != 0; if (scope) { if (select) { if (m_scopeItemChanging) { m_scopeItemChanging = false; m_snapin.CurrentScopeNode = node; } // Defect 54593: for some reason when multiple result items are selected and the // user clicks on the scope node MMC does NOT send a "deselect result" notification // (if a single result item is selected then it does). Work around this. if (node.IsResultSelected) { node.OnDeselectResult(); } node.OnSelectScopeItem(); SetStatusText(node.GetStatusText()); } else { node.OnDeselectScopeItem(); } } else { if (select) { node.OnSelectResult(); } else { node.OnDeselectResult(); } } break; case MmcNotify.Show: bool selecting = (arg != IntPtr.Zero); if (selecting) { m_scopeItemChanging = true; m_snapin.FindNodeByHScopeItem(param).OnShow(); } else { m_snapin.FindNodeByHScopeItem(param).OnHide(); } break; case MmcNotify.ViewChange: dataObject = null; if (param != (IntPtr)0) { dataObject = (IDataObject)Marshal.GetObjectForIUnknown(param); } SnapinNode nodeChanged = dataObject == null ? m_snapin.RootNode : ((DataObject)dataObject).Node; if (arg != IntPtr.Zero) { node.OnViewChangeScope(nodeChanged); } else { node.OnViewChangeResult(nodeChanged); } break; case MmcNotify.SnapinHelp: hr = Constants.Win32.HResults.S_FALSE; break; case MmcNotify.ContextHelp: node.OnContextHelp(); break; case MmcNotify.InitOcx: // param is the IUnknown of the OCX. object ocx = Marshal.GetObjectForIUnknown(param); if (node.OnInitOcx(ocx)) { hr = Constants.Win32.HResults.S_OK; } else { hr = Constants.Win32.HResults.S_FALSE; } break; case MmcNotify.FilterChange: node.OnFilterChange((MmcFilterChangeCode)arg.ToInt32(), param.ToInt32()); hr = Constants.Win32.HResults.S_OK; break; case MmcNotify.GetFilterMenu: hr = Constants.Win32.HResults.S_FALSE; break; case MmcNotify.FilterOperator: hr = Constants.Win32.HResults.S_FALSE; break; case MmcNotify.ColumnsChanged: hr = Constants.Win32.HResults.S_OK; break; default: // The notification is not supported. hr = Constants.Win32.HResults.S_FALSE; break; } } catch (Exception e) { new ExceptionDialog(e, "The following exception has occurred in the snap-in:").ShowDialog(m_snapin); hr = Constants.Win32.HResults.S_FALSE; } return(hr); }
internal void OnControlbarCommand(IControlbar Controlbar, IToolbar Toolbar, MmcConsoleVerb verb) { }
private void SetDefaultVerb(MmcConsoleVerb verb) { GetIConsoleVerb().SetDefaultVerb(verb); }
private void SetVerbState(MmcConsoleVerb cmd, MmcButtonState state, bool show) { GetIConsoleVerb().SetVerbState(cmd, state, Convert.ToInt32(show)); }