From 6f86d6ca370d7404db0ba0a3f80ef7b728e1d647 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E5=88=9D?= <1003019131@qq.com> Date: Wed, 5 Apr 2023 13:06:15 +0800 Subject: [PATCH 1/9] Fix bugs --- src/Gui/SearchGui/IntelligentMode.ah2 | 12 ++++--- src/Gui/SearchGui/PluginMode.ah2 | 50 +++++++++++++++++++++------ src/Utils/WiseGuiHelper.ah2 | 4 +-- 3 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/Gui/SearchGui/IntelligentMode.ah2 b/src/Gui/SearchGui/IntelligentMode.ah2 index 5dadf00..940830a 100644 --- a/src/Gui/SearchGui/IntelligentMode.ah2 +++ b/src/Gui/SearchGui/IntelligentMode.ah2 @@ -15,11 +15,13 @@ class IntelligentMode { { get => this.listView.GetNext() set { - if (value > GlobalData.intelligentSearchResult.Length + this.pluginSearchResult.Length) - value := 1 - else if (value == 0) - value := GlobalData.startupSearchResult.Length + this.pluginSearchResult.Length - this.listView.Modify(value, "Select Focus Vis") + if (GlobalData.intelligentSearchResult.Length || this.pluginSearchResult.Length) { ; 有内容才可修改 + if (value > GlobalData.intelligentSearchResult.Length + this.pluginSearchResult.Length) + value := 1 + else if (value == 0) + value := GlobalData.startupSearchResult.Length + this.pluginSearchResult.Length + this.listView.Modify(value, "Select Focus Vis") + } } } ;#endregion diff --git a/src/Gui/SearchGui/PluginMode.ah2 b/src/Gui/SearchGui/PluginMode.ah2 index b84251f..4b02c84 100644 --- a/src/Gui/SearchGui/PluginMode.ah2 +++ b/src/Gui/SearchGui/PluginMode.ah2 @@ -3,7 +3,7 @@ * @Version: 0.0.1 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-04 + * @LastEditTime: 2023-04-05 * @Description: 插件模式 */ @@ -21,6 +21,7 @@ class PluginMode { static runHandler := (*) => 0 static doubleLeftHandler := (*) => 0 static loadImgsHandler := (*) => 0 + static toBottomHandler := (*) => 0 static pluginSearchData := [] static pluginSearchResult := [] @@ -39,11 +40,14 @@ class PluginMode { { get => this.listView.GetNext() set { - if (value > this.pluginSearchResult.Length) - value := 1 - else if (value == 0) - value := this.pluginSearchResult.Length - this.listView.Modify(value, "Select Focus Vis") + if (this.pluginSearchResult.Length) { ; 有内容才可修改 + if (value > this.pluginSearchResult.Length) + value := 1 + else if (value == 0) + value := this.pluginSearchResult.Length + this.listView.Modify(value, "Select Focus Vis") + this.toBottomNotify() ; 触发检测 + } } } ;#endregion @@ -68,15 +72,29 @@ class PluginMode { this.listView.SetFont("s14 w700 c444444") ; 鼠标双击运行 - this.listView.OnEvent("DoubleClick", (_lv, rowNum) => rowNum ? this.pluginRun(rowNum) : 0) + this.listView.OnEvent("DoubleClick", (_, rowNum) => rowNum ? this.pluginRun(rowNum) : 0) ; 菜单栏 - this.listView.OnEvent("ContextMenu", (_lv, rowNum, *) => rowNum ? this.showMenu() : 0) + this.listView.OnEvent("ContextMenu", (_, rowNum, *) => rowNum ? this.showMenu() : 0) + + LVN_ENDSCROLL := -181 + this.listView.OnNotify(LVN_ENDSCROLL, this.toBottomNotify) ;滚动结束时检测是否触底 ; 插件模式热键处理函数 this.hotkeyHandlerMap["~Esc"] := () => StrLen(SearchGui.searchText) ? SearchGui.searchText := SearchGui.edit.Value := "" : SearchGui.mode := this.oldMode ;切回原来的模式 - this.hotkeyHandlerMap["~Left Up"] := () => (A_ThisHotkey == A_PriorHotkey && A_TimeSincePriorHotkey < 250) ? this.pluginRun(, true) : 0 + rightUpHandler() { + static lastEndFlag := false + EditCtrlFunc.getSelection(&s, &e, SearchGui.edit) + if (s == e && e == StrLen(SearchGui.searchText)) { ; 选区是否位于最后 + if ((A_ThisHotkey == A_PriorHotkey && A_TimeSincePriorHotkey < 250) && (rowNum := this.focusedRow) && lastEndFlag) { + this.pluginRun(, true) + } + lastEndFlag := true + } else + lastEndFlag := false + } + this.hotkeyHandlerMap["~Right Up"] := rightUpHandler this.hotkeyHandlerMap["Down"] := () => this.focusedRow++ this.hotkeyHandlerMap["Up"] := () => this.focusedRow-- @@ -84,6 +102,17 @@ class PluginMode { this._default_thumb := LoadPicture(GlobalData.imgDir "\plugin.png", "w64") } + ; 检测是否触底并发出通知 + static toBottomNotify(*) { + static LVM_ISITEMVISIBLE := 0x10B6 + index := PluginMode.pluginSearchResult.Length + if (index) { + res := SendMessage(LVM_ISITEMVISIBLE, index - 1, 0, PluginMode.listView) + if (res) + PluginMode.toBottomHandler() ;调用触底处理函数 + } + } + ; 重新加载搜索列表图标资源 static reloadIL(ILFlag) { SearchGui.placeholder := "正在加载插件模式搜索列表..." @@ -110,7 +139,7 @@ class PluginMode { } - static showPluginMode(pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, loadImgsHandler?, menuInitHandler?, searchText := "", placeholder := "", thumb?) { + static showPluginMode(pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, loadImgsHandler?, toBottomHandler?, menuInitHandler?, searchText := "", placeholder := "", thumb?) { this.oldMode := SearchGui.mode this.pluginSearchData := pluginSearchData @@ -118,6 +147,7 @@ class PluginMode { this.runHandler := runHandler this.doubleLeftHandler := IsSet(doubleLeftHandler) ? doubleLeftHandler : (*) => 0 this.loadImgsHandler := IsSet(loadImgsHandler) ? loadImgsHandler : (*) => 0 + this.toBottomHandler := IsSet(toBottomHandler) ? toBottomHandler : (*) => 0 this.rowHeight := 0 this.menu := 0 diff --git a/src/Utils/WiseGuiHelper.ah2 b/src/Utils/WiseGuiHelper.ah2 index aafa378..a7a947c 100644 --- a/src/Utils/WiseGuiHelper.ah2 +++ b/src/Utils/WiseGuiHelper.ah2 @@ -3,7 +3,7 @@ * @Version: 0.0.1 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-04 + * @LastEditTime: 2023-04-05 * @Description: WiseGui辅助类,便于对象化调用WiseGui */ @@ -47,7 +47,7 @@ class WiseGuiHelper { if (IsSet(theme)) opts.Push("theme: " theme) - id := unique ? A_TickCount : this.id + id := unique ? "H" A_TickCount : this.id WiseGuiHelper.WiseGui(id, opts*) return id } From 6ac4032aa1bee503ab37845ac521fea4c9482641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E5=88=9D?= <1003019131@qq.com> Date: Wed, 5 Apr 2023 13:08:19 +0800 Subject: [PATCH 2/9] Modify hotkey "Left" to "Right" --- src/Gui/SearchGui/SearchGui.ah2 | 4 +-- src/Gui/SearchGui/StartupMode.ah2 | 47 +++++++++++++++++++++---------- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/Gui/SearchGui/SearchGui.ah2 b/src/Gui/SearchGui/SearchGui.ah2 index 5d584c4..00db1bb 100644 --- a/src/Gui/SearchGui/SearchGui.ah2 +++ b/src/Gui/SearchGui/SearchGui.ah2 @@ -8,7 +8,7 @@ class SearchGui { ;#region 设置搜索框占位符 static placeholder { - set => DllCall("User32.dll\SendMessageW", "Ptr", SearchGui.edit.Hwnd, "Uint", (0x1500 + 1), "Ptr", True, "WStr", value) + set => EditCtrlFunc.setPlaceholder(SearchGui.edit, value) } ;#endregion @@ -169,7 +169,7 @@ class SearchGui { ; 清空、隐藏 Hotkey("~Esc", hotkeyHandler) ; 文件夹中显示 - Hotkey("~Left Up", hotkeyHandler) + Hotkey("~Right Up", hotkeyHandler) ; 上下移动焦点行 Hotkey("Down", hotkeyHandler) Hotkey("Up", hotkeyHandler) diff --git a/src/Gui/SearchGui/StartupMode.ah2 b/src/Gui/SearchGui/StartupMode.ah2 index 9a40d8f..451af6d 100644 --- a/src/Gui/SearchGui/StartupMode.ah2 +++ b/src/Gui/SearchGui/StartupMode.ah2 @@ -16,11 +16,13 @@ class StartupMode { { get => this.listView.GetNext() set { - if (value > GlobalData.startupSearchResult.Length + this.pluginSearchResult.Length) - value := 1 - else if (value == 0) - value := GlobalData.startupSearchResult.Length + this.pluginSearchResult.Length - this.listView.Modify(value, "Select Focus Vis") + if (GlobalData.startupSearchResult.Length || this.pluginSearchResult.Length) { ; 有内容才可修改 + if (value > GlobalData.startupSearchResult.Length + this.pluginSearchResult.Length) + value := 1 + else if (value == 0) + value := GlobalData.startupSearchResult.Length + this.pluginSearchResult.Length + this.listView.Modify(value, "Select Focus Vis") + } } } ;#endregion @@ -50,21 +52,36 @@ class StartupMode { ; 鼠标双击运行 this.listView.OnEvent("DoubleClick", (_lv, rowNum) => rowNum ? this.startupRun(rowNum) : 0) ; 菜单栏 - this.listView.OnEvent("ContextMenu", (_lv, rowNum, *) => !rowNum ? - 0 : rowNum > this.pluginSearchResult.Length ? - this.menu.Show() : this.pluginSearchResult[rowNum].HasOwnProp("menu") ? - this.pluginSearchResult[rowNum].menu.Show() : 0 - ) + showMenuHandler() { + if (rowNum := this.focusedRow) { + if (rowNum > this.pluginSearchResult.Length) + this.menu.Show() + else + this.pluginSearchResult[rowNum].HasOwnProp("menu") ? this.pluginSearchResult[rowNum].menu.Show() : 0 + } + } + this.listView.OnEvent("ContextMenu", (*) => showMenuHandler()) ; 启动模式热键处理函数 this.hotkeyHandlerMap["~Esc"] := () => StrLen(SearchGui.searchText) ? SearchGui.searchText := SearchGui.edit.Value := "" : this.hideGui() - this.hotkeyHandlerMap["~Left Up"] := () => (A_ThisHotkey != A_PriorHotkey || A_TimeSincePriorHotkey > 250) ? - 0 : this.focusedRow > this.pluginSearchResult.Length ? - this.openSelectedFileInFolder() : !this.pluginSearchResult[this.focusedRow].HasOwnProp("doubleLeftHandler") ? - 0 : this.pluginSearchResult[this.focusedRow].doubleLeftHandler(SearchGui.searchText) - + rightUpHandler() { + static lastEndFlag := false + EditCtrlFunc.getSelection(&s, &e, SearchGui.edit) + if (s == e && e == StrLen(SearchGui.searchText)) { ; 选区是否位于最后 + if ((A_ThisHotkey == A_PriorHotkey && A_TimeSincePriorHotkey < 250) && (rowNum := this.focusedRow) && lastEndFlag) { + len := this.pluginSearchResult.Length + if (rowNum > len) + this.openSelectedFileInFolder(rowNum - len) + else if (this.pluginSearchResult[rowNum - len].HasOwnProp("doubleLeftHandler")) + this.pluginSearchResult[rowNum - len].doubleLeftHandler(SearchGui.searchText) + } + lastEndFlag := true + } else + lastEndFlag := false + } + this.hotkeyHandlerMap["~Right Up"] := rightUpHandler this.hotkeyHandlerMap["Down"] := () => this.focusedRow++ this.hotkeyHandlerMap["Up"] := () => this.focusedRow-- From 60167a4cc79613ee61a50820a3d02de9d142ca31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E5=88=9D?= <1003019131@qq.com> Date: Wed, 5 Apr 2023 13:08:50 +0800 Subject: [PATCH 3/9] Add "toBottom" handler --- src/Plugin/demo.ahk | 7 +-- ...1\351\241\265\346\220\234\347\264\242.ahk" | 14 ++--- src/Starter.ah2 | 3 +- src/Utils/EditCtrlFunc.ah2 | 52 +++++++++++++++++++ src/Utils/PluginHelper.ah2 | 6 ++- 5 files changed, 69 insertions(+), 13 deletions(-) create mode 100644 src/Utils/EditCtrlFunc.ah2 diff --git a/src/Plugin/demo.ahk b/src/Plugin/demo.ahk index e14e11e..fe38742 100644 --- a/src/Plugin/demo.ahk +++ b/src/Plugin/demo.ahk @@ -3,7 +3,7 @@ * @Version: 0.0.4 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-04 + * @LastEditTime: 2023-04-05 * @Description: 插件示例 */ @@ -123,8 +123,8 @@ class Plugin_Demo { hIcon := PluginHelper.getPluginHIcon("demo.ahk") data := [] - loop 3 { - data.Push({ title: A_Index, iconPath: hIcon }) + loop 15 { + data.Push({ title: Format("{:03}", A_Index), iconPath: hIcon }) } ;#endregion @@ -138,6 +138,7 @@ class Plugin_Demo { (that, rowNum) => rowNum > 0 ? PluginHelper.Utils.tip(this.name, "double Left" that.pluginSearchResult[rowNum].title, 1500) : 0, loadImgs, + (that) => PluginHelper.Utils.tip(this.name, "列表触底通知:可以通过这种方式异步加载数量过大的列表", 1000, true), menuInit, , "输入搜索内容吧!" ) diff --git "a/src/Plugin/\347\275\221\351\241\265\346\220\234\347\264\242.ahk" "b/src/Plugin/\347\275\221\351\241\265\346\220\234\347\264\242.ahk" index b472eed..33a10f9 100644 --- "a/src/Plugin/\347\275\221\351\241\265\346\220\234\347\264\242.ahk" +++ "b/src/Plugin/\347\275\221\351\241\265\346\220\234\347\264\242.ahk" @@ -3,7 +3,7 @@ * @Version: 0.0.1 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-04 + * @LastEditTime: 2023-04-05 * @Description: 网页搜索(带联想词) */ @@ -164,7 +164,7 @@ class Plugin_网页搜索 { PluginMode.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, - runHandler, , , , , + runHandler, , , , , , "Search on Google", this.hIcon ) @@ -180,7 +180,7 @@ class Plugin_网页搜索 { PluginMode.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, - runHandler, , , , + runHandler, , , , , content, ; 搜索词替换为传入的内容 "Search on Google", this.hIcon @@ -247,7 +247,7 @@ class Plugin_网页搜索 { PluginMode.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, - runHandler, , , , , + runHandler, , , , , , "Search on Bing", this.hIcon ) @@ -263,7 +263,7 @@ class Plugin_网页搜索 { PluginMode.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, - runHandler, , , , + runHandler, , , , , content, ; 搜索词替换为传入的内容 "Search on Bing", this.hIcon @@ -325,7 +325,7 @@ class Plugin_网页搜索 { PluginMode.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, - runHandler, , , , , + runHandler, , , , , , "百度一下,你就知道", this.hIcon ) @@ -341,7 +341,7 @@ class Plugin_网页搜索 { PluginMode.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, - runHandler, , , , + runHandler, , , , , content, ; 搜索词替换为传入的内容 "百度一下,你就知道", this.hIcon diff --git a/src/Starter.ah2 b/src/Starter.ah2 index aa52fc7..a949871 100644 --- a/src/Starter.ah2 +++ b/src/Starter.ah2 @@ -3,7 +3,7 @@ * @Version: 0.3.0 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-04 + * @LastEditTime: 2023-04-05 * @Description: 介绍Starter 是一款AHK编写的快速启动工具,旨在方便快捷地启动文件、文件夹,提高电脑的使用效率。 */ #NoTrayIcon ; 先隐藏图标 @@ -38,6 +38,7 @@ PluginGui.init() ;同时重启以加载插件 #Include .\Utils\Start.ah2 #Include .\Utils\WiseGuiHelper.ah2 #Include .\Utils\UrlEncode.ah2 +#Include .\Utils\EditCtrlFunc.ah2 #Include .\Utils\7Zip\SevenZip.ahk Tip := WiseGuiHelper("tooltip") diff --git a/src/Utils/EditCtrlFunc.ah2 b/src/Utils/EditCtrlFunc.ah2 new file mode 100644 index 0000000..e8a496b --- /dev/null +++ b/src/Utils/EditCtrlFunc.ah2 @@ -0,0 +1,52 @@ +class EditCtrlFunc { + ; Set placeholder + static setPlaceholder(ctrl, placeHolder) { + DllCall("User32.dll\SendMessageW", "Ptr", ctrl.Hwnd, "Uint", (0x1500 + 1), "Ptr", True, "WStr", placeHolder) + } + + ; Gets the start and end offset of the current selection. + static getSelection(&start, &end, ctrl) { + s := Buffer(4, 0), e := Buffer(4, 0) + SendMessage(0xB0, s.Ptr, e.Ptr, ctrl) ;EM_GETSEL + start := NumGet(s, 0, "UInt"), end := NumGet(e, 0, "UInt") + } + + ; Selects text in a edit box, given absolute character positions (starting at 0.) + ; + ; start: Starting character offset, or -1 to deselect. + ; end: Ending character offset, or -1 for "end of text." + static editSelect(ctrl, start := 0, end := -1) { + SendMessage(0xB1, start, end, ctrl) ;EM_SETSEL + } + + ; Selects a line of text. + ; + ; line: One-based line number, or 0 to select the current line. + ; include_newline: Whether to also select the line terminator (`r`n). + ; + static editSelectline(ctrl, line := 0, include_newline := false) + { + if (line < 1) + line := EditGetCurrentLine(ctrl) + + offset := SendMessage(0xBB, line - 1, 0, ctrl) ; EM_LINEINDEX + lineLen := SendMessage(0xC1, offset, 0, ctrl) ; EM_LINELENGTH + + if (include_newline) { + lineLen += (ctrl.ClassNN = "Edit" || ctrl.ClassNN = "Edit1") ? 2 : 1 ; `r`n : `n + } + + ; Select the line. + SendMessage(0xB1, offset, offset + lineLen, ctrl) ; EM_SETSEL + } + + ; Deletes a line of text. + ; + ; line: One-based line number, or 0 to delete current line. + ; + static editDeleteline(ctrl, line := 0) { + ; Select the line. + this.editSelectline(ctrl, line, true) + ControlSend("{Delete}", ctrl) + } +} \ No newline at end of file diff --git a/src/Utils/PluginHelper.ah2 b/src/Utils/PluginHelper.ah2 index 0c3c88f..53bf6cf 100644 --- a/src/Utils/PluginHelper.ah2 +++ b/src/Utils/PluginHelper.ah2 @@ -3,7 +3,7 @@ * @Version: 0.0.3 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-04 + * @LastEditTime: 2023-04-05 * @Description: 插件API封装 */ @@ -114,12 +114,14 @@ class PluginHelper { * @param runHandler 插件模式回车、双击任意项时的处理函数 (that, rowNum) => void * @param doubleLeftHandler (可选)插件模式双击Left时的处理函数 (that, rowNum) => void * @param loadImgsHandler (可选)加载插件模式图片的处理函数 (that) => void + * @param toBottomHandler (可选)列表最后一行可见(触底)处理函数 (that) => void * @param menuInitHandler (可选)右键显示菜单栏初始化处理函数 (that) => void * @param searchText (可选)启动时设置搜索框文本 * @param placeholder (可选)设置搜索框占位符 * @param thumb (可选)hICON 设置插件模式搜索框图标 */ - static showPluginMode(pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, loadImgsHandler?, menuInitHandler?, searchText := "", placeholder := "", thumb?) { + static showPluginMode(pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, loadImgsHandler?, toBottomHandler?, + menuInitHandler?, searchText := "", placeholder := "", thumb?) { PluginMode.showPluginMode( ; 启动插件模式 pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, loadImgsHandler?, menuInitHandler?, searchText, placeholder, thumb? From 47c7e8fbd784ed7e0d8c26ed0408ad8a2500fa29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E5=88=9D?= <1003019131@qq.com> Date: Wed, 5 Apr 2023 19:39:49 +0800 Subject: [PATCH 4/9] Modify Window size --- src/Gui/SearchGui/IntelligentMode.ah2 | 26 ++++++++++++++++------ src/Gui/SearchGui/PluginMode.ah2 | 8 +++---- src/Gui/SearchGui/SearchGui.ah2 | 6 +++--- src/Gui/SearchGui/StartupMode.ah2 | 31 ++++++++++++++++----------- 4 files changed, 45 insertions(+), 26 deletions(-) diff --git a/src/Gui/SearchGui/IntelligentMode.ah2 b/src/Gui/SearchGui/IntelligentMode.ah2 index 940830a..5710e97 100644 --- a/src/Gui/SearchGui/IntelligentMode.ah2 +++ b/src/Gui/SearchGui/IntelligentMode.ah2 @@ -2,6 +2,7 @@ class IntelligentMode { ; static listView := unset ; static menu := unset static imgListID := 0 + static rowHeight := 0 static imgPathToImgListIndex := Map() static hotkeyHandlerMap := Map() @@ -42,7 +43,7 @@ class IntelligentMode { static init() { ; 本列表默认隐藏 - this.listView := SearchGui.gui.Add("ListView", "x10 y50 w510 r8 -Multi -hdr -E0x200 Hidden Count" 3, [""]) + this.listView := SearchGui.gui.Add("ListView", "x10 y52 w560 r10 -Multi -hdr -E0x200 Hidden Count" 3, [""]) this.listView.SetFont("s14 w700 c444444") this.loadImgs() @@ -248,14 +249,25 @@ class IntelligentMode { this.listView.Add("Icon" this.imgPathToImgListIndex[GlobalData.imgDir "\noImg.png"], " " item["title"]) } - ;重置listView和gui高度 + this.resizeGui() + } + + ;重置listView和gui高度 + static resizeGui() { len := GlobalData.intelligentSearchResult.Length + this.pluginSearchResult.Length - LVHeight := Round((len >= 8 ? 8 : len) * 26.4) ; 此处不需要DPI缩放计算 - this.listView.Move(, , , LVHeight) - this.listView.ModifyCol(1, "480") - this.listView.Modify(1, "Select Focus Vis") ;聚焦第一行 + if (len && this.rowHeight == 0) { + LV_XYstruct := Buffer(16, 0) + SendMessage(0x1038, 1, LV_XYstruct.Ptr, , this.listView) + if (rowH := NumGet(LV_XYstruct, 12, "UInt") - NumGet(LV_XYstruct, 4, "UInt")) + this.rowHeight := rowH + } + + LVHeight := len > 0 ? Ceil((len >= 8 ? 8 : len) * this.rowHeight) : 0 + ControlMove(, , , LVHeight, this.listView) ; 使用ControlMove避免DPI 缩放 + this.listView.ModifyCol(1, "530") + this.focusedRow := 1 ;聚焦第一行 this.listView.Opt("Redraw") - WinMove(, , 500 * (A_ScreenDPI / 96), Round((LVHeight + 55) * (A_ScreenDPI / 96)), SearchGui.gui) + WinMove(, , 550 * (A_ScreenDPI / 96), LVHeight + Ceil(55 * (A_ScreenDPI / 96)), SearchGui.gui) } ; 载入插件图片 diff --git a/src/Gui/SearchGui/PluginMode.ah2 b/src/Gui/SearchGui/PluginMode.ah2 index 4b02c84..ea23fb9 100644 --- a/src/Gui/SearchGui/PluginMode.ah2 +++ b/src/Gui/SearchGui/PluginMode.ah2 @@ -68,7 +68,7 @@ class PluginMode { ; 初始化 static init() { - this.listView := SearchGui.gui.Add("ListView", "x10 y50 w510 r8 -Multi -hdr -E0x200", [""]) + this.listView := SearchGui.gui.Add("ListView", "x10 y52 w560 r10 -Multi -hdr -E0x200", [""]) this.listView.SetFont("s14 w700 c444444") ; 鼠标双击运行 @@ -179,12 +179,12 @@ class PluginMode { this.rowHeight := rowH } - LVHeight := len > 0 ? Round((len >= 8 ? 8 : len) * this.rowHeight) : 0 + LVHeight := len > 0 ? Ceil((len >= 8 ? 8 : len) * this.rowHeight) : 0 ControlMove(, , , LVHeight, this.listView) ; 使用ControlMove避免DPI 缩放 - this.listView.ModifyCol(1, "480") + this.listView.ModifyCol(1, "530") this.focusedRow := 1 ;聚焦第一行 this.listView.Opt("Redraw") - WinMove(, , 500 * (A_ScreenDPI / 96), LVHeight + Round(55 * (A_ScreenDPI / 96)), SearchGui.gui) + WinMove(, , 550 * (A_ScreenDPI / 96), LVHeight + Ceil(55 * (A_ScreenDPI / 96)), SearchGui.gui) } static pluginRun(rowNum?, doubleLeft := false) { diff --git a/src/Gui/SearchGui/SearchGui.ah2 b/src/Gui/SearchGui/SearchGui.ah2 index 00db1bb..9da64cd 100644 --- a/src/Gui/SearchGui/SearchGui.ah2 +++ b/src/Gui/SearchGui/SearchGui.ah2 @@ -87,7 +87,7 @@ class SearchGui { this.gui.SetFont(, "雅痞-简") ;优先使用更好看的字体 this.gui.MarginY := 0 - this.edit := this.gui.AddEdit("x10 y10 h30 w445 -E0x200") + this.edit := this.gui.AddEdit("x10 y10 h30 w495 -E0x200") this.placeholder := "Hi, Starter" this.edit.Focus() @@ -101,14 +101,14 @@ class SearchGui { this.thumbList := [LoadPicture(GlobalData.imgDir "\Starter.png", "w64"), LoadPicture(GlobalData.imgDir "\AI.png", "w64")] - this.thumb := this.gui.AddPicture("x460 y10 w30 h30", "hBitmap:*" this.thumbList[1]) + this.thumb := this.gui.AddPicture("x510 y10 w30 h30", "hBitmap:*" this.thumbList[1]) ; 回车触发 this.gui.AddButton("Default Hidden").OnEvent("Click", (*) => this.mode == 0 ? StartupMode.startupRun() : this.mode == 1 ? IntelligentMode.intelligentRun() : PluginMode.pluginRun()) - this.gui.Show("Hide y" Round(A_ScreenHeight / 5)) + this.gui.Show("w550 Hide y" Ceil(A_ScreenHeight / 5)) StartupMode.init() IntelligentMode.init() PluginMode.init() diff --git a/src/Gui/SearchGui/StartupMode.ah2 b/src/Gui/SearchGui/StartupMode.ah2 index 451af6d..f731524 100644 --- a/src/Gui/SearchGui/StartupMode.ah2 +++ b/src/Gui/SearchGui/StartupMode.ah2 @@ -3,6 +3,7 @@ class StartupMode { ; static menu := unset static imgListID := 0 + static rowHeight := 0 static imgPathToImgListIndex := Map() static hotkeyHandlerMap := Map() @@ -43,7 +44,7 @@ class StartupMode { ; 初始化 static init() { - this.listView := SearchGui.gui.Add("ListView", "x10 y50 w510 r8 -Multi -hdr -E0x200 Count" GlobalData.startupData.Length, [""]) + this.listView := SearchGui.gui.Add("ListView", "x10 y50 w560 r10 -Multi -hdr -E0x200 Count" GlobalData.startupData.Length, [""]) this.listView.SetFont("s14 w700 c444444") this.loadImgs(true) @@ -151,12 +152,7 @@ class StartupMode { } this.listView.Delete(rowNum + this.pluginSearchResult.Length) ; 实际删除的列表行不同 - ;重置listView和gui高度 - LVHeight := Round((GlobalData.startupSearchResult.Length >= 8 ? 8 : GlobalData.startupSearchResult.Length) * 26.4) ; 此处不需要DPI缩放计算 - this.listView.Move(, , , LVHeight) - this.listView.ModifyCol(1, "480") - WinMove(, , 500 * (A_ScreenDPI / 96), Round((LVHeight + 55) * (A_ScreenDPI / 96)), SearchGui.gui) - Critical('Off') + this.resizeGui() } ; 回车和双击触发 @@ -291,14 +287,25 @@ class StartupMode { else this.listView.Add("Icon" this.imgPathToImgListIndex[item[2]], " " item[4]) } - ;重置listView和gui高度 + this.resizeGui() + } + + ;重置listView和gui高度 + static resizeGui() { len := GlobalData.startupSearchResult.Length + this.pluginSearchResult.Length - LVHeight := Round((len >= 8 ? 8 : len) * 26.4) ; 此处不需要DPI缩放计算 - this.listView.Move(, , , LVHeight) - this.listView.ModifyCol(1, "480") + if (len && this.rowHeight == 0) { + LV_XYstruct := Buffer(16, 0) + SendMessage(0x1038, 1, LV_XYstruct.Ptr, , this.listView) + if (rowH := NumGet(LV_XYstruct, 12, "UInt") - NumGet(LV_XYstruct, 4, "UInt")) + this.rowHeight := rowH + } + + LVHeight := len > 0 ? Ceil((len >= 8 ? 8 : len) * this.rowHeight) : 0 + ControlMove(, , , LVHeight, this.listView) ; 使用ControlMove避免DPI 缩放 + this.listView.ModifyCol(1, "530") this.focusedRow := 1 ;聚焦第一行 this.listView.Opt("Redraw") - WinMove(, , 500 * (A_ScreenDPI / 96), Round((LVHeight + 55) * (A_ScreenDPI / 96)), SearchGui.gui) + WinMove(, , 550 * (A_ScreenDPI / 96), LVHeight + Ceil(55 * (A_ScreenDPI / 96)), SearchGui.gui) } ; 载入插件图片 From a8ab3f3776671d89494cd09693169dbe2c757ff6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E5=88=9D?= <1003019131@qq.com> Date: Thu, 6 Apr 2023 16:16:33 +0800 Subject: [PATCH 5/9] =?UTF-8?q?Add=20plugin:=20"=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=90=9C=E7=B4=A2"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resource/img/copy.ico | Bin 0 -> 4286 bytes resource/img/link.ico | Bin 0 -> 4286 bytes resource/img/setting.ico | Bin 0 -> 4286 bytes src/Plugin/Everything/Everything.ahk | 247 ++++++++++++ src/Plugin/Everything/Everything32.dll | Bin 0 -> 86656 bytes src/Plugin/Everything/Everything64.dll | Bin 0 -> 94336 bytes ...7\344\273\266\346\220\234\347\264\242.ahk" | 350 ++++++++++++++++++ src/Utils/CopyToClipboard.ah2 | 35 ++ 8 files changed, 632 insertions(+) create mode 100644 resource/img/copy.ico create mode 100644 resource/img/link.ico create mode 100644 resource/img/setting.ico create mode 100644 src/Plugin/Everything/Everything.ahk create mode 100644 src/Plugin/Everything/Everything32.dll create mode 100644 src/Plugin/Everything/Everything64.dll create mode 100644 "src/Plugin/\346\226\207\344\273\266\346\220\234\347\264\242.ahk" create mode 100644 src/Utils/CopyToClipboard.ah2 diff --git a/resource/img/copy.ico b/resource/img/copy.ico new file mode 100644 index 0000000000000000000000000000000000000000..eddc1493d971835dda49f52054c2fc7e03fb0bc4 GIT binary patch literal 4286 zcmeH_!A-+Z5JW#6aN?XJU9hFN11KS#aHSjQ2=+;g^u5_=Vq0*^AY<>$yuVJAF&^^o zbQ=60ACF@^jWM3{N^3-3_~@M3UAw=5CCTp%*Vpb%m*BEt@BEIJCvA7S-7k5}wd*xA zy~FlxYhszsdY_)xt@RW)_SV$pv`pu)8{P7`qV(#VvDK0d?b2=_c|2cJWH9&Ye2trZ z@z?Hiw?0Q2;>hZZ=On(npA8(Di=$d+JSXwticJn9p196s;#D^<3 zIgEJXI^#Ks4_9n*81ck)#&Z%MuGr)-;)&~w=OjK{vB_b?6W1BfNqo3slf#H7t}~vK z_;AH0hY?R)XFMnI;fhTTBc8a@bAkPdJMNeL+-9oR>1&;jXybdYp_JAk*0m(lFVkqq_> z2XE%bTJ87$--;8$4Ih!9-{H9m;WmVD2iOWV(0#2vv$fU}m~a9D_W&;7bHI^n1D38G z2IiT%o|wx*A!6?{9$WAL9zhE%PtW=u%vpk%>A$e965{IlG4STj&<(n(pYmq=yOzpu zL0zAJ4|3%*NbZJ$xt)Doz*UN6Xbbr{n)x>)MEy;~&3y01liDL}&Cmf~>U{z|xc5WX zi|b3<2BMuo?QT-flJ~xYSCY}m|FrL{G($=wmqEC%BqOxZ5+>I)av5^-QR8Tk)0jHf zXPR2xL!5x0YadrUKgELyYtv{)?yt2iV^1?2!CWOy zNHe6omDT_|1MUA>9RfX2&yw0en#*6%y7u2p<=L~T{^!*27km2Lr5P%?Jy8Dxn5#-M zsP`+dvzNKd2c0;BdURj|YOn(rVBXp4h;6otpeLJ>qo2r8sfv9l0UB(RNEB3KAwl|PU|6tUdG*hDOBL?nnJDgg=F zq_hylBBF(;y=6eb!dA}*bKo-U&RclC2SQG`Z|l^O*+XjR+B*mvNN99}5CDt_f4UsFs2D;n~rCoWIn0v_erPqa2U$hoFv#iX&J z0nAzogUI3512=Bk%3vm#oLBx?;d_5N)X2@FL2KaAdNW|%FO9ueUn$-MZc905padK> z_tHbJ_pEr2!UG9nPs~?UJ618Eh9>sJ9Pb+DRJ8t#@{5X>nTz*SR269Pp%)Ll?8}Tk zY^s3nX`i6rk7`d00iJj>qYI}*`WkO_2?ED={XOW(yUs*tNqE|yStWLh_@J<+>$^Iv z`um{yrkrpOH8dsSnPLXBy0BBE-!FK!h3Jm<@b45SLX8}b8k&e}+W7kLX2vLdl%Sl? za}4)eu}@I~jvAWy-e@w1=TQ8V5FgI2aZU-`LlYeL=N{JMxW?YHrt-GRTK ChXa!U literal 0 HcmV?d00001 diff --git a/src/Plugin/Everything/Everything.ahk b/src/Plugin/Everything/Everything.ahk new file mode 100644 index 0000000..4eece95 --- /dev/null +++ b/src/Plugin/Everything/Everything.ahk @@ -0,0 +1,247 @@ +/** + * @Name: Everything.ahk + * @Version: 0.0.1 + * @Author: ruchuby + * @LastEditors: ruchuby + * @LastEditTime: 2023-04-06 + * @Description: Everything文件搜索基本功能封装,请自行安装、运行Everything + */ + +; example==================================== +; Everything.loadLibrary() +; Everything.setRequestFlags(0x00000004 | 0x00000010 | 0x00000020 | 0x00000040) ;名称路径|大小|创建日期|修改日期 +; Everything.setSort(Everything.CONSTANT_SETSORT.EVERYTHING_SORT_PATH_ASCENDING) + +; ;语法见 https://www.voidtools.com/zh-cn/support/everything/searching/ +; Everything.setSearch("file: AutoHotkey.exe") ;仅搜索文件: AutoHotkey.exe +; if (!Everything.query()) { +; MsgBox("检索失败, 状态码:" Everything.getLastError()) +; return +; } +; num := Everything.getNumResults() +; loop num > 5 ? 5 : num { +; i := A_Index - 1 +; MsgBox(Everything.getResultFullPathName(i) +; . "`n文件大小: " Round(Everything.getResultSize(i) / 1024) "Kb" +; . "`n创建时间: " Everything.getResultDateCreated(i) +; . "`n修改时间: " Everything.getResultDateModified(i)) +; } +; Everything.freeLibrary() +;=========================================== + + +class Everything { + /** + * @description: 加载函数库加快调用速度 + */ + static loadLibrary(dllPath?) { + if (!IsSet(dllPath)) { + ; 库文件同目录下 + dllPath := RegExReplace(A_LineFile, "[^\\]+$", A_PtrSize = 8 ? "Everything64.dll" : "Everything32.dll") + } + this.hModule := DllCall("LoadLibrary", "Str", dllPath, "Ptr") + this.dllPath := dllPath + } + + static CONSTANT_SETREQUESTFLAGS := { + EVERYTHING_REQUEST_FILE_NAME: 0x00000001, + EVERYTHING_REQUEST_PATH: 0x00000002, + EVERYTHING_REQUEST_FULL_PATH_AND_FILE_NAME: 0x00000004, + EVERYTHING_REQUEST_EXTENSION: 0x00000008, + EVERYTHING_REQUEST_SIZE: 0x00000010, + EVERYTHING_REQUEST_DATE_CREATED: 0x00000020, + EVERYTHING_REQUEST_DATE_MODIFIED: 0x00000040, + EVERYTHING_REQUEST_DATE_ACCESSED: 0x00000080, + EVERYTHING_REQUEST_ATTRIBUTES: 0x00000100, + EVERYTHING_REQUEST_FILE_LIST_FILE_NAME: 0x00000200, + EVERYTHING_REQUEST_RUN_COUNT: 0x00000400, + EVERYTHING_REQUEST_DATE_RUN: 0x00000800, + EVERYTHING_REQUEST_DATE_RECENTLY_CHANGED: 0x00001000, + EVERYTHING_REQUEST_HIGHLIGHTED_FILE_NAME: 0x00002000, + EVERYTHING_REQUEST_HIGHLIGHTED_PATH: 0x00004000, + EVERYTHING_REQUEST_HIGHLIGHTED_FULL_PATH_AND_FILE_NAME: 0x00008000, + } + + /** + * @description: 设置搜索需要返回哪些结果的选项 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_setrequestflags/ + * @param flags 可通过|(按位或运算叠加选项) + * EVERYTHING_REQUEST_FILE_NAME :=0x00000001 + * EVERYTHING_REQUEST_PATH :=0x00000002 + * EVERYTHING_REQUEST_FULL_PATH_AND_FILE_NAME :=0x00000004 + * EVERYTHING_REQUEST_EXTENSION :=0x00000008 + * EVERYTHING_REQUEST_SIZE :=0x00000010 + */ + static setRequestFlags(flags) { + DllCall(this.dllPath "\Everything_SetRequestFlags", "int", flags) ; 可通过|(按位或运算叠加选项) + } + + static CONSTANT_SETSORT := { + EVERYTHING_SORT_NAME_ASCENDING: 1, + EVERYTHING_SORT_NAME_DESCENDING: 2, + EVERYTHING_SORT_PATH_ASCENDING: 3, + EVERYTHING_SORT_PATH_DESCENDING: 4, + EVERYTHING_SORT_SIZE_ASCENDING: 5, + EVERYTHING_SORT_SIZE_DESCENDING: 6, + EVERYTHING_SORT_EXTENSION_ASCENDING: 7, + EVERYTHING_SORT_EXTENSION_DESCENDING: 8, + EVERYTHING_SORT_TYPE_NAME_ASCENDING: 9, + EVERYTHING_SORT_TYPE_NAME_DESCENDING: 10, + EVERYTHING_SORT_DATE_CREATED_ASCENDING: 11, + EVERYTHING_SORT_DATE_CREATED_DESCENDING: 12, + EVERYTHING_SORT_DATE_MODIFIED_ASCENDING: 13, + EVERYTHING_SORT_DATE_MODIFIED_DESCENDING: 14, + EVERYTHING_SORT_ATTRIBUTES_ASCENDING: 15, + EVERYTHING_SORT_ATTRIBUTES_DESCENDING: 16, + EVERYTHING_SORT_FILE_LIST_FILENAME_ASCENDING: 17, + EVERYTHING_SORT_FILE_LIST_FILENAME_DESCENDING: 18, + EVERYTHING_SORT_RUN_COUNT_ASCENDING: 19, + EVERYTHING_SORT_RUN_COUNT_DESCENDING: 20, + EVERYTHING_SORT_DATE_RECENTLY_CHANGED_ASCENDING: 21, + EVERYTHING_SORT_DATE_RECENTLY_CHANGED_DESCENDING: 22, + EVERYTHING_SORT_DATE_ACCESSED_ASCENDING: 23, + EVERYTHING_SORT_DATE_ACCESSED_DESCENDING: 24, + EVERYTHING_SORT_DATE_RUN_ASCENDING: 25, + EVERYTHING_SORT_DATE_RUN_DESCENDING: 26 + } + /** + * @description: 设置搜索结果排序方式 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_setsort/ + * @param mode 方式编号 默认文件路径升序排序:EVERYTHING_SORT_PATH_ASCENDING:=3 + * 文件路径升序排序:EVERYTHING_SORT_PATH_ASCENDING:=3 + * 创建时间升序排序:EVERYTHING_SORT_DATE_CREATED_ASCENDING:=11 + * 修改时间降序排序:EVERYTHING_SORT_DATE_MODIFIED_DESCENDING:=14 + */ + static setSort(mode := this.CONSTANT_SETSORT.EVERYTHING_SORT_PATH_ASCENDING) { + DllCall(this.dllPath "\Everything_SetSort", "int", mode) + } + + /** + * @description: 设置从对Everything_Query的调用返回的结果偏移量 + * 设置为0以从第一个可用结果开始返回 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_setoffset/ + */ + static setOffset(offset := 0) { + DllCall(this.dllPath "\Everything_SetOffset", "int", offset) + } + + /** + * @description: 设置从Everything_Query返回的最大结果数 + * 设置为0以从第一个可用结果开始返回将其设置为0xffffffff将返回所有结果 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_setmax/ + */ + static setMax(maxCount := 0xffffffff) { + DllCall(this.dllPath "\Everything_SetMax", "int", maxCount) + } + + /** + * @description: 设置搜索内容(未开始搜索), 释放旧搜索并分配新搜索字符串 + * https://www.voidtools.com/zh-cn/support/everything/searching/ + * @param findStr 搜索内容 + */ + static setSearch(findStr) { + DllCall(this.dllPath "\Everything_SetSearch", "Str", FindStr) + } + + /** + * @description: 搜索并等待结果,释放旧的结果列表并分配新的结果列表 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_query/ + * @return 是否搜索成功 + */ + static query() { + return DllCall(this.dllPath "\Everything_Query", "int", 1) + } + + /** + * @description: 返回所有文件和文件夹结果的总数, 0代表出错 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_gettotresults/ + */ + static getTotResults() { + return DllCall(this.dllPath "\Everything_GetTotResults") + } + + /** + * @description: 返回可见(在offset和max限制下的)文件和文件夹结果的数量, 0代表出错 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_getnumresults/ + */ + static getNumResults() { + return DllCall(this.dllPath "\Everything_GetNumResults") + } + + /** + * @description: 返回最后一个错误代码值 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_getlasterror/ + */ + static getLastError() { + return DllCall(this.dllPath "\Everything_GetLastError") + } + + /** + * @description: 检索可见结果(在offset和max限制下)的完整路径和文件名 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_getresultfullpathname/ + */ + static getResultFullPathName(index) { + size := 255 ;255个字符 + loop 4 { ;最大长度为4095个字符否则截断 + fullname := Buffer(size * 2, 0) + count := DllCall(this.dllPath "\Everything_GetResultFullPathName", "int", index, "Ptr", fullname.Ptr, "int", size) + if (count < size - 1) + return StrGet(fullname) + size *= 2 + } + return StrGet(fullname) + } + + /** + * @description: 检索可见结果(在offset和max限制下)的大小(byte) + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_getresultsize/ + */ + static getResultSize(index) { + size := 0 + DllCall(this.dllPath "\Everything_GetResultSize", "int", index, "int64*", &size) + return size + } + + /** + * @description: 检索可见结果(在offset和max限制下)的创建日期 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_getresultdatecreated/ + */ + static getResultDateCreated(index) { + date := Buffer(8, 0) + DllCall(this.dllPath "\Everything_GetResultDateCreated", "int", index, "Ptr", date.Ptr) + return this._getTime(date) + } + + /** + * @description: 检索可见结果(在offset和max限制下)的修改日期 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_getresultdatemodified/ + */ + static getResultDateModified(index) { + date := Buffer(8, 0) + DllCall(this.dllPath "\Everything_GetResultDateModified", "int", index, "Ptr", date.Ptr) + return this._getTime(date) + } + + ; 内部日期转换 + static _getTime(date) { + static add_hours := DateDiff(A_Now, A_NowUTC, "Hours") + sec := (NumGet(date, 4, "uint") << 32 | NumGet(date, 0, "uint")) // 10000000 + t := "16010101" + return DateAdd(DateAdd(t, sec, "Seconds"), add_hours, "Hours") + } + + /** + * @description: 将结果列表和搜索状态重置为默认状态,释放相关内存 + * https://www.voidtools.com/zh-cn/support/everything/sdk/everything_reset/ + */ + static reset() { + DllCall(this.dllPath "\Everything_Reset") + } + + /** + * @description: 释放函数库(引用-=1),减少内存占用(进程退出会直接卸载函数库) + */ + static freeLibrary() { + DllCall("FreeLibrary", "Ptr", this.hModule) + } +} \ No newline at end of file diff --git a/src/Plugin/Everything/Everything32.dll b/src/Plugin/Everything/Everything32.dll new file mode 100644 index 0000000000000000000000000000000000000000..ff1a0d4bd9a840bf764de5dc1e348d94d4eddc37 GIT binary patch literal 86656 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 literal 0 HcmV?d00001 diff --git "a/src/Plugin/\346\226\207\344\273\266\346\220\234\347\264\242.ahk" "b/src/Plugin/\346\226\207\344\273\266\346\220\234\347\264\242.ahk" new file mode 100644 index 0000000..b9141ab --- /dev/null +++ "b/src/Plugin/\346\226\207\344\273\266\346\220\234\347\264\242.ahk" @@ -0,0 +1,350 @@ +/** + * @Name: 文件搜索 + * @Version: 0.0.1 + * @Author: ruchuby + * @LastEditors: ruchuby + * @LastEditTime: 2023-04-06 + * @Description: 调用Everything进行文件搜索 + */ + +/* +===Starter Plugin Info==> +{ + "author": "ruchuby", + "version": "0.0.1", + "introduction": "调用Everything进行文件搜索", + "icon": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsSAAALEgHS3X78AAAE60lEQVRYhb2W628UVRjGf+fszG67oReE1lBJW26FBkovKxIDIgZvNJCoCX41IZEYEqipIcaELySKklRLxBRDSPwDNFE0BmnUFLBNrSyuy8UCUkqBVMvSQlnc3bmc8cN06W7L7rYIPF8m875n5nnmPc953xH8D2wD34IAK6SkWjjMBnAchh2b3v4QPa0Qy/UOcT/ErQFWah6aNa9vo2Ml8u+5SOoJ2zQPK5O9TSGOPhABu5cwq7iQ/Ug2eTVYOAcqSmBWAfh97ppYAm5EYeA6/DUIcRNsm+9vKd7cGWTwvgW01lKne/lO15lbNw/q54GuZX/GsiF8GYIXwTAZsg1ebQrRNW0BH9dR6/NytCCfosYAzC6cqmwXI1E4fBJGovxrG7yQKiKngN1LmFVYQKjAz9zXnoYZedMjTyJmwNfdMBIlcnOEup0XuAaQo4hQXMh+6WHu+obJ5HHDLfGlf+DmHTdW5IeKUqitHPcFQL4XGgPwZRezi4v5AngRwJONvDXASk2jtWEBVJWl5/qH4FAPDERQd+J02jZf2Q6dsQSJv2+K8rNXkIX5rkGTyPOCJuHqMAueL6X7yCAXs1ZA89Ds1VzDTST/4SRYit/icTbvCHM6Nb+nzlnkOBz8Mcwah3Txyyog1A+2TTNwRGYi3wY+ARsXzkl3e9yAn8JgK0709fDsRHKAd0NcOGXzvLLp6DgN0fh4ziNhcRkIKda11TAzo4CxDpdfUZIeD1+GuIlK2GzO1ukOBDFjCTZbaEaoLz1XXgJSOB5DZ1VGAVJSDel7CK7hHEXXO0FOZXo2iR1hLjmW1X5pKD2efKeUVGcUkOztqU4G1+2OQ08u8iSUQ080DqY9HvPp7lYA/owCnGw9QqCmKkAwttaZFAcgowAcboDb21NR5AcBgSkLEAT8vnQjGxZYCjRBPHMFbHrBHSypqCwFIcWaluVU5SJ/fxFPSN27vrI0PT58272ait6MAvpD9CD1xMD19PjySvBqjifPx8EtAfQs/LKomANSGXkT+8hABJSDGobOjAJaIWab5uELg+5US8Lvg7VLQXp4pkZy5MNaKic+u2cxZftW8K3HQ+Pqaij0j+eUgnPXAMWxXUEiWTuhUnyaMHklfBka5o/HF5W5nuo4zXOFunbus6esduXQI0AJQUDq3vVSGXmrq2Fpefo7/7zqNiZbsRdyDCMhqQGIjE7OVZVB2WPwe5/l7R9iQzTOhmSFKksM6uenfznAaAy6z4Nt80tTkEOQ5ajtC/AWHtrmP454qf7uuc0I0waczD8pCRO++RUio9ySMRq2nqIPMlRguuQAepa5ejvm/pBERjEsm01vj5HDPSqQjdxxoOsczPC5Uy2XMKXcPe8+D3GDW7bN601B2lPXpAnIRX78LJy54t77fe5UKx/7KfWNHUjDcs/5QMR1ezTu7rknzhtbU758koCpkls2LSg6hGS7kGKdFI4H3PUCt8OBe85RHLMVe5OGuxcEQNtKtiiHz+flILctPtp2gveSubYaZho6q6SkWgh3eHlg2FT0DkPnriCRTMR3BbQspyrfL89UlihtOuQPClL30ihQ2tplj54cQErhTkSRYsdHRQ4g4wnalYM6ftZ1sGnD0TOPhhzGTLhvBc0IWnSPe68csCw+2H6CnQ+T/K4AgE/qeVLTeBkQlsHPzX/Q+bDJAf4DkxsIASilfOoAAAAASUVORK5CYII=" +} +<==Starter Plugin Info=== +*/ + + +#Include ..\Utils\PluginHelper.ah2 +#Include .\Everything\Everything.ahk + + +PluginHelper.addEntryFunc((*) => Plugin_文件搜索.main()) ; 添加入口函数等待执行 + +class Plugin_文件搜索 { + static sortM := Menu(), cotM := Menu(), menu := Menu() + static pageSize := 15 + + static _sortModeList := [ + Everything.CONSTANT_SETSORT.EVERYTHING_SORT_PATH_ASCENDING, + Everything.CONSTANT_SETSORT.EVERYTHING_SORT_PATH_DESCENDING, + Everything.CONSTANT_SETSORT.EVERYTHING_SORT_NAME_ASCENDING, + Everything.CONSTANT_SETSORT.EVERYTHING_SORT_NAME_DESCENDING, + Everything.CONSTANT_SETSORT.EVERYTHING_SORT_SIZE_ASCENDING, + Everything.CONSTANT_SETSORT.EVERYTHING_SORT_SIZE_DESCENDING, + Everything.CONSTANT_SETSORT.EVERYTHING_SORT_DATE_MODIFIED_ASCENDING, + Everything.CONSTANT_SETSORT.EVERYTHING_SORT_DATE_MODIFIED_DESCENDING + ] + static _sortMode := Everything.CONSTANT_SETSORT.EVERYTHING_SORT_PATH_ASCENDING + static sortMode { + get => this._sortMode + set { + i := this._arrayFind(this._sortModeList, this._sortMode) + this.sortM.Uncheck(i "&") + this._sortMode := this._sortModeList[value] + this.sortM.Check(value "&") + Everything.setSort(this._sortMode) + } + } + + static _cotModeList := ["path", "name", "size", "date"] + static _cotMode := "path" + static cotMode { + get => this._cotMode + set { + i := this._arrayFind(this._cotModeList, this._cotMode) + this.cotM.Uncheck(i "&") + this._cotMode := this._cotModeList[value] + this.cotM.Check(value "&") + } + } + + static main() { + SplitPath(A_LineFile, &name) ; 获取插件id即文件名 + this.name := name + + Everything.loadLibrary() + Everything.setMax(this.pageSize) ;每次搜索数量 + Everything.setRequestFlags( + Everything.CONSTANT_SETREQUESTFLAGS.EVERYTHING_REQUEST_FULL_PATH_AND_FILE_NAME | + Everything.CONSTANT_SETREQUESTFLAGS.EVERYTHING_REQUEST_SIZE | + Everything.CONSTANT_SETREQUESTFLAGS.EVERYTHING_REQUEST_DATE_MODIFIED + ) + ;名称和路径|大小|修改日期 + + this.menuInit() + this.addToSearchGui() + } + + + static menuInit() { + that := PluginHelper.getPluginMode() ; 提前获取that, 即 pluginMode + getFocusItem() { + return that.pluginSearchResult[that.focusedRow] + } + + m := this.menu + m.Add("文件夹中显示`t(&1)", (*) => (PluginHelper.Utils.openFileInFolder(getFocusItem().path), PluginHelper.hideSearchGui(true))) + m.Add("打开文件`t(&2)", (*) => (PluginHelper.Utils.startFile(getFocusItem().path), PluginHelper.hideSearchGui(true))) + m.Add("复制路径`t(&3)", (*) => (A_Clipboard := getFocusItem().path, PluginHelper.hideSearchGui(true))) + m.Add("复制文件`t(&4)", (*) => (PluginHelper.Utils.copyToClipboard(getFocusItem().path), PluginHelper.hideSearchGui(true))) + m.Add("删除文件`t(&5)", (*) => (FileRecycle(getFocusItem().path), PluginHelper.hideSearchGui(true))) + + m.SetIcon("1&", PluginHelper.imgDir "\folder.ico") + m.SetIcon("2&", PluginHelper.imgDir "\run.ico") + m.SetIcon("3&", PluginHelper.imgDir "\link.ico") + m.SetIcon("4&", PluginHelper.imgDir "\copy.ico") + m.SetIcon("5&", PluginHelper.imgDir "\delete.ico") + + sm := Menu() + m.Add("设置`t(&6)", sm) + m.SetIcon("6&", PluginHelper.imgDir "\setting.ico") + + ; 排序方式 + sortM := this.sortM + for name in ["路径", "名称", "大小", "修改时间"] { + sortM.Add(Format("按{}升序`t(&{})", name, A_Index * 2 - 1), + (_, pos, *) => (this.sortMode := pos, PluginHelper.SearchText := PluginHelper.SearchText)) + sortM.Add(Format("按{}降序`t(&{})", name, A_Index * 2), + (_, pos, *) => (this.sortMode := pos, PluginHelper.SearchText := PluginHelper.SearchText)) + } + sm.Add("排序方式`t(&1)", sortM) + + ; 显示内容 + cotM := this.cotM + for name in ["路径", "名称", "大小", "修改时间"] + cotM.Add(name, (_, pos, *) => (this.cotMode := pos, this.refrushLV(that))) + sm.Add("显示内容`t(&2)", cotM) + + this.cotMode := 1 ; 选择显示路径 + this.sortMode := 1 ; 选择按路径升序 + } + + static _arrayFind(arr, val) { + for i, v in arr { + if (v == val) + return i + } + return 0 + } + + static byteFormat(size, decimalPlaces := 2) { + static sizeName := ["KB", "MB", "GB", "TB"] + if (size <= 0) + return "*" + sizeIndex := 0 + while (size >= 1024) { + sizeIndex++ + size /= 1024.0 + if (sizeIndex = 4) + break + } + return (sizeIndex = 0) ? size " byte" . (size != 1 ? "s" : "") + : round(size, decimalPlaces) . " " . sizeName[sizeIndex] + } + + ; 添加搜索结果到列表 + static addItemsToLV(that, items) { + for item in items { + ; 判断图标是否已载入 + ext := item.ext + if (!ext && instr(FileExist(item.path), "D")) { + icoIndex := that.imgPathToImgListIndex[".folder"] + } else if (ext = 'lnk' || ext = 'exe') { + ; exe lnk文件图标要根据路径载入 + if (!that.imgPathToImgListIndex.Has(item.path)) { + hIcon := PluginHelper.Utils.associatedHIcon(item.path) + index := IL_Add(that.imgListID, "HICON:*" hIcon) + that.imgPathToImgListIndex[item.path] := index ? + index : that.imgPathToImgListIndex[".noImg"] ;加载失败使用默认 + } + icoIndex := that.imgPathToImgListIndex[item.path] + } else { + ; 其他类型按类型载入即可 + if (!that.imgPathToImgListIndex.Has(ext)) { + hIcon := PluginHelper.Utils.associatedHIcon(item.path) + index := IL_Add(that.imgListID, "HICON:*" hIcon) + that.imgPathToImgListIndex[ext] := index ? + index : that.imgPathToImgListIndex[".noImg"] ;加载失败使用默认 + } + icoIndex := that.imgPathToImgListIndex[ext] + } + ; 添加 + key := this.cotMode + if (key == "path") + that.listView.Add("Icon" icoIndex, this.pathStrCompact(item.path, 45)) ;显示压缩的路径 + else + that.listView.Add("Icon" icoIndex, item.%key%) ;显示指定内容模式 + } + } + + ; 刷新列表 + static refrushLV(that) { + ;重置列表 + that.listView.Opt("-Redraw") ;禁用重绘 + that.listView.Delete() + this.addItemsToLV(that, that.pluginSearchResult) + that.resizeGui() ;根据搜索结果数量调整gui尺寸 并启用重绘 + } + + static addToSearchGui() { + ; 加载默认图标 + loadImg(that) { + that.imgPathToImgListIndex[".noImg"] := IL_Add(that.imgListID, PluginHelper.imgDir "\noImg.png") + that.imgPathToImgListIndex[".folder"] := IL_Add(that.imgListID, PluginHelper.imgDir "\folder.png") + } + + ; 异步加载列表 + asyncLoading(that) { + if (that.pluginOtherData.totalNum > that.pluginOtherData.offset + this.pageSize) { ;未加载完成 + ; 设置偏移量 + that.pluginOtherData.offset += this.pageSize + Everything.setOffset(that.pluginOtherData.offset) + ; 搜索 + if (Everything.query()) { + visNum := Everything.getNumResults() + that.pluginSearchResult.Capacity += visNum ;扩充容量 + tempList := [], tempList.Capacity := visNum ; 临时储存本次加载内容 + loop visNum { + index := A_Index - 1 + path := Everything.getResultFullPathName(index) + SplitPath(path, &name, , &ext) + item := { + name: name, + path: path, + ext: ext, + size: this.byteFormat(Everything.getResultSize(index)), + date: Everything.getResultDateModified(index) + } + that.pluginSearchResult.Push(item), tempList.Push(item) + } + that.listView.Opt("-Redraw") ;禁用重绘 + this.addItemsToLV(that, tempList) + that.listView.Opt("Redraw") ;启用重绘 + + if (IsSet(DEBUG) && DEBUG) + PluginHelper.Utils.tip( + this.name, + Format("Everything搜索结果异步载入`n[{}/{}]", that.pluginSearchResult.Length, that.pluginOtherData.totalNum) + ) + } else + PluginHelper.Utils.tip(this.name, "Everything搜索失败, 错误码:" Everything.getLastError()) + } + } + + ; 进入插件模式初始化 + init(that) { + that.pluginOtherData := { + totalNum: 0, + offset: 0 + } + that.menu := this.menu + } + + ;定义插件模式下搜索功能 + searchHandler(that, searchText) { + that.pluginSearchResult := [] + if (searchText) { + ; that.pluginSearchResult := [{ name: "文件名", path: "路径", size:"大小", "date":"修改时间" },...] + Everything.setSearch(searchText) + that.pluginOtherData.offset := 0 + Everything.setOffset(0) + if (Everything.query()) { + that.pluginOtherData.totalNum := Everything.getTotResults() + PluginHelper.Utils.tip(this.name, Format("Everything搜索成功`n共 {} 条结果", that.pluginOtherData.totalNum), 2000) + visNum := Everything.getNumResults() + that.pluginSearchResult.Capacity := visNum + loop visNum { + index := A_Index - 1 + path := Everything.getResultFullPathName(index) + SplitPath(path, &name, , &ext) + that.pluginSearchResult.Push({ + name: name, + path: path, + ext: ext, + size: this.byteFormat(Everything.getResultSize(index)), + date: Everything.getResultDateModified(index) + }) + } + } else + PluginHelper.Utils.tip(this.name, "Everything搜索失败, 错误码:" Everything.getLastError()) + } + this.refrushLV(that) + } + + ;定义插件模式下回车、双击处理函数 + runHandler(that, rowNum) { + if (rowNum) { + PluginHelper.Utils.startFile(that.pluginSearchResult[rowNum].path) + PluginHelper.hideSearchGui() + } + } + + doubleRightHandler(that, rowNum) { + if (rowNum > 0) { + ControlGetPos(&x1, &y1, &w, , that.listView) + RECT := Buffer(16, 0) + NumPut("UInt", 0, RECT, 0) + SendMessage(0x1038, rowNum - 1, RECT.Ptr, , that.listView) + that.menu.show(x1 + w - 150, y1 + (NumGet(RECT, 4, "UInt") + NumGet(RECT, 12, "UInt")) // 2) + } + } + + ; 添加插件项到启动模式搜索界面 + PluginHelper.addPluginToStartupMode( + this.name, + "文件搜索", + ["WJSS", "Everything"], + (obj, searchText) => ( + PluginHelper.showPluginMode( ; 启动插件模式 + [], ;数据靠search获取,不需要传入 + searchHandler, + runHandler, + doubleRightHandler, + loadImg, ; 需要带有图标 + asyncLoading, ; 异步加载 + init, ; 初始化 + , + "Search on Everything", + PluginHelper.getPluginHIcon(this.name) + ) + ), , , PluginHelper.getPluginHIcon(this.name) + ) + + ; 添加插件项到智能模式搜索界面 + PluginHelper.addPluginToIntelligentMode( + this.name, + "使用Everything进行搜索", + [["(ev|wjss|everything)\s+(?.*)", "${query}"], [".+", "$0"]], + (obj, content) => ( + PluginHelper.showPluginMode( ; 启动插件模式 + [], ;数据靠search获取,不需要传入 + searchHandler, + runHandler, + doubleRightHandler, + loadImg, ; 需要带有图标 + asyncLoading, ; 异步加载 + init, ; 初始化 + content, + "Search on Everything", + PluginHelper.getPluginHIcon(this.name) + ) + ), , PluginHelper.getPluginHIcon(this.name) + ) + } + + ; 压缩文件路径 + static pathStrCompact(fullPath, maxChars) { + out := Buffer(255) + DllCall("shlwapi.dll\PathCompactPathExW" + , "UPtr", out.Ptr + , "WStr", fullPath + , "UInt", maxChars + ) + return StrGet(out) + } +} \ No newline at end of file diff --git a/src/Utils/CopyToClipboard.ah2 b/src/Utils/CopyToClipboard.ah2 new file mode 100644 index 0000000..405a153 --- /dev/null +++ b/src/Utils/CopyToClipboard.ah2 @@ -0,0 +1,35 @@ +; CopyToClipboard(".\test.png", 1) + +CopyToClipboard(filePath, cut := false) { + FileCount := 0 + PathLength := 0 + ;Count files and total string length + + pid := DllCall("GetCurrentProcessId", "Uint") + hwnd := WinExist("ahk_pid " . pid) + DllCall("OpenClipboard", "Ptr", hwnd) + hPath := DllCall("GlobalAlloc", "uint", 0x42, "uint", 20 + (StrLen(filePath) + 2) * 2, "Ptr") ; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40) + pPath := DllCall("GlobalLock", "Ptr", hPath) ; Lock the moveable memory, retrieving a pointer to it. + NumPut("uint", 20, pPath + 0), pPath += 16 ; DROPFILES.pFiles = offset of file list + NumPut("uint", 1, pPath + 0), pPath += 4 ;fWide = 0 -->ANSI, fWide = 1 -->Unicode + StrPut(filePath, pPath, StrLen(filePath) + 1, "UTF-16") + + DllCall("GlobalUnlock", "Ptr", hPath) + ;hPath must not be freed! ->http://msdn.microsoft.com/en-us/library/ms649051(VS.85).aspx + + DllCall("EmptyClipboard") ; Empty the clipboard, otherwise SetClipboardData may fail. + result := DllCall("SetClipboardData", "uint", 0xF, "Ptr", hPath) ; Place the data on the clipboard. CF_HDROP=0xF + + ;Write Preferred DropEffect structure to clipboard to switch between copy/cut operations + mem := DllCall("GlobalAlloc", "UInt", 0x42, "UInt", 4, "Ptr") ; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40) + str := DllCall("GlobalLock", "Ptr", mem) + if (!cut) + DllCall("RtlFillMemory", "UInt", str, "UInt", 1, "UChar", 0x05) + else + DllCall("RtlFillMemory", "UInt", str, "UInt", 1, "UChar", 0x02) + DllCall("GlobalUnlock", "Ptr", mem) + cfFormat := DllCall("RegisterClipboardFormat", "Str", "Preferred DropEffect") + result := DllCall("SetClipboardData", "UInt", cfFormat, "Ptr", mem) + DllCall("CloseClipboard") + ;mem must not be freed! ->http://msdn.microsoft.com/en-us/library/ms649051(VS.85).aspx +} \ No newline at end of file From 6ebf0b016e82680f7fa947bbed2238b168f76e5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E5=88=9D?= <1003019131@qq.com> Date: Thu, 6 Apr 2023 16:16:50 +0800 Subject: [PATCH 6/9] Fix bugs --- ...\275\221\351\241\265\346\220\234\347\264\242.ahk" | 12 ++++++------ src/utils/Start.ah2 | 12 +++++++++--- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git "a/src/Plugin/\347\275\221\351\241\265\346\220\234\347\264\242.ahk" "b/src/Plugin/\347\275\221\351\241\265\346\220\234\347\264\242.ahk" index 33a10f9..6ee3c38 100644 --- "a/src/Plugin/\347\275\221\351\241\265\346\220\234\347\264\242.ahk" +++ "b/src/Plugin/\347\275\221\351\241\265\346\220\234\347\264\242.ahk" @@ -161,7 +161,7 @@ class Plugin_网页搜索 { this.title, ["GGSS", "google"], (that, searchText) => ( - PluginMode.showPluginMode( ; 启动插件模式 + PluginHelper.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, runHandler, , , , , , @@ -177,7 +177,7 @@ class Plugin_网页搜索 { this.title, [["(gg|google|谷歌)\s+(?.*)", "${query}"], [".+", "$0"]], (that, content) => ( - PluginMode.showPluginMode( ; 启动插件模式 + PluginHelper.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, runHandler, , , , , @@ -244,7 +244,7 @@ class Plugin_网页搜索 { this.title, ["BYSS", "bing"], (that, searchText) => ( - PluginMode.showPluginMode( ; 启动插件模式 + PluginHelper.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, runHandler, , , , , , @@ -260,7 +260,7 @@ class Plugin_网页搜索 { this.title, [["(by|bing|必应)\s+(?.*)", "${query}"], [".+", "$0"]], (that, content) => ( - PluginMode.showPluginMode( ; 启动插件模式 + PluginHelper.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, runHandler, , , , , @@ -322,7 +322,7 @@ class Plugin_网页搜索 { this.title, ["BDSS", "baidu"], (that, searchText) => ( - PluginMode.showPluginMode( ; 启动插件模式 + PluginHelper.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, runHandler, , , , , , @@ -338,7 +338,7 @@ class Plugin_网页搜索 { this.title, [["(bd|baidu|百度)\s+(?.*)", "${query}"], [".+", "$0"]], (that, content) => ( - PluginMode.showPluginMode( ; 启动插件模式 + PluginHelper.showPluginMode( ; 启动插件模式 [], ;数据靠search获取,不需要传入 searchHandler, runHandler, , , , , diff --git a/src/utils/Start.ah2 b/src/utils/Start.ah2 index e0e3a4a..7377f20 100644 --- a/src/utils/Start.ah2 +++ b/src/utils/Start.ah2 @@ -1,5 +1,8 @@ class Start { - static startFile(path, workingDir := "", options := "", beforeRun := "") { + /** + * @description: 运行文件 + */ + static startFile(path, workingDir := "", options := "", beforeRun?) { if !(FileExist(path)) { ;文件不存在 res := MsgBox("文件不存在:" path "`n是否尝试打开原文件夹?", "文件不存在", 0x40041) if (res = "OK") { @@ -10,7 +13,7 @@ class Start { if !(workingDir) ;默认使用文件所在文件夹作为工作目录 SplitPath(path, , &workingDir) - if (Type(beforeRun) == 'BoundFunc' or Type(beforeRun) == 'Func') + if (IsSet(beforeRun)) beforeRun() try { Run(path, workingDir, options, &outPID) @@ -18,7 +21,10 @@ class Start { } } } - + + /** + * @description: 在文件夹中打开 + */ static openFileInFolder(path) { if (FileExist(path)) { try Run('explorer.exe /select,"' path '"') From 166e4c1cdba47f5d59405189b2b8acb2d7ab2a4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E5=88=9D?= <1003019131@qq.com> Date: Thu, 6 Apr 2023 16:17:41 +0800 Subject: [PATCH 7/9] Update demo.ahk --- src/Plugin/demo.ahk | 47 +++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/Plugin/demo.ahk b/src/Plugin/demo.ahk index fe38742..92c58cd 100644 --- a/src/Plugin/demo.ahk +++ b/src/Plugin/demo.ahk @@ -1,9 +1,9 @@ /** * @Name: demo.ahk - * @Version: 0.0.4 + * @Version: 0.0.5 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-05 + * @LastEditTime: 2023-04-06 * @Description: 插件示例 */ @@ -19,7 +19,7 @@ icon: 插件列表中的图标,请填入无头部的base64图片 ===Starter Plugin Info==> { "author": "ruchuby", - "version": "0.0.4", + "version": "0.0.5", "introduction": "An example of Starter Plugin", "icon": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAgNJREFUWEft1UuozVEUx/HPHRmaMFBMTDwmYiJSQimUMqAoAwNRQoSSR3kVxfWIIjISojwGiiLKgBkTYSADZGAkE2VAS3vXdvr/z/2fc27nls6a/fde+7e+e62113/IGNvQGMc3APivMnALE1NPLWraW6OVgZl4k4Jew/p+A+zBiRR0LW72G+A5FuArpuFHPwHm4mUKeAUbmwYPvyY9sAlTsL9G+Eixtwr3kt9RfMKldkAjAZzFNhxrA/Aas/Axpf9XAbAP57C9DqIOIOp4AUvSwbjlwQqRqHvUP+w8thY+h3EgfT/BFrxv1agCiDRG8EnJ+TM240EFQM5QbC3Dw8JnBS5iclqLBg2Iu6VOK0DUOW6b7XZqqu81KfyAqXiLmAWtNh6XsbrYiKxEf/y1EuA64g1n24nTNYFjeSGepf2T2N3GdweGi/0bWNcrwFVsSKIxejNMFUcjgDjYSQm+YQJeYU7N7TsqQdZo0oTxOh6nA1HP3O0lR1dNmAVan+Fx7C3U48+XG2teMQlLgEPF0+3oGZYi+ZmdQdQx20+MwwvMr0l/ngNdDaJSM0bx9AJgKR4lh+iZmJJVFgBfeh3FVcJ3EH0SNhsxiru2kf4FVcK/0+JTLO46cjrYKcDyYiTvwql+A9zHyhR0Bt71GyDSHhZDaE2vweN8pyUYjZj/aAwABhn4A2ymYyH5RzvQAAAAAElFTkSuQmCC" } @@ -69,12 +69,14 @@ class Plugin_Demo { ; 插件相关菜单最好加入pluginMenu菜单项,更加规范 PluginHelper.pluginMenu.Add("demo.ahk", this.menu) - ; 添加插件项到启动模式搜索界面 - ; 定义一个新的菜单,用于右键插件项时显示(菜单是可选的属性) - m := Menu() - m.Add("demo menu item", (*) => PluginHelper.Utils.tip(this.name, "demo menu item", 1000)) - ;#region 定义插件模式 + ; 定义菜单,用于插件模式右键显示 + pModeMenu := Menu() + that := PluginHelper.getPluginMode() ; 为了定义下两行的匿名函数,需要提前访问到that即pluginMode(担心混淆可以改成别的名字), + pModeMenu.Add("显示当前行号", (*) => PluginHelper.Utils.tip("demo.ahk", that.focusedRow, 1500)) + pModeMenu.Add("显示当前标题", (*) => PluginHelper.Utils.tip("demo.ahk", that.pluginSearchResult[that.focusedRow].title, 1500)) + + ; 搜索处理函数,用于插件模式搜索 search(that, searchText) { that.pluginSearchResult := [] if (searchText) { @@ -99,7 +101,7 @@ class Plugin_Demo { that.resizeGui() ;根据搜索结果数量调整gui尺寸 并启用重绘 } - ; 加载图标的函数,用于搜索结果中 that.listView.Add("Icon" n,...) + ; 加载图标的函数,用于插件模式搜索结果中 that.listView.Add("Icon" n,...) loadImgs(that) { defaultHIcon := LoadPicture(A_AhkPath, "Icon1", &_) that.imgPathToImgListIndex["default"] := IL_Add(that.imgListID, "HICON:" defaultHIcon) @@ -113,24 +115,23 @@ class Plugin_Demo { } } - ; 右键菜单栏初始化处理函数 - menuInit(that) { - m := Menu() - m.Add("显示当前行号", (*) => PluginHelper.Utils.tip("demo.ahk", that.focusedRow, 1500)) - m.Add("显示当前标题", (*) => PluginHelper.Utils.tip("demo.ahk", that.pluginSearchResult[that.focusedRow].title, 1500)) - that.menu := m + ; 进入插件模式的初始化处理函数(此处应当尽量少执行内容,因为每次打开插件模式前都需要执行) + initHandler(that) { + that.menu := pModeMenu } + ; 创建一些固定的示例数据 hIcon := PluginHelper.getPluginHIcon("demo.ahk") data := [] loop 15 { data.Push({ title: Format("{:03}", A_Index), iconPath: hIcon }) } - ;#endregion - ; 定义插件项被双击或者回车时执行的处理函数, 函数有两个参数 that: 指向插件项, searchText: 搜索框搜索的内容 - fn(that, searchText) { - PluginMode.showPluginMode( ; 启动插件模式 + ; 定义插件项被双击或者回车时执行的处理函数: 启动插件模式 + ; 注意函数接受两个参数 obj: 指向的是插件项对象{name, title, keywords, startHandler, doubleLeftHandler?, menu?, hIcon} + ; searchText: 搜索框搜索的内容 + fn(obj, searchText) { + PluginHelper.showPluginMode( data, search, (that, rowNum) => rowNum > 0 ? @@ -139,7 +140,7 @@ class Plugin_Demo { PluginHelper.Utils.tip(this.name, "double Left" that.pluginSearchResult[rowNum].title, 1500) : 0, loadImgs, (that) => PluginHelper.Utils.tip(this.name, "列表触底通知:可以通过这种方式异步加载数量过大的列表", 1000, true), - menuInit, , + initHandler, , "输入搜索内容吧!" ) } @@ -156,8 +157,8 @@ class Plugin_Demo { this.name, "插件示例-项目2", ["plugin demo", "CJSL"], - (that, searchText) => (PluginHelper.Utils.tip(that.title, "搜索框内容:" searchText, 1000), PluginHelper.hideSearchGui()), - (that, searchText) => PluginHelper.Utils.tip(that.title, "搜索框内容:" searchText, 1000), , ; 使用匿名函数作为双击left的处理函数 + (obj, searchText) => (PluginHelper.Utils.tip(obj.title, "搜索框内容:" searchText, 1000), PluginHelper.hideSearchGui()), + (obj, searchText) => PluginHelper.Utils.tip(obj.title, "搜索框内容:" searchText, 1000), , ; 使用匿名函数作为双击left的处理函数 ; 定义该插件项显示的图标HICON,此处用base64ToHICON方法将base64图片载入得到HICON PluginHelper.Utils.base64ToHICON("iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAnBJREFUWEfVlj9oFEEUxt+bLa6wF0whQcRCENOo2EUQYy/xZmb3sDKCoK0RhURQSFoFwdhcuNuZPY+AXKU22gmKiI2FAREbwUrwrI6dJxN2wv3Z21vZDWe2291vv/fbNx9vBmHKF065Pvy/AEKI60R0EhGPFekSEX1BxE9a68dpPqkdEEI0AcAvUjjl21BrHQw/HwGoVqsXGGMvE+E3ItosAoKIVwBg1noYYxZardarfr8RACHEDQB4aEWe5800m80fRQCCIDgax/F24nFTa/0oE4BzvoqIK1aktS4lpEIIsn5EdC+KotX9CyClXDLGzGQtCWNs2/O8541G44/TldIBKeUcEX3MkwfG2OkwDN+XCsA5n0XECADOTID4UKlUztfr9V+lAuT583GaUpZg6gC1Wu1Ar9dbdENlHJANYbfb7XQ6nd+lLoHv+6eMMe/ydIKIzkVR9KZUgCAIDsVxfBsATmRB2M0niqJr/Zr9mwHbymRP+BmG4ec87Xca3/ePx3F80N4j4uuJo1hKeYSI1gDABm3kQsR1pdRyHggp5RoR3RqjbSPislLq6w6cE3HOnyDi0oQCT7XWmRohxAYAXJ2Qkw2Xk12A/qAAwG6Ckxbav7mYmA68Syk0nzx7QUTrQ+/nh3faVIDhLdOaCCHuA8CdPEsAAA+01neHtWlbfW4AayalXDDGnM2CYIy9VUq5E9WAtDBAzr8fK+OcryDizoHEHXb+qQMlAIyctnKFsGjhvu8zQ/hs3AwoEcBZtbXWlwfmgJRykYiqAHBpDwr2W24hYksp1R4AcAo7EY0xh/cCgjH23U1A51/KsbsI7NQB/gIoe4UwRdVGRAAAAABJRU5ErkJggg==") ) @@ -167,7 +168,7 @@ class Plugin_Demo { this.name, "插件示例-智能模式项目", [[".+", "$0"], ["(demo|sl|示例)\s+(?.*)", "${query}"]], ;一种是任意字符匹配,一种是前缀匹配,都用正则实现 - (that, content) => PluginHelper.Utils.tip(that.title, "传递内容:" content, 1000) + (obj, content) => PluginHelper.Utils.tip(obj.title, "传递内容:" content, 1000) ) ; PluginHelper.Utils.tip("插件已加载", "demo.ahk") From 30a9b6d2dab8bda8548ce0bebfa468f55ec2ba8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E5=88=9D?= <1003019131@qq.com> Date: Thu, 6 Apr 2023 16:18:36 +0800 Subject: [PATCH 8/9] Improving user experience --- src/Gui/SearchGui/PluginMode.ah2 | 22 +++++++----- src/Gui/SearchGui/SearchGui.ah2 | 4 ++- src/Starter.ah2 | 7 ++-- src/Utils/PluginHelper.ah2 | 57 ++++++++++++++++++++++++-------- 4 files changed, 63 insertions(+), 27 deletions(-) diff --git a/src/Gui/SearchGui/PluginMode.ah2 b/src/Gui/SearchGui/PluginMode.ah2 index ea23fb9..a1e2f73 100644 --- a/src/Gui/SearchGui/PluginMode.ah2 +++ b/src/Gui/SearchGui/PluginMode.ah2 @@ -3,7 +3,7 @@ * @Version: 0.0.1 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-05 + * @LastEditTime: 2023-04-06 * @Description: 插件模式 */ @@ -25,6 +25,7 @@ class PluginMode { static pluginSearchData := [] static pluginSearchResult := [] + static pluginOtherData := 0 ; 可自定义此数据 static _default_thumb := 0 static _thumb := 0 @@ -113,9 +114,8 @@ class PluginMode { } } - ; 重新加载搜索列表图标资源 - static reloadIL(ILFlag) { - SearchGui.placeholder := "正在加载插件模式搜索列表..." + ; 重置列表和图标资源 + static reloadLVIL(ILFlag) { this.listView.Opt("-Redraw") this.listView.Delete() ;清空搜索列表 @@ -139,7 +139,7 @@ class PluginMode { } - static showPluginMode(pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, loadImgsHandler?, toBottomHandler?, menuInitHandler?, searchText := "", placeholder := "", thumb?) { + static showPluginMode(pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, loadImgsHandler?, toBottomHandler?, initHandler?, searchText := "", placeholder := "", thumb?) { this.oldMode := SearchGui.mode this.pluginSearchData := pluginSearchData @@ -149,18 +149,22 @@ class PluginMode { this.loadImgsHandler := IsSet(loadImgsHandler) ? loadImgsHandler : (*) => 0 this.toBottomHandler := IsSet(toBottomHandler) ? toBottomHandler : (*) => 0 + this.pluginOtherData := 0 this.rowHeight := 0 this.menu := 0 - if (IsSet(menuInitHandler)) - menuInitHandler(this) - - this.reloadIL(IsSet(loadImgsHandler)) + if (IsSet(initHandler)) + initHandler(this) this.thumb := IsSet(thumb) ? thumb : 0 SearchGui.mode := -1 SearchGui.placeholder := placeholder + ; 隐藏多余部分 + WinMove(, , 550 * (A_ScreenDPI / 96), Ceil(55 * (A_ScreenDPI / 96)), SearchGui.gui) + this.reloadLVIL(IsSet(loadImgsHandler)) SearchGui.edit.Value := SearchGui.searchText := searchText ;同时触发搜索 + EditCtrlFunc.editSelect(SearchGui.edit, StrLen(searchText), -1) ; 指示器移动到最后 + if (!WinActive(SearchGui.gui)) { ; 窗口未激活 SearchGui.gui.Show() diff --git a/src/Gui/SearchGui/SearchGui.ah2 b/src/Gui/SearchGui/SearchGui.ah2 index 9da64cd..a5ba191 100644 --- a/src/Gui/SearchGui/SearchGui.ah2 +++ b/src/Gui/SearchGui/SearchGui.ah2 @@ -195,7 +195,7 @@ class SearchGui { } ; 根据模式隐藏主界面 - static hideGui() { + static hideGui(recordHideTime := false) { if (this.mode == 0) { StartupMode.hideGui() } else if (this.mode == 1) { @@ -203,5 +203,7 @@ class SearchGui { } else { PluginMode.hideGui() } + if (recordHideTime) ;记录关闭时间,15s内可恢复 + SearchGui.hideTime := A_Now } } \ No newline at end of file diff --git a/src/Starter.ah2 b/src/Starter.ah2 index a949871..4f54d59 100644 --- a/src/Starter.ah2 +++ b/src/Starter.ah2 @@ -3,7 +3,7 @@ * @Version: 0.3.0 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-05 + * @LastEditTime: 2023-04-06 * @Description: 介绍Starter 是一款AHK编写的快速启动工具,旨在方便快捷地启动文件、文件夹,提高电脑的使用效率。 */ #NoTrayIcon ; 先隐藏图标 @@ -15,7 +15,7 @@ FileEncoding("UTF-8-RAW") ; 调试模式下,退出时不保存用户数据,不会动态载入插件 ; 手动#inclide 需要调试的插件 ; DEBUG := true -; #Include .\Plugin\网页搜索.ahk +; #Include .\Plugin\文件搜索.ahk ; #Include .\Plugin\demo.ahk #Include .\Utils\GlobalData.ah2 @@ -39,12 +39,13 @@ PluginGui.init() ;同时重启以加载插件 #Include .\Utils\WiseGuiHelper.ah2 #Include .\Utils\UrlEncode.ah2 #Include .\Utils\EditCtrlFunc.ah2 +#Include .\Utils\CopyToClipboard.ah2 #Include .\Utils\7Zip\SevenZip.ahk Tip := WiseGuiHelper("tooltip") Tip.setOpt(, , "s14 Bold, 雅痞-简", "s12, 雅痞-简", 225 , "0x805D6B, 0xFFFFFF, 0xF5F5DC, *" LoadPicture(GlobalData.imgDir "\Starter.ico", , &_) ;加*使用副本 - , , , "4,1,1,3", "1", , "SlideWest@150", "SlideEast@150") + , , , "4,1,1,3", "1", , "SlideWest@150") #Include .\Gui\BootGui.ah2 BootGui.init() diff --git a/src/Utils/PluginHelper.ah2 b/src/Utils/PluginHelper.ah2 index 53bf6cf..3c672b6 100644 --- a/src/Utils/PluginHelper.ah2 +++ b/src/Utils/PluginHelper.ah2 @@ -3,7 +3,7 @@ * @Version: 0.0.3 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-05 + * @LastEditTime: 2023-04-06 * @Description: 插件API封装 */ @@ -36,7 +36,7 @@ class PluginHelper { * @param title 插件项显示标题 * @param reg 插件项正则替换列表[[exp1,replace1],...] * @param runHandler 鼠标双击、回车该插件项时执行的函数 - * (that, content)=>any that指向添加的插件项对象, content为正则替换后的内容 + * (obj, content)=>any obj指向添加的插件项对象, content为正则替换后的内容 * @param menu 选填, 右键该插件项显示的菜单 * @param hIcon 选填, 插件项显示的图标HICON, 默认使用插件的图标 */ @@ -55,8 +55,8 @@ class PluginHelper { * @param name 插件id, 即文件名 * @param title 插件项显示标题 * @param keywords 插件项关键字 - * @param startHandler 鼠标双击、回车该插件项时执行的函数 (that, searchText)=>any that指向添加的插件项对象 - * @param doubleLeftHandler 选填, 双击Left该插件项时执行的函数 (that, searchText)=>any that指向添加的插件项对象 + * @param startHandler 鼠标双击、回车该插件项时执行的函数 (obj, searchText)=>any obj指向添加的插件项对象 + * @param doubleLeftHandler 选填, 双击Left该插件项时执行的函数 (obj, searchText)=>any obj指向添加的插件项对象 * @param menu 选填, 右键该插件项显示的菜单 * @param hIcon 选填, 插件项显示的图标HICON, 默认使用插件的图标 */ @@ -97,15 +97,29 @@ class PluginHelper { /** * @description: 隐藏搜索框 + * @param recordHideTime 默认false true则记录关闭时间,15s内可恢复窗口 */ - static hideSearchGui() { - SearchGui.hideGui() + static hideSearchGui(recordHideTime := false) { + SearchGui.hideGui(recordHideTime) } /** * @description: 搜索框内容 */ - static SearchText => SearchGui.searchText + static SearchText { + get => SearchGui.searchText + set => SearchGui.searchText := value + } + + /** + * @description: 图片资源目录 + */ + static imgDir => GlobalData.imgDir + + /** + * @description: 特定情况下需要提前获取到PluginMode,即所谓的that + */ + static getPluginMode := (*) => PluginMode /** * @description: 启动插件模式 @@ -113,22 +127,37 @@ class PluginHelper { * @param searchHandler 插件模式搜索处理函数 (that, searchText) => void * @param runHandler 插件模式回车、双击任意项时的处理函数 (that, rowNum) => void * @param doubleLeftHandler (可选)插件模式双击Left时的处理函数 (that, rowNum) => void - * @param loadImgsHandler (可选)加载插件模式图片的处理函数 (that) => void + * @param loadImgsHandler (可选)加载插件模式图片的处理函数, 若需要显示图标一定要带有此参数 (that) => void * @param toBottomHandler (可选)列表最后一行可见(触底)处理函数 (that) => void - * @param menuInitHandler (可选)右键显示菜单栏初始化处理函数 (that) => void + * @param initHandler (可选)初始化处理函数 (that) => void * @param searchText (可选)启动时设置搜索框文本 * @param placeholder (可选)设置搜索框占位符 * @param thumb (可选)hICON 设置插件模式搜索框图标 */ - static showPluginMode(pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, loadImgsHandler?, toBottomHandler?, - menuInitHandler?, searchText := "", placeholder := "", thumb?) { + static showPluginMode(pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, loadImgsHandler?, + toBottomHandler?, initHandler?, searchText := "", placeholder := "", thumb?) { PluginMode.showPluginMode( ; 启动插件模式 - pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, - loadImgsHandler?, menuInitHandler?, searchText, placeholder, thumb? + pluginSearchData, searchHandler, runHandler, doubleLeftHandler?, loadImgsHandler?, + toBottomHandler?, initHandler?, searchText, placeholder, thumb? ) } class Utils { + /** + * @description: 复制路径指向文件到剪切板 + */ + static copyToClipboard := (this, filePath, cut := false) => CopyToClipboard(filePath, cut) + + /** + * @description: 运行文件 + */ + static startFile := (this, path, workingDir := "", options := "", beforeRun?) => Start.startFile(path, workingDir, options, beforeRun?) + + /** + * @description: 在文件夹中打开 + */ + static openFileInFolder := (this, path) => Start.openFileInFolder(path) + /** * @description: UrlEncode编码 */ @@ -163,7 +192,7 @@ class PluginHelper { /** * @description: 载入文件路径对应的图标为HICON 可以直接关联到图标源头 */ - static filePathToHICON(filePath) { + static associatedHIcon(filePath) { return DllCall("Shell32\ExtractAssociatedIcon", "Ptr", 0, "Str", filePath, "ShortP", 1, "Ptr") } From 0a361d12429d2180b5279bb24fe0cc22329cf8ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E5=88=9D?= <1003019131@qq.com> Date: Thu, 6 Apr 2023 16:18:50 +0800 Subject: [PATCH 9/9] Starter v0.3.3 --- src/Gui/AboutGui.ah2 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Gui/AboutGui.ah2 b/src/Gui/AboutGui.ah2 index b4a1208..15b2599 100644 --- a/src/Gui/AboutGui.ah2 +++ b/src/Gui/AboutGui.ah2 @@ -3,11 +3,11 @@ * @Version: 0.0.3 * @Author: ruchuby * @LastEditors: ruchuby - * @LastEditTime: 2023-04-04 + * @LastEditTime: 2023-04-06 * @Description: 关于界面显示版本信息、项目主页、检查更新 */ class AboutGui { - static version := "0.3.2" + static version := "0.3.3" ; static gui:=unset static init() {