返回首页

介绍
你有没有想过一个想法,在Windows的导航可方便多了?为什么不采用类似的技术在quot;导航到classquot;在大多数常见的IDE,在弹出的窗口中显示相关的文件夹比赛时,前景带来了一个预定义的组合键,如:
{S0的}
想后,我写了一个小工具,名为quot;导航Assistantquot,上面显示的。最新的可执行文件(以及完整的源代码),它是开放源码,和MIT许可分发。 希望这将是有用的人。本文的源代码只包含最棘手的部分,说明​​如下(只是由于CodeProject上规模的建议)。为什么需要在所有
这里是Windows档案总管和总指挥官的缺点可能妨碍大多数用户:一个需要执行的鼠标点击访问深层嵌套的文件夹中的巨额。在Windows资源管理器搜索是相当缓慢的,甚至与索引转向于。低可用性:Windows资源管理器搜索需要打开一个浏览器,眼睛老盯着搜索栏(而不是集中在屏幕上),单击它,键入文件夹的名称(最好是完整的),并等待。如果你犯了一个错误的文件夹名称中,需要重复各地。在Windows Explorer地址栏提示和总指挥官(子文件夹的名字出现在地址栏后按标签)的低可用性。您需要输入完整的路径,不管怎样,按Tab键,每个子搜索,并为每个子文件夹的正确提示。如果你期待一个错误的文件夹路径(例如,"程序文件(X32)"而不是"计划Filesquot ;),你需要再次执行所有这些行动。
对于这些特殊的原因,我已经写quot;导航Assistantquot;,其操作是等价的quot;导航到classquot;或quot;导航到Filequot;功能大多数常见的IDE:组合CTRL-N和JetBrains公司的产品按住Ctrl-Shift-N(ReSharper的,IDEA的,PhpStorm WebStorm),按住Ctrl-Shift-T的Eclipse中。其他优势
除了消除上述缺点,得到以下好处:不需要知道确切的文件夹路径不需要知道确切的文件夹名称少打字,搜索速度,伟大的可用性即时预览搜索结果,在每个按键(所以你可以快速修改搜索查询)
更好的文件夹结构作为一个免费使用导航助理奖金。事实上,许多开发商(尤其是熟悉了辉煌的代码完成)都知道{A2的}(元素的最有效的大脑中的活动内存的数量)。因此,它是一个很好的策略,限制在一个给定的文件夹的子文件夹的数量多达7个,以及限制类领域,在方法参数等。
不幸的是,这种做法将被用来在文件夹导航不方便的成本。导航助手将让你忘了这个缺点。如何使用它
快速导航到所需的文件夹,只需按一个预定义的组合键(按住Ctrl-Shift-M的​​默认情况下),在Windows资源管理器或Total Commander的应用程序(或任何其他应用,这将意味着一个新的Windows资源管理器导航的实例)。应用程序主窗口将出现:
{S}
开始键入目标文件夹的名称。
杀手级的特性:它没有必要键入完整的文件夹名称,例如,它足以键入quot;文件andquot达到文件和设置。此外,它甚至没有必要键入单词quot; documentsquot,完全的"doc andquot;也适合(最良好的祝愿,JetBrains的!);同时,它不是强制性键入开始,"从文件夹的名称; settingsquot;就足够了。帕斯卡尔/骆驼在文件夹名称的情况下也开发的缘故,认识到:搜索查询quot;资产净值assistquot;将匹配的文件夹quot; NavigationAssistantquot;
文件夹比赛名单将会出现由于这些操作:
{S0的}
所有你必须​​做的是一个合适的元素,用鼠标点击或使用向上/向下键选择所需的路径,然后按Enter。
如果你不满意导航窗口中的一些原因,你可以快速最小化到托盘退出按钮。
如果你把计划以外的Windows资源管理器或总指挥官面前,一个新的窗口资源管理器应用程序将推出选择一个文件夹匹配(已经打开所需的文件夹),它是可以改变默认的导航设置总指挥官。
选项} {A3的覆盖详细。它是如何实现的
实用写在微软NET 3.5和Windows Presentation Foundation中,因此它应该工作的地方NET 3.5的安装。
安装程序实施,我发现极为方便的帮助:这是好得多比Visual Studio安装程序,安装盾,或维克斯:它是自由和开放源码它是模块化的(在某种意义上说,它从微软技术断开)它是透明的(只需要修改脚本只是一个文本,没有可视化编程,Visual Studio安装类似)因此,安装程序文件不重新创建在每次更新和成千上万的GUID不重新生成,所以没有烦恼与版本控制系统灵活(支持的Pascal / Delphi的脚本),我已经用Delphi编程7年前的最后一次,但创新科技及安装优势一定补偿这种情况下噢,它奇迹般地创建了一个单一安装x32和x64版本
安装比较,可以发现,例如,{A5的}。
某些非平凡的部分代码:全局键盘钩子
应用程序需要听取全局热键招,适当地显露出来,取其窗口是目前活跃。 。NET不提供此功能出框。我用{A6的},虽然其他的解决方案都存在,只是谷歌quot;全球钩/全球hotkeysquot的;把一个无效的应用前景
如果应用程序遇到了一个预期的组合键,它本身作为一个前台窗口呈现。
WPF中确实有一个方法{A7的},它使用{A8的WinAPI函数内部,因此,拥有所有的限制。更确切地说,如果应用程序是无效的调用方法时,将重点留在最初活动窗口。其实,这是一个很好的行为,防止恶意程序把自己前面,并中断用户体验。但它不是什么需要在特定情况下的导航助理。
{A9的}我用,但其他解决方案存在({A10的}{A11}),但他们没有工作,在任何情况下适当。不幸的是,启发了我的链接是在Visual Basic 6,所以工作的C#代码如下:

//WinApi functions declarations

[DllImport("user32.dll")]

static extern bool InvalidateRect(IntPtr hWnd, IntPtr lpRect, bool bErase);



[DllImport("kernel32.dll")]

static extern uint GetCurrentThreadId();



[DllImport("user32.dll")]

private static extern bool SetForegroundWindow(IntPtr hWnd);



[DllImport("user32.dll", SetLastError = true)]

private static extern uint GetWindowThreadProcessId(IntPtr hWnd, 

                           IntPtr lpdwProcessId);



[DllImport("user32.dll")]

private static extern IntPtr GetForegroundWindow();



[DllImport("user32.dll")]

private static extern bool AttachThreadInput(uint idAttach, 

        uint idAttachTo, bool fAttach);



//The function to bring the WPF window to the foreground

private void ReallySetForegroundWindow(Window window)

{

    //Initial attempt

    window.Show();

    window.Activate();

    

    //Get window handle

    IntPtr hWnd = new WindowInteropHelper(window).Handle;



    //Check to see if we are on the foreground thread

    uint foregroundThreadId = 

      GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);

    uint ourThreadId = GetCurrentThreadId();



    //If not, attach our thread's 'input' to the foreground thread's

    if (foregroundThreadId != ourThreadId)

    {

        AttachThreadInput(foregroundThreadId, ourThreadId, true);

    }



    //Bring our window to the foreground

    SetForegroundWindow(hWnd);



    //If we are attached to our thread, detach it now

    if (foregroundThreadId != ourThreadId)

    {

        AttachThreadInput(foregroundThreadId, ourThreadId, false);

    }



    //Force our window to redraw

    InvalidateRect(hWnd, IntPtr.Zero, true);

}
Windows资源管理器集成
操纵Windows资源管理器窗口的灵感} {A12往,但重大修改。核心代码是下面的,广泛的评论:{C}
新的Windows资源管理器实例需要一些不三不四的工作了。请参考源代码WindowsExplorerManager类。总指挥官整合
总指挥官进行整合,帮助} {A13号;首先/ O,这不是一个新的总指挥官实例,但在当前打开(如果存在)设置一个活跃的路径。示例代码如下所示。
public void NavigateTo(string path, bool openNewCommander, 

       string totalCommanderFolder, string totalCommanderFileName)

{

    //Switches from help:

    // /T Opens the passed dir(s) in new tab(s). Now also works

    //    when Total Commander hasn't been open yet;

    // /L= Set path in left window;

    // /O If Total Commander is already running, activate it

    //    and pass the path(s) in the command line to that instance 

    //    (overrides the settings in the configuration dialog to have multiple windows);

    // /S Interprets the passed dirs as source/target instead of left/right (for usage with /O).

    //We use /S to make total commander set path for the currently active panel and tab.



    //A small hack is used: if there are several open total commanders 

    //and /O option is used, totalcmd.exe /O will open

    //a currently topmost visible commander.

    string template = openNewCommander

                          ? "/T /L=\"{0}\""

                          : "/O /S /L=\"{0}\"";



    string arguments = string.Format(template, Path.GetFullPath(path));



    ProcessStartInfo processStartInfo = new ProcessStartInfo();

    processStartInfo.WorkingDirectory = totalCommanderFolder;

    processStartInfo.FileName = totalCommanderFileName;

    processStartInfo.Arguments = arguments;

    Process.Start(processStartInfo);

}
建筑
标准的多层体系结构正在使用的代码(驱动域提供一个很好的概述设计快速阿夫拉姆和Marinescu在线)。UI层 意见主持人层主持人表示服务查看模型模型映射器域模型又称为业务层应用服务域的数据对象(纯数据传输对象)没有数据访问层:-)
我试图用在第一个模型 - 视图 - ViewModel模式(共同WPF),然后切换为MVP的理由如下:MVP又增加了一层抽象(主持人),否则,大量的逻辑会去查看模型和这个逻辑概念属于不查看模型(见单一责任原则)视图模型变得太沉重无法使用视图的接口驱动的开发,因此UI层成为一个烂摊子(没有关注点分离,模块化,界面清晰)
因此,MVP是目前使用的,但通过查看模型进行数据绑定到UI如下:要么通过查看模型的IVIEW接口(方法或属性) 实例查看视图中模型内部限制
如果导航助手已经手动关闭前的最后一台计算机关机,或在过去的Windows启动尚未推出,这是不可能的告诉导航助理发射是否缓存文件夹中的实际状态,使后者将更新默默地在后台线程,并最后在这个过程完成之前,将用于缓存版本(可能过时)。
。NET和WPF可以是相当缓慢和沉重,资源消耗,但你不得不忍受的。结论
我试图共享一个小工具在Windows资源管理器Total Commander的方便导航。希望这将成为对社会有用。此外,我希望该技术整合与壳牌和Windows Explorer和总指挥官决定的概述和代码将是有益的。
再次链接{A14高速公路}{A15}(SVN是最可能已知的大多数开发商使用)。
感谢您的关注!

回答

评论会员:鲍里斯・张 时间:2012/02/06


感谢alot这一点非常有用的工具。我很喜欢它,每天使用它。我是一个大风扇的总指挥官,所以我真的很喜欢导航助手的整合。

我有我至少imporve一些建议,这将使该工具更加有用。

1。如果被添加到索引文件的能力,它配置打开索引文件,因此,没有资源分配,如果是关闭的。我相信的,如果这种能力被添加(如你在答复中所提及般)使其慢,并采取了更多的系统资源,这个小工具将不再那么有用。对于我来说,足够的笑着,只浏览文件夹,如果你使用的totalcommander它可以使用它的过滤possiblility,以进一步完善文件过滤器/搜索功能,当您导航到一个文件夹导航助理。

2。我会很感激,如果能够添加一些偏远的路径可以增加,因此,在这些路径的文件夹可以被索引aswell。我试图添加一个远程路径"解析"配置项的文件夹,但这只是使工具,停止工作。 {中三}

一个非常好的文章和工具,再次感谢!

鲍里斯与问候
评论会员:瓦西里・巴拉诺夫 时间:2012/02/06
嗨,

你的工具是优秀的。
我想知道,如果它是一个大的任务,也将此功能扩展到导航的文件?你的工具,然后将更换的文件搜索功能,太多。
我知道该数据库将成为巨大的......

感谢您的工作
克里斯托夫:
|瓦西里・巴拉诺夫
评论会员:游客 时间:2012/02/06
感谢检讨和建议它可能不是一个大的任务,但我是怕与性能的问题,并决定不落实的试点版本:1。该计划将有监控每个文件操作,所以系统运行慢整体(在安装或文件夹复制)(目前只是监视文件夹的)2。也听这两个文件和文件夹的变化时,它无法分辨最近创建的实体是否是一个文件或文件夹,因此该计划将明确检查文件系统,这将征收一笔巨大的开销。但是,当我返回时,我肯定会考虑这个选项。最好的问候,瓦西里:瓦西里・巴拉诺夫
我安装WINXP,这似乎是罚款。一个小的窗口apeared来检查目录,然后在系统托盘显示图标。这几秒钟后消失。我重新启动从"开始/程序文件/ ..但这一过程后停止一会儿,没有任何消息或错误。
这是只为Win7
评论会员:游客 时间:2012/02/06
鲍里斯・张:谢谢你的信息它应该工作在WinXP和你的情况肯定是一个严重的错误{中三}不幸的是,我没有记录(保持小规模,以避免额外的依赖,只是为了节省时间和释放的工具,看它是否在所有的人非常有用)加强与此实用工具。这是非常奇怪的,反正没有出现错误讯息。如果你会这么好心,你可以看看系统日志(控制面板-管理工具-事件查看器)和搜索任何错误报告发送给我。此外,{A16}在WinXP中有一个已知的bug。你可以尝试按Ctrl-Shift-M的​​导航助理似乎已经崩溃,以确保它真的崩溃,不只是失去了一个图标在托盘
| ScruffyDuck:我重新安装了图标在托盘。
我去的设置项,打开的窗口。
我看了看周围没有picing任何窗口和托盘图标消失。
我检查"事件查看器"=>没有暗示什么。我看到安装事件和加载的fontcache。没有别的。
进程资源管理器显示,这个过程终止。 {五}

对不起,没有有进一步的提示。

奥利弗
评论会员:艾迪Vluggen 时间:2012/02/06
感谢细节。我一定会纳入采伐{六}