葡京娱乐注册WPF获得全局窗体句柄,并应全局键盘事件

     
作为一如既往叫做屌丝giser的自己,刚接触gis专业是2007年之大一,好悲催,当时gis这个正式是为调剂的,我压根都非知晓gis为何物,那时候gis冷门的平压,报名者标准的屈指可数。记得那么时候得知被调剂到之标准的当儿,心情失落到最点,曾曾打算放弃就读,回去复读一年,以为gis是使交郊外跑的那种,后面经过上网百度搜索gis以及查找本科院校的gis专业,才晓得并无是这般一回事。本科院校将gis安排在微机学院下面,这是于少出之,主要是偏于gis开发方面,有硌类似百度地图的电子地图之类,如今偷的庆,当初无放弃,不然就是从未有过后面的点点滴滴gis经历,更未曾今天底自己。从2007年接触gis以来,我尚未悟出一起来说这么长年累月,一直挨着候在gis,跟gis作伴,中间起关键作用的是读研的老三年(依然是gis专业),其中不少本科同学毕业之后要弄java或者C#支出,要是就是转行了,坚守gis的不行少好少,毕竟2011年本科毕业的时候,gis依然是那的冷门,屌丝一枚。

场景

wpf窗体运行后,只能捕获当前Active窗体的按键事件,如果一旦监听windows全局事件,并对准眼前窗口事件响应.

     
大一格外二点儿年都是黑乎乎中度过,属于混日子的,应付式的考,顺利的以到学分就了行,学了千篇一律充分推进的gis基础课,都是死记硬背,比如经济地理学(1,2),地理信息体系导论,地图学,遥感导论等等,现在自我已经忘却光了,幸好还拟了计算机编程C语言以及C++,让我好稍编程的底稿,为今后学习gis开发打下了根基,尽管后面做gis二次开发的上不是为此c、c++来编写的。除了电脑编程语言之外,还有即使是数据结构以及数据库,这片派系课程对自的提携也杀大,尤其是针对开发者来说。期间还讲了区区不好恋爱,然而并无什么鸟儿用,傻乎乎的,谈了跟没有摆一样,来吗急忙去呢匆匆,如过客一般的有,并不知道为何恋爱,也就是涉过这么一回事了了,当时吗时有发生跟风的素于吧。

第一步:导入Winows API

葡京娱乐注册 1葡京娱乐注册 2

    public class Win32
    {
        [DllImport("User32.Dll")]
        public static extern void SetWindowText(int h, String s);

        /// <summary>
        /// 如果函数执行成功,返回值不为0。
        /// 如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。.NET方法:Marshal.GetLastWin32Error()
        /// </summary>
        /// <param name="hWnd">要定义热键的窗口的句柄</param>
        /// <param name="id">定义热键ID(不能与其它ID重复)  </param>
        /// <param name="fsModifiers">标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效</param>
        /// <param name="vk">定义热键的内容,WinForm中可以使用Keys枚举转换,
        /// WPF中Key枚举是不正确的,应该使用System.Windows.Forms.Keys枚举,或者自定义正确的枚举或int常量</param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(
            IntPtr hWnd,
            int id,
            KeyModifiers fsModifiers,
            int vk
            );

        /// <summary>
        /// 取消注册热键
        /// </summary>
        /// <param name="hWnd">要取消热键的窗口的句柄</param>
        /// <param name="id">要取消热键的ID</param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(
            IntPtr hWnd,
            int id
            );

        /// <summary>
        /// 向全局原子表添加一个字符串,并返回这个字符串的唯一标识符,成功则返回值为新创建的原子ID,失败返回0
        /// </summary>
        /// <param name="lpString"></param>
        /// <returns></returns>
        [DllImport("kernel32", SetLastError = true)]
        public static extern short GlobalAddAtom(string lpString);

        [DllImport("kernel32", SetLastError = true)]
        public static extern short GlobalDeleteAtom(short nAtom);

        /// <summary>
        /// 定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
        /// </summary>
        [Flags()]
        public enum KeyModifiers
        {
            None = 0,
            Alt = 1,
            Ctrl = 2,
            Shift = 4,
            WindowsKey = 8
        }
        /// <summary>
        /// 热键的对应的消息ID
        /// </summary>
        public const int WmHotkey = 0x312;
    }

View Code

     
大学的关键在大二暑假,之前则上了计算机的中坚语言,但是没系统化的上学上机操作,更无通过项目的实战,刚好暑假有这般一个时,这里自己而感谢自己之好基友小黄,当时要不是没有他的积极性朝老师建议我,让自身及他合与导师的种来说,我耶从不机会进来。小黄也是gis的,他编程能力只是高,在正规是鹤立鸡群的,我之gis编程之路就是是当他的先导下,慢慢的入门,慢慢的熟悉起来的。记得及时杀型是依据遥感影像内容之搜索,属于遥感影像识别的,简单的来说就是是因同样轴影像来配合配影像库相似度的眼前20之影像图,我们兑现之是因三种植艺术来寻找,分别是根据文本、基于影像的纹理特征值以及根据影像之相搜索。其中,我顶比较简单的冲文本以及根据影像的纹理特征值,小黄负责的是复杂度较高的基于影像形状特征检索。那无异仿照是因此C++来实现,用到MFC,当时醒来的用MFC模式设计界面方式好方便,初家还是爱慕那种拖拉控件布局界面吧,虽说我实现之效力,相对来说蛮简单的,但是针对立即之自家吧,也磨的可怜老,不断的请教小黄,还有即使是主动的上网查找资源,百度搜索,csdn,那时候不晓得有博客园,是不怎么黄推荐csdn。我在csdn论坛中问了许多题目,里面的大神回答的呢坏积极的,从中,我找到了化解问题之方案还是思路,真的挺管用的。

 第二步:注册快捷键

葡京娱乐注册 3葡京娱乐注册 4

        /// <summary>
        /// 注册快捷集合
        /// </summary>
        readonly Dictionary<string, short> hotKeyDic = new Dictionary<string, short>();

        public MainWindow()
        {
            InitializeComponent();

            this.Loaded += (sender, e) =>
            {
                var wpfHwnd = new WindowInteropHelper(this).Handle;

                var hWndSource = HwndSource.FromHwnd(wpfHwnd);
                //添加处理程序
                if (hWndSource != null) hWndSource.AddHook(MainWindowProc);

                hotKeyDic.Add("Alt-S", Win32.GlobalAddAtom("Alt-S"));
                hotKeyDic.Add("Alt-D", Win32.GlobalAddAtom("Alt-D"));
                Win32.RegisterHotKey(wpfHwnd, hotKeyDic["Alt-S"], Win32.KeyModifiers.Alt, (int)System.Windows.Forms.Keys.S);
                Win32.RegisterHotKey(wpfHwnd, hotKeyDic["Alt-D"], Win32.KeyModifiers.Alt, (int)System.Windows.Forms.Keys.D);
            };
        }

View Code

     
这个暑假真忙,中地MapGIS来到我们学培养MapGIS开发,培训生与他们组办的MapGIS大赛,当时同时是微黄,拉本人,还有少数个同学一起成立一个集团参加培训。那是率先次于沾C#和.Net,MapGIS的培养内容就是是。net平台,开发语言是C#
的二次开发,MapGIS是自个儿点的首先个GIS软件,当时苏的装MapGIS好辛苦,安装上360凡是使禁用的,不然安装不齐,还有即使是我们只好用习版本,试用期是一个月份,满期之后要更登记,当时吗绝非想那么基本上,而且觉的。net平台设计界面真的好方便,培训用之是windowform,直接就是简单拖拉来布局界面,当时搭建的界面真的不敢恭维。这次的MapGIS培训点的学问,一切都是那么的素不相识,幸好这生只队长带领我们,也亏这之集团氛围够好,一起交流座谈,一起化解技术难题。当时之我们是多的GIS菜鸟,现在回忆起来而想笑又清醒的好囧,记得我们立即社入到一个mapgis群里,培训时她们让的,刚开我们多的还不懂mapgis,也从未什么更,遇到不晓的,直接走去群里问,不论mapgis软件或者gis编程问题,比如地图加载出非来,图层直接报错为空对象,甚至刚开连断点跟踪都非会见,不了解程序哪步出错了,唉,问的大半了,群里的她们都厌倦了咱们,说怎么不错过百度先物色一下,咋的咋的……但是咱要逐渐的入门了,懂的了vs软件的调式,断点跟踪,排错,也亮堂了,遇到题目,先仔细分析,利用网络资源搜索,实在非常再到群里请教,慢慢的呢如数家珍了mapgis
api的调用。经过这次培训之积累和我们组织的全力,在末端的mapgis全国大赛,我们组获得了尖端开发组二等奖,作品的主题是校园地理信息体系平台,哈哈,当时咱们的团组织还小风光了同将,校园挂于了横幅,还为那个我们去为GIS的师弟师妹做讲座,传授我们的心得体会以及学习GIS开发之主意。

老三步:响应快捷键事件

葡京娱乐注册 5葡京娱乐注册 6

        /// <summary>
        /// 响应快捷键事件
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="msg"></param>
        /// <param name="wParam"></param>
        /// <param name="lParam"></param>
        /// <param name="handled"></param>
        /// <returns></returns>
        private IntPtr MainWindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            switch (msg)
            {
                case Win32.WmHotkey:
                    {
                        int sid = wParam.ToInt32();
                        if (sid == hotKeyDic["Alt-S"])
                        {
                            MessageBox.Show("按下Alt+S");
                        }
                        else if (sid == hotKeyDic["Alt-D"])
                        {
                            MessageBox.Show("按下Alt+D");
                        }
                        handled = true;
                        break;
                    }
            }

            return IntPtr.Zero;
        }

View Code

 

     
让我思不至的凡,自从上大三吧,我几乎都尚未因此了C++,一直到现在,这点比较遗憾,大三至研三,都是当跟C#以及。net平台打交道了。自从到MapGIS大赛之后,自己的编程能力得到更的晋级,对MapGIS软件和软件之动来必然的问询及左右,本以为自己会直接开mapgis二次开发,但是同样软的偶发机会,接触了arcgis之后,竟然后面与mapgis越行愈远,后面一直绝缘了,转向arcgis。那是一致各项研三的师兄的毕业设计,他好忙不过来,然后要我们还原帮,顺便让我们,带领我们做他的毕业设计,这点自己非常感激他,那么的耐性的指点我们。师兄的毕业设计主题室关于地震紧急疏散路径的研究,里面的算法是他自己打的,GIS基本功能交给我们来兑现,但是比好之是外自己预先增建筑好了系的框架,基于arcgis
for
silverlight的webgis,当时师兄还用力的引荐我们去上silverlight,还真别说,当时2010时候,silverlight挺火的,谁知道后几年她夭折了,唉,说起来就是是坑啊,害自己后面几年读书一直还是开arcgis
for
silverlight。不过就着实是深受silverlight做的界面吸引到了,做的那么炫酷,动态效果,还有就是是webgis这种模式,bs的,不是前mapgis学的cs模式。通过师兄的毕业设计,自己学会了安装arcgis
desktop同arcgis
server,那时候是9.3.1版本,安装arcgis环境还蛮烦的,尤其是新手,不像今天安装这么简单了。学会了arcgis
api for
silverlight的地形图基本职能与有略的gis分析,比如地图缩放,属性查询,空间查询,buffer分析以及极短缺路径分析等等。这同一年啊发一定量个gis专业的开支教程,关于webgis和arcgis
engine的,当时webgis有flex方向及js方向,后悔没有选择js的。通过arcgis
engine的课,自己因此vs2008开发工具练习搭建了一个略的arcgis
engine桌面系统,实现了部分简单的地图开发力量,比较的拖沓控件布局界面。整体而言,大二暑假和大三立马段时期了的可比长。

     
进入大四底自身,面临找工作要考研的精选,当时尚未悟出出保研的名额,结果超过我始料不及,争取到同样名为保研GIS的名额,在那么之前自己呢面试了几乎下GIS的信用社,比如广州奥格,广州诚信所,都市圈,当时结果未太如意,当时游人如织同桌都转行了,或者是举行计算机编程,比如前面提到的小黄,有些女生做gis应用之,总的做gis开发的较少。综合考虑了一下,还是选择保研继续上去矣,延续好的GIS旅途……大四之即刻同样年,没有课可学,不是找工作就是是编辑毕业论文的准备,其中尚协助师妹师弟指导一下他们之gis技术问题,他们的gis课程设计需要使用,哈哈,记得及时有只师妹貌似特别佩服我一般,经常找我解决问题,时不时邀请我一起进餐的,有时候去散散步什么的,感觉校园生活都是那么的光明,出来干活才发觉,唉!

     
就如此的度了自身的季年gis生活,没有多酷之雄心壮志,没有多异常之大好同期待,一切都是的那么的平庸,等待上研究生的gis生活……