吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 699|回复: 14
上一主题 下一主题
收起左侧

[其他原创] 【AI创作】仿Listary的聚焦文件夹功能

[复制链接]
跳转到指定楼层
楼主
nicle 发表于 2026-11-7 20:32 回帖奖励
本帖最后由 苏紫方璇 于 2026-11-7 22:01 编辑

JumpBar v1.0.9 软件介绍

作者:大军哥 · 2026/11

一句话介绍:JumpBar 是一个常驻 Windows 托盘的小工具——在文件的「打开 / 保存 / 另存为 / 选择文件夹」对话框里按一下 Ctrl+G,就把对话框直接切到你刚才在资源管理器里打开的那个文件夹。


一、它解决什么问题

在 Photoshop、Word、聊天软件、上传窗口里挑文件时,常常要先在一层层目录里点半天,才能回到那个「刚才明明已经打开过」的文件夹。

JumpBar 把这一步省掉:你用资源管理器找到目录,回到软件的打开窗口,按一下快捷键(或让它自动完成),地址栏立刻变成同一个目录。它只帮你定位到目录,选哪个文件、点不点保存,仍然由你决定。

二、主要功能

功能 说明
全局快捷键跳转 默认 Ctrl + G,在文件类对话框里按下即切换到最近文件夹
自动切换 可勾选:文件对话框一出现就自动切过去,连快捷键都不用按
认得活动标签页 Windows 11 资源管理器多标签时,取当前选中的那个标签,不是窗口里的第一个标签
覆盖多种对话框 打开、保存、另存为、选择文件夹、浏览目录等都适用
托盘常驻 启动后不弹窗、不占任务栏,双击托盘图标才打开设置;悬浮提示只显示当前路径
可自定义 快捷键(须含 Ctrl / Alt / Shift / Win 至少一个)、开机自动启动、自动切换开关

三、它是怎么工作的

  1. 后台跟踪资源管理器当前标签页所在的文件夹,只记路径,不扫描文件。
  2. 在文件对话框里按快捷键时,改写对话框的地址栏完成目录导航。
  3. 切换过程一次性写入完整路径,没有逐字打字的动画。
  4. 目录变化时,托盘图标的悬浮提示会显示当前路径。

四、它不会做什么

  • 不会替你打开文件、不会替你保存文件、不会替你选中文件。
  • 不会修改、复制、上传你的任何文件,也不联网。
  • 不会弹广告、不会捆绑安装、不会在后台做别的事。

一句话:只负责「把对话框带到那个文件夹」,到此为止。

五、典型用法

  • 修图:在资源管理器里找到客户图片目录 → 回到 PS「打开」→ Ctrl+G,地址栏直接到该目录,不用再从「此电脑」一层层点进去。
  • 交单 / 上传:把报关单、图片放到某个文件夹并保持资源管理器打开,在任何软件的上传窗口里按 Ctrl+G,立刻定位到同一目录。
  • 批量另存:多个软件连续「另存为」到同一个交付目录,只需按快捷键。

六、运行要求与体积

  • 单个 exe,约 150 KB,绿色免安装,复制到固定目录双击即用。
  • Windows 7 及以上 + .NET Framework 4.x(Win10 / Win11 自带 4.8)。
  • 不需要管理员权限;配置与日志只写在当前用户目录 %APPDATA%\JumpBar。
  • 无第三方 DLL、无外部配置、无注册表以外的系统改动。

小提示:程序未购买商业代码签名证书,首次运行 Windows SmartScreen 可能提示「未知发布者」,点「更多信息 → 仍要运行」即可;个别杀毒软件会把「全局键盘钩子」判为风险行为,加入信任区即可,属常见误报。

七、三分钟上手

  1. 把 JumpBar_v1.0.9.exe 放到一个固定位置,双击运行(托盘出现图标)。
  2. 用资源管理器打开你常用的文件夹,保持那个标签页选中。
  3. 在任意软件的「打开 / 保存」窗口里按 Ctrl + G。
  4. 需要改快捷键、开机启动或自动切换:双击托盘图标进设置。

详细的安装步骤、常见问题与校验值,见同包内的《使用说明_v1.0.9.txt》。

八、小结

功能只做一件,但做得彻底:把「最近打开的文件夹」和「文件对话框」之间那段重复操作抹平。适合每天要在多个软件里反复挑文件、存文件的人。

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Threading;

namespace JumpBar
{
    /// <summary>
    /// 低级键盘钩子:只在「前台是对话框类窗口」时吞掉热键,其它场景完全放行。
    ///
    /// 【硬约束】WH_KEYBOARD_LL 回调超时会被系统静默卸载(LowLevelHooksTimeout)。
    /// 因此本回调里只允许:读结构体、GetForegroundWindow、取一次窗口类名、投递工作项。
    /// 严禁在此枚举子窗口、跨进程 SendMessage、做文件 I/O 或任何耗时操作。
    /// </summary>
    internal sealed class KeyboardHook : IDisposable
    {
        private readonly NativeMethods.LowLevelKeyboardProc _proc;
        private readonly Action<IntPtr> _onTrigger;
        private IntPtr _hookHandle;
        private Hotkey _hotkey;
        private bool _disposed;
        private long _lastTriggerTicks;

        internal KeyboardHook(Hotkey hotkey, Action<IntPtr> onTrigger)
        {
            if (onTrigger == null)
            {
                throw new ArgumentNullException("onTrigger");
            }

            _onTrigger = onTrigger;
            _hotkey = hotkey;
            _proc = HookProc; // 保持委托引用,防止回调被 GC 回收

            IntPtr module = NativeMethods.GetModuleHandle(null);
            _hookHandle = NativeMethods.SetWindowsHookEx(
                NativeMethods.WH_KEYBOARD_LL, _proc, module, 0);

            if (_hookHandle == IntPtr.Zero)
            {
                throw new Win32Exception(Marshal.GetLastWin32Error(), "无法安装全局键盘钩子。");
            }

            DiagLog.Write("hook installed");
        }

        internal void UpdateHotkey(Hotkey hotkey)
        {
            _hotkey = hotkey;
        }

        /// <summary>定时自检:万一钩子被系统卸载,无条件重装一次(自愈)。</summary>
        internal void Reinstall()
        {
            try
            {
                if (_hookHandle != IntPtr.Zero)
                {
                    NativeMethods.UnhookWindowsHookEx(_hookHandle);
                    _hookHandle = IntPtr.Zero;
                }

                IntPtr module = NativeMethods.GetModuleHandle(null);
                _hookHandle = NativeMethods.SetWindowsHookEx(
                    NativeMethods.WH_KEYBOARD_LL, _proc, module, 0);
                if (_hookHandle == IntPtr.Zero)
                {
                    DiagLog.Write("hook rearm FAILED");
                }
            }
            catch (Exception ex)
            {
                DiagLog.Write("hook rearm error: " + ex.Message);
            }
        }

        private IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            try
            {
                if (nCode >= 0 && IsKeyDown(wParam))
                {
                    NativeMethods.KBDLLHOOKSTRUCT data =
                        (NativeMethods.KBDLLHOOKSTRUCT)Marshal.PtrToStructure(
                            lParam, typeof(NativeMethods.KBDLLHOOKSTRUCT));

                    if (_hotkey.IsValid
                        && data.vkCode == (uint)_hotkey.Key
                        && ModifiersMatch(_hotkey.Modifiers))
                    {
                        IntPtr foreground = NativeMethods.GetForegroundWindow();
                        string className = NativeMethods.GetWindowClassName(foreground);

                        if (DialogNavigator.IsCandidateDialog(foreground))
                        {
                            // 按住热键会产生键盘自动重复:400ms 内只认第一次,避免多个导航线程抢焦点。
                            long now = DateTime.UtcNow.Ticks;
                            long last = Interlocked.Read(ref _lastTriggerTicks);
                            if (last != 0 && now - last < TimeSpan.TicksPerMillisecond * 400)
                            {
                                DiagLog.Write("hotkey repeat ignored");
                                return new IntPtr(1);
                            }
                            Interlocked.Exchange(ref _lastTriggerTicks, now);

                            DiagLog.Write("hotkey matched, foreground=" + foreground + " class=" + className);

                            IntPtr captured = foreground;
                            // 立刻投递到线程池并返回,UI 线程与钩子线程都不做任何重活。
                            ThreadPool.QueueUserWorkItem(delegate(object state)
                            {
                                try
                                {
                                    _onTrigger(captured);
                                }
                                catch (Exception ex)
                                {
                                    DiagLog.Write("trigger error: " + ex.Message);
                                }
                            });
                            return new IntPtr(1); // 吞掉按键
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // 钩子回调里抛出托管异常会让系统直接摘掉钩子,必须全兜住。
                DiagLog.Write("hook error: " + ex.Message);
            }

            return NativeMethods.CallNextHookEx(_hookHandle, nCode, wParam, lParam);
        }

        private static bool IsKeyDown(IntPtr wParam)
        {
            int message = wParam.ToInt32();
            return message == NativeMethods.WM_KEYDOWN || message == NativeMethods.WM_SYSKEYDOWN;
        }

        private static bool ModifiersMatch(int expected)
        {
            return IsPressed(NativeMethods.VK_CONTROL) == ((expected & (int)KeyModifiers.Ctrl) != 0)
                && IsPressed(NativeMethods.VK_MENU) == ((expected & (int)KeyModifiers.Alt) != 0)
                && IsPressed(NativeMethods.VK_SHIFT) == ((expected & (int)KeyModifiers.Shift) != 0)
                && (IsPressed(NativeMethods.VK_LWIN) || IsPressed(NativeMethods.VK_RWIN))
                    == ((expected & (int)KeyModifiers.Win) != 0);
        }

        private static bool IsPressed(int virtualKey)
        {
            return (NativeMethods.GetAsyncKeyState(virtualKey) & 0x8000) != 0;
        }

        public void Dispose()
        {
            if (_disposed)
            {
                return;
            }

            _disposed = true;
            if (_hookHandle != IntPtr.Zero)
            {
                NativeMethods.UnhookWindowsHookEx(_hookHandle);
                _hookHandle = IntPtr.Zero;
            }
            DiagLog.Write("hook removed");
        }
    }
}


因为没在帖子中插入部分关键代码,帖子被删除了。
我也不知道哪些是关键代码,所以,我将整个源代码都上传了。

image.png (17.26 KB, 下载次数: 0)

image.png

软件截图.png (16.51 KB, 下载次数: 0)

软件截图.png

使用截图.gif (2.04 MB, 下载次数: 1)

使用截图.gif

JumpBar_v1.0.9.zip

75.93 KB, 下载次数: 39, 下载积分: 吾爱币 -1 CB

源代码.zip

38.36 KB, 下载次数: 22, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 6吾爱币 +10 热心值 +5 收起 理由
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
q71p + 1 + 1 用的哪款gif录制软件,求分享。
sunil + 1 鼓励转贴优秀软件安全工具和文档!
竹轩 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
pyjiujiu + 1 + 1 我很赞同!
powehi + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
pyjiujiu 发表于 2026-11-9 18:36
很好的小软件,我翻译到 rust 版了,这样不必依赖 .net runtime(要 9.x),无头服务模式(无GUI),不支持 自动切换(感觉用不到),,双击运行/扔去开机自启即可 (可以设置 settings.ini )
不知道楼主什么开源协议,仓库链接这个: github.com/fun-tailor/win_little_tools
推荐
Xiers0721 发表于 2026-11-8 22:03
感谢大佬!提个小bug:WinRAR在解压前弹出窗口选择解压路径时,窗口刚打开几秒钟就消失了,根本来不及选好解压路径。不知道能否修复下~
沙发
gaoxiaoao 发表于 2026-11-7 22:01
3#
苏紫方璇 发表于 2026-11-7 22:02
帮您贴上了部分代码,下次发帖就这样贴上一部分,全部代码放在附件中就可以
4#
xxoosplay 发表于 2026-11-7 22:38
来试试看
5#
饮食协会 发表于 2026-11-8 10:40
感谢分享  原创软件
6#
longware 发表于 2026-11-8 10:58
good

不过,我把常用的文件夹,都拖到win10左侧的   快速访问   里
7#
竹轩 发表于 2026-11-8 11:24
感谢分享,可惜用的是win7,估计只能干看着了
8#
joody 发表于 2026-11-8 11:46
这个不错 棒棒的 有了核心功能 保持很小的体积
9#
LilDawn 发表于 2026-11-8 15:02
竹轩 发表于 2026-11-8 11:24
感谢分享,可惜用的是win7,估计只能干看着了

可以用onecommand之类的第三方资源管理器,自带连接器
10#
daymissed 发表于 2026-11-8 16:16
Listary这个软件一直在使用,大佬看看你这个咋样.谢谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-11-10 01:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表