如何在ArcMap中监听键盘鼠标事件(转)

Link: http://www.cnblogs.com/dyllove98/p/3155551.html

昨天有个朋友想要实现一个功能,就是在ArcMap中编辑数据的时候,能够通过快捷键自动设置预定义的属性,比如,选中若干要素,按A键,就自动填充属性,按B键,则又自动填充另外的属性字段。

单就这个功能而言,可能不一定非得开发,或许直接在属性表里批量编辑也是个办法。但如果实现了这个功能,还可以引申出一些其他的应用,比如在要素编辑的时候自动进行质量检查;比如在地图浏览中添加许多预定义的效果等。

闲话不说,先介绍一下实现思路:ArcMap中本身是无法让你监听键盘事件的,显然需要通过开发。开发的途径,目前主要是通过Add-In。在Add-In中,我们需要写一个工具,由工具来实现对鼠标和键盘事件的监听。

详细理一下步骤:

1.开发一个Add-In插件;

2.在Add-In插件中,写一个工具;

3.将Add-In部署到ArcMap中;

4.用户点击Add-In插件的时候,代码里初始化工具,将其设置为地图的当前活动工具;

5.在工具类中,监听鼠标和键盘事件,执行所需的操作。

想必大家看了这几个步骤之后,觉得也没什么难度,事实上也如此,唯一需要注意的就是工具需要实现的接口,以及如何在Add-In里面初始化和调用工具。

下面是示例代码。

首先定义工具:

 
 

class HotKeyTool:ITool,ICommand,ICommandItem

注意该工具实现了ITool,ICommand,ICommandItem接口,其中ITool的OnKeyDown方法、OnMouseDown等方法,就是你的业务逻辑代码应该放的地方:

 
 

 
 

//响应按键按下事件

public void OnKeyDown(int keyCode, int shift)

{

Keys key = (Keys)keyCode;

switch (key)

{

case Keys.B:

MessageBox.Show("S pressed");

break;

case Keys.C:

MessageBox.Show("D pressed");

break;

case Keys.A:

MessageBox.Show("A pressed");

break;

default:

MessageBox.Show(key + " pressed~");

break;

}

}

 
 

而ICommandItem的UID属性,则是非常关键的一个属性,需要生成一个UID值并返回。

 
 

//此属性会被反复多次调用

private UID uid = null;

public ESRI.ArcGIS.esriSystem.UID ID

{

get

{

if (uid == null)

{

uid = new UIDClass();

uid.Value = "{6B76685B-31C5-4B69-8AC3-B6E9FE16D162}";

}

 

return uid;

}

}

 
 

工具类其它代码没有特别需要说明的,接下来看下如何初始化和调用工具:

 
 

protected override void OnClick()

{

ArcMap.Application.CurrentTool = null;

 

IMxDocument mxDoc = ArcMap.Document;

IActiveView activeView = mxDoc.ActiveView;

IMap map = activeView.FocusMap;

 

//初始化工具,并将其与应用程序绑定

HotKeyTool hotKeyTool = new HotKeyTool();

hotKeyTool.App = ArcMap.Application;

 

try

{

ICommandItem cmdItem = hotKeyTool as ICommandItem;

 

//设置当前工具,以便处理键盘事件

ArcMap.Application.CurrentTool = cmdItem;

}

catch (Exception ex)

{

 

}

 

}

如何在ArcMap中监听键盘鼠标事件(转)的更多相关文章

  1. 如何在ArcMap中监听键盘鼠标事件

    昨天有个朋友想要实现一个功能,就是在ArcMap中编辑数据的时候,能够通过快捷键自动设置预定义的属性,比如,选中若干要素,按A键,就自动填充属性,按B键,则又自动填充另外的属性字段. 单就这个功能而言 ...

  2. winform中键盘和鼠标事件的捕捉和重写(转)

    在 编写winform应用程序时,有时需要无论在哪个控件获取焦点时,对某一个键盘输入或者鼠标事件都进行同样的操作.比如编写一个处理图片的应用程序时, 希望无论当前哪个控件获得焦点,当用户按上.下.左. ...

  3. winform中键盘和鼠标事件的捕捉和重写

    在编写winform应用程序时,有时需要无论在哪个控件获取焦点时,对某一个键盘输入或者鼠标事件都进行同样的操作.比如编写一个处理图片的应用程序时,希望无论当前哪个控件获得焦点,当用户按上.下.左.右键 ...

  4. vue 监听键盘回车事件 @keyup.enter || @keyup.enter.native

    vue运行为v-on在监听键盘事件时,添加了特殊的键盘修饰符:\ <input v-on:keyup.13="submit"> vue还非常贴心地给出了常用按键的别名, ...

  5. 如何在arcmap中调试addin或者插件

    1. 首先,在arcmap中,依次点击“自定义”->"加载项管理器",加载dll或者tlb文件 2. 其次,在vs中,依次点击“工具”->“附加到进程",在对 ...

  6. 如何正确响应ArcGIS JavaScript API中图形的鼠标事件

    在使用ArcGIS JavaScript API编写程序的时候,程序员往往需要完成这样一个功能:点击地图上的图形,自动进行专题GIS数据查询,当在地图非图形区域上点击时,自动进行底图兴趣点查询. 由于 ...

  7. Winform下WebBrowser 编辑模式 监听键盘按键事件

    最近使用 WebBrowser 做了个富文本编辑器(其实网上有很多很多).例如下面这个玩意(不要在意界面神马的) WebBrowser在编辑模式下可以有一些HTML标签的功能,改变字体大小颜色等等等. ...

  8. 如何在C#中使用全局鼠标、键盘Hook

    今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么实现全 ...

  9. Vue监听键盘回车事件

    在写页面时遇见了登录页需要加一个键盘回车事件. vue 的 v-on中有这样的修饰符 <input v-on:keyup.enter="submit"> 即<in ...

随机推荐

  1. jquery检测input checked 控件是否被选中的方法

    jquery检测input checked 控件是否被选中 js部分 复制代码代码如下: function tongyianniu(){ var gouxuan=$('input[type=check ...

  2. iOS笔记之线程

    dispatch_after dispatch_after能让我们添加进队列的任务延时执行,比如想让一个Block在10秒后执行: var time = dispatch_time(DISPATCH_ ...

  3. Cause: org.postgresql.util.PSQLException: ERROR: cached plan must not change result type的前因后果

    首先说明一下遇到的问题: PG数据库,对其中的某张表增加一列后,应用报错,信息如下: 应用使用相关框架如下:SpringBoot.MyBatis. ### Cause: org.postgresql. ...

  4. VC++ 6.0 C8051F340 MFC programming note

    /************************************************************************************** * VC++ 6.0 C ...

  5. HDU3861The King’s Problem

    HDU3861   kosaraju缩点+最小路径覆盖 为什么是最小路径覆盖呢,我们假设有一个如下DAG图 目前我们1出发到了3处,对于3的儿子4.5.6,肯定是不能彼此到达的.所以最好的情况3只能延 ...

  6. Libusb学习

    1.参考:http://www.cnblogs.com/Daniel-G/archive/2013/04/22/3036730.html https://baike.so.com/doc/506541 ...

  7. NYOJ-1036 非洲小孩

    非洲小孩 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 家住非洲的小孩,都非常黑.为什么呢? 第一,他们地处热带,太阳辐射严重. 第二,他们不常常洗澡.(常年缺水, ...

  8. Linux下用文件IO的方式操作GPIO(/sys/class/gpio)(转)

    通过sysfs方式控制GPIO,先访问/sys/class/gpio目录,向export文件写入GPIO编号,使得该GPIO的操作接口从内核空间暴露到用户空间,GPIO的操作接口包括direction ...

  9. redhat 连接mysql数据库Can't get hostname for your address

    redhat 连接mysql数据库Can't get hostname for your address Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQ ...

  10. (接上一条)解决ssh隧道断开自动重连的问题

    Sounds like you need autossh. This will monitor an ssh tunnel and restart it as needed. http://www.d ...