private int OpenFileSubClass ( IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam, IntPtr uIdSubclass, uint dwRefData ) { switch (uMsg) { case InteropUtil.WM_PARENTNOTIFY: { unchecked { var id = lParam.GetDlgCtrlID(); if (LOW((uint)wParam) == InteropUtil.WM_CREATE && (id == InteropUtil.ID_FileList || id == 0)) { lParam.SetWindowSubclass(m_defViewSubClassDelegate, 0, 0); } } break; } } return hWnd.DefSubclassProc(uMsg, wParam, lParam); }
private int DefViewSubClass ( IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam, IntPtr uIdSubclass, uint dwRefData ) { if (uMsg == InteropUtil.WM_NOTIFY) { var header = (InteropUtil.NMHDR)Marshal.PtrToStructure(lParam, typeof(InteropUtil.NMHDR)); if (header.code == InteropUtil.LVN_ITEMCHANGED && header.hwndFrom != IntPtr.Zero && header.idFrom == 1) { var nmListView = (InteropUtil.NMLISTVIEW)Marshal.PtrToStructure(lParam, typeof(InteropUtil.NMLISTVIEW)); var oldSelected = (nmListView.uOldState & InteropUtil.LVIS_SELECTED) != 0; var newSelected = (nmListView.uNewState & InteropUtil.LVIS_SELECTED) != 0; if (!oldSelected && newSelected) { if (!m_suppressSelectionChange) { //the item went from not selected to being selected //so we want to look and see if the selected item is a folder, and if so //change the text of the item box to be the item on the folder. But, before we do that //we want to make sure that the box isn't currently focused. var hParent = hWnd.GetParent(); var hFNCombo = hParent.GetDlgItem(InteropUtil.ID_FileNameCombo); var hFNEditBox = hParent.GetDlgItem(InteropUtil.ID_FileNameTextBox); var hFocus = InteropUtil.GetFocus(); if ( (hFNCombo == IntPtr.Zero || hFNCombo != hFocus) && (hFNEditBox == IntPtr.Zero || hFNEditBox != hFocus) ) { SetFileNameToSelectedItem(header.hwndFrom, hFNCombo, nmListView.iItem); } } m_suppressSelectionChange = false; } } } return hWnd.DefSubclassProc(uMsg, wParam, lParam); }