protected override bool HandleCursorLoop(Keys key) { int focusedIdx = ShellBrowser.GetFocusedIndex(); int itemCount = ShellBrowser.GetItemCount(); int selectMe = -1; int viewMode = ShellBrowser.ViewMode; if (viewMode == FVM.TILE && QTUtility.IsXP) { viewMode = FVM.ICON; } switch (viewMode) { case FVM.CONTENT: case FVM.DETAILS: case FVM.TILE: if (key == Keys.Up && focusedIdx == 0) { selectMe = itemCount - 1; } else if (key == Keys.Down && focusedIdx == itemCount - 1) { selectMe = 0; } break; case FVM.ICON: case FVM.SMALLICON: case FVM.THUMBNAIL: case FVM.LIST: Keys KeyNextItem, KeyPrevItem, KeyNextPage, KeyPrevPage; IntPtr MsgNextPage, MsgPrevPage; if (viewMode == FVM.LIST) { KeyNextItem = Keys.Down; KeyPrevItem = Keys.Up; KeyNextPage = Keys.Right; KeyPrevPage = Keys.Left; MsgNextPage = (IntPtr)LVNI.TORIGHT; MsgPrevPage = (IntPtr)LVNI.TOLEFT; } else { KeyNextItem = Keys.Right; KeyPrevItem = Keys.Left; KeyNextPage = Keys.Down; KeyPrevPage = Keys.Up; MsgNextPage = (IntPtr)LVNI.BELOW; MsgPrevPage = (IntPtr)LVNI.ABOVE; } int nextPageIdx = (int)PInvoke.SendMessage(Handle, LVM.GETNEXTITEM, (IntPtr)focusedIdx, MsgNextPage); if (nextPageIdx == -1 || nextPageIdx == focusedIdx) { nextPageIdx = (int)PInvoke.SendMessage(Handle, LVM.GETNEXTITEM, (IntPtr)focusedIdx, MsgPrevPage); } else if (QTUtility.IsXP) { int testIdx = (int)PInvoke.SendMessage(Handle, LVM.GETNEXTITEM, (IntPtr)nextPageIdx, MsgPrevPage); if (testIdx != focusedIdx) { nextPageIdx = (int)PInvoke.SendMessage(Handle, LVM.GETNEXTITEM, (IntPtr)focusedIdx, MsgPrevPage); } } if (nextPageIdx == -1 || nextPageIdx == focusedIdx) { if (key == KeyNextItem) { if (focusedIdx == itemCount - 1) { selectMe = 0; } else { RECT thisRect = GetItemRect(focusedIdx); RECT nextRect = GetItemRect(focusedIdx + 1); if (viewMode == FVM.LIST) { if (nextRect.top < thisRect.top) { selectMe = 0; } } else if (nextRect.left < thisRect.left) { selectMe = 0; } } } else if (key == KeyPrevItem && focusedIdx == 0) { selectMe = itemCount - 1; } else if (key == KeyNextPage || key == KeyPrevPage) { if (QTUtility.IsXP) { return(true); } } } else { int pageCount = Math.Abs(focusedIdx - nextPageIdx); int page = focusedIdx % pageCount; if (key == KeyNextItem && (page == pageCount - 1 || focusedIdx == itemCount - 1)) { selectMe = focusedIdx - page; } else if (key == KeyPrevItem && page == 0) { selectMe = Math.Min(focusedIdx + pageCount - 1, itemCount - 1); } else if (key == KeyNextPage && focusedIdx + pageCount >= itemCount) { selectMe = page; } else if (key == KeyPrevPage && focusedIdx < pageCount) { int x = itemCount - focusedIdx - 1; selectMe = x - x % pageCount + focusedIdx; } } break; } if (selectMe >= 0) { SetRedraw(false); ShellBrowser.SelectItem(selectMe); PInvoke.SendMessage(Handle, LVM.REDRAWITEMS, (IntPtr)focusedIdx, (IntPtr)focusedIdx); SetRedraw(true); return(true); } else { return(false); } }
// 使用箭头键时候环绕选择文件夹 protected override bool HandleCursorLoop(Keys key) { int focusedIdx = ShellBrowser.GetFocusedIndex(); int itemCount = ShellBrowser.GetItemCount(); int selectMe = -1; FVM viewMode = ShellBrowser.ViewMode; switch (viewMode) { case FVM.CONTENT: case FVM.DETAILS: if (key == Keys.Up && focusedIdx == 0) { selectMe = itemCount - 1; } else if (key == Keys.Down && focusedIdx == itemCount - 1) { selectMe = 0; } break; case FVM.ICON: case FVM.SMALLICON: case FVM.THUMBNAIL: case FVM.TILE: case FVM.LIST: Keys KeyNextItem, KeyPrevItem, KeyNextPage, KeyPrevPage; if (viewMode == FVM.LIST) { KeyNextItem = Keys.Down; KeyPrevItem = Keys.Up; KeyNextPage = Keys.Right; KeyPrevPage = Keys.Left; } else { KeyNextItem = Keys.Right; KeyPrevItem = Keys.Left; KeyNextPage = Keys.Down; KeyPrevPage = Keys.Up; } int pageCount = AutomationManager.DoQuery(factory => { AutomationElement elem = factory.FromHandle(Handle); if (elem == null) { return(-1); } return(viewMode == FVM.LIST ? elem.GetRowCount() : elem.GetColumnCount()); }); if (pageCount == -1) { return(false); } int page = focusedIdx % pageCount; if (key == KeyNextItem && (page == pageCount - 1 || focusedIdx == itemCount - 1)) { selectMe = focusedIdx - page; } else if (key == KeyPrevItem && page == 0) { selectMe = Math.Min(focusedIdx + pageCount - 1, itemCount - 1); } else if (key == KeyNextPage && focusedIdx + pageCount >= itemCount) { selectMe = page; } else if (key == KeyPrevPage && focusedIdx < pageCount) { int x = itemCount - focusedIdx - 1; selectMe = x - x % pageCount + focusedIdx; } break; } if (selectMe >= 0) { ShellBrowser.SelectItem(selectMe); return(true); } else { return(false); } }