介绍
你有没有想过一个想法,在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#代码如下:
Windows资源管理器集成//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资源管理器窗口的灵感} {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是最可能已知的大多数开发商使用)。
感谢您的关注!