现在的位置: 首页 > 综合 > 正文

桌面快捷图标 搜索工具

2017年10月01日 ⁄ 综合 ⁄ 共 3171字 ⁄ 字号 评论关闭

一直以来,由于使用到的工具越来越多,各种快捷方式的管理也非常的让人厌倦。网上也有很多的很炫的管理工具,但是对于一个不想老是动鼠标的人来说,键盘热键结合快捷的搜索和调用,才是最好的选择,

思路简单如下:

1.小工具开机启动

2. 快捷键可以方便调出小工具,直接进入搜索栏,小工具中默认加载桌面以及桌面文件夹中2层深度的常用文件(doc,pdf,等等,不包括源代码文件)和工具的快捷图标。

3.小工具中的搜索直接用上下键控制选择结果,Enter键直接调用。

这个小工具我选择WPF来开发,主要涉及到的问题有:

1.注册系统热键,以及热键的清除和重新注册。

2.搜索中ListView上的节点选择,直接用上下键控制(这块稍费了些功夫,因为上下键不在OnKeyDown事件中触发。最后查阅了一些帖子才知道,它俩只在OnPreviewKeyDown中触发。

2.任务栏小图标的显示,这个采用的依然是From的NotifyIcon,虽然很多WPF的开源项目也有类似的东西,但是我觉得没必要搞的那么复杂。所以选用了最简单的。

剩下的就是重头戏:

4.对于WPF下MVVM模式的使用,这点没有做到很好,只是大体上使用了这个结构,但是中途因为Binding的一些异常和追踪问题,最终有部分是直接用winfrom的方式绑定的。这部分由于时间问题,先完成功能,对于MVVM的使用后续继续完善,总体感觉,MVVM在WPF下确实很强大,如果将数据binding,依赖,附件属性这些东西都使用好的话,对于View和业务的分层,将会非常的清晰。是个不错的设计思路。

5. 对于MahApps.Metro开源项目中的皮肤的使用。

6.对于WPF基础知识的重新学习,很多技术点长时间不使用的话,有点生疏,刚好再来一次,加深印象。

上个截图,看下这个小工具的长相。

黑底只是另一个工具的因为怕白色无法看清边界,顺手抓过来了。

因为整个工具并未用到太过高深的东西,以下只罗列一部分我觉得比较重要的代码。

        /// <summary>
        /// 注册热键
        /// </summary>
        public void HotKeySet()
        {
            Handle = new WindowInteropHelper(window).Handle;         

            Controlkey = (uint)CurrentKeyFlag.keyFlag;
            Key = (uint)CurrentKey;
            KeyId = (int)Controlkey + (int)Key * 10;

            if (KeyPair.ContainsKey(KeyId))
            {
                throw new Exception("热键冲突");
            }

            if (false == RegisterHotKey(Handle, KeyId, Controlkey, Key))
            {
                throw new Exception("注册失败!");
            }

            if (KeyPair.Count == 0)
            {
                if (false == InstallHotKeyHook(this))
                {
                    throw new Exception("HookFailed!");
                }
            }

            KeyPair.Add(KeyId, this);

            //保存热键配置
            HotKeys keys = new HotKeys();
            string keyName = keys.GetKeyName(CurrentKey);
            SettingHelper.SetHotKey(CurrentKeyFlag, keyName);
        }
 
    /// <summary>
    /// 图片资源转化器
    /// </summary>
    [ValueConversion(typeof(string), typeof(ImageSource))]
    public class IconConver : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null) return null;

            string ext = System.IO.Path.GetExtension(value.ToString()).Replace(".", "").Trim();
             
            if (value.ToString() == "devenv.exe")
            {
                ext = "visualstudio";
            }
            if (ext =="")
            {
                ext = "Explorer";
            }

            Uri uri;
            try
            {
                uri = new Uri("/E_Start;component/Resources/FileType/" + ext + ".png", UriKind.Relative);
            }
            catch
            {
                uri = new Uri("/E_Start;component/Resources/FileType/exe.png", UriKind.Relative);
            }

            BitmapImage bi = new BitmapImage(uri);
            return (new ImageBrush(bi)).ImageSource;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return null;
        }
    }

        /// <summary>
        /// 皮肤切换
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void themeContextMenuItem_Click(object sender, RoutedEventArgs e)
        {
            if (sender is MenuItem)
            {
                Theme theme = new Theme();
                string color = string.Empty;
                string content = (sender as MenuItem).Header.ToString();
                theme = content.ToLower().IndexOf("light") > -1 ? Theme.Light : Theme.Dark;
                color = content.Replace("Light", "").Replace("Dark", "").Trim();

                ThemeManager.ChangeTheme(this, ThemeManager.DefaultAccents.First(
                    a => a.Name == color), theme);
            }
        }

补充一个有用的代码段:用于对lnk快捷方式文件的实际路径指向的获取

using Microsoft.Win32;
using IWshRuntimeLibrary;//所属COM:Windows Script Host Object Model
/// <summary>
/// 获取快捷图标的实际指向
/// </summary>
/// <param name="lnk"></param>
/// <returns></returns>
private string GetTargetPath(string lnk)
{
	WshShell shell1 = new WshShell();
	IWshShortcut shortcut = (IWshShortcut)shell1.CreateShortcut(lnk);
	return shortcut.TargetPath;
}

因为这个工具只是为了符合个人的使用习惯,可能后面还会再加一些觉得比较有用的功能上来,慢慢完善吧。

因为很多代码都是在网上找的别人的范例,所以我不再公开代码了,功能也非常简单,主要是为了偷懒,更快捷的使用资源,不把时间浪费在鼠标的各种移动上。

如果有对代码有兴趣的朋友,可以留下邮箱。

抱歉!评论已关闭.