分类: .Net

整理分享C#通过user32.dll模拟物理按键操作的代码

对系统模拟按键方面的知识和按键映射代码做了一下梳理,在这里分享出来,适用于开发自动操作工具和游戏外挂。 主代码: public const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key click flag public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag [DllImport(“user32.dll”)] private static extern void keybd_event(byte bVk, byte bSCan, int dwFlags, int dwExtraInfo); [DllImport(“user32.dll”)] private static extern byte MapVirtualKey(byte wCode, int wMap); public static void 模拟按下按键(VirtualKeyCode 虚拟按键代码) { var code = (byte)虚拟按键代码; keybd_event(code, 0, 0, 0); } public...

更多

.Net判断一个对象是否为数值类型探讨总结(高营养含量,含最终代码及跑分)

前一篇发出来后引发了积极的探讨,起到了抛砖引玉效果,感谢大家参与。 吐槽一下:这个问题比其看起来要难得多得多啊。 大家的讨论最终还是没有一个完全正确的答案,不过我根据讨论结果总结了一个差不多算是最终版的代码,这里分享出来,毕竟这是大家共同的智慧结晶,没有交流和碰撞就没有这段代码。   探讨贡献提名典礼 首先感谢 花生!~~ 以及 NETRUBE 提出了使用 GetTypeCode() 获取类型代码的方式,这个比 typeof() 的性能要高,但是有一点局限性,后面代码中会指出。 由 JTANS 以及 入夏 提出的 ValueType 判断也是有意义的,但显然仅仅做这个判断只能确定是否为值类型,还不能确定是否为我们要的数值类型。 由 石山不高 提出 Decimal 是非基元类型,这是正确的,我们在最终代码中对其进行了特殊处理。 由 花生 (为什么有两个叫花生的!(+﹏+)~)给出的代码比较完善,是比较具有总结性的讨论成果了,最接近最终版: 其存在的问题主要是 char 和 bool 类型还是会被当做数值,以及判断顺序需要小幅优化。   (可能也许大概差不离就是)最终版...

更多

.Net判断一个对象是否为数值类型

这乍一听是个很简单的事,但突然搞起来还真有点无从下手的感觉。 首先当然是通过GetType()方法反射获取其类型信息,然后对其进行分析,但是类型信息Type中并没有简单地给出这么一个属性进行判断。 老外给出的方法是: public static bool IsNumeric(this Type dataType) { if (dataType == null) throw new ArgumentNullException(“dataType”); return (dataType == typeof(int) || dataType == typeof(double) || dataType == typeof(long) || dataType == typeof(short) || dataType == typeof(float) || dataType == typeof(Int16) || dataType == typeof(Int32) || dataType == typeof(Int64) || dataType == typeof(uint) || dataTyp...

更多

MVC中获取模型属性的Range和StringLength验证特性设置

MVC中的客户端及服务端模型验证信息都以ModelMetadata类型作为承载,在获得属性的ModelMetadata之后(还不知道怎么获取ModelMetadata的童鞋请自行恶补),我们可以轻松得到一些我们在模型中定义的特性,比如显示名称、是否只读、是否必须、注释、数据类型等,但是并不包括Range和StringLength这两个需要验证的特性,我把ModelMetadata对象翻个底朝天也没找到设置的值。 于是乎,只能通过反射来获取特性的定义信息了,以下代码能够获取到该属性定义的所有特性: var attrs = metadata.ContainerType.GetProperty(metadata.PropertyName).CustomAttributes; 然后我们遍历之,寻找我们要的类型,这里以Range为例: foreach (var f in attrs) { if (f.AttributeType == typeof(RangeAttribute) && f.ConstructorArguments[0].ArgumentType != typeof...

更多

RegeX 3 正则表达式实践教程之 —— 在Eclipse中以装饰器模式包装接口

在实现一个庞杂的接口时,往往需要付出很多体力劳动,例如这个: 以上是要实现的接口的一小部分方法,我们要实现此接口以包装其衍生类,由于仅仅是包装,只需要把所有方法都转交给被包装对象“getSource()”来执行。 好在有正则表达式这种东西存在,能够减轻部分工作。 但是,通常很难用普通正则表达式替换工具完整地完成这样的任务,我们需要移除注释部分文字、获取方法签名、转交“getSource()”执行,还要把参数完整传递过去,使用单一正则表达式几乎不可能完成该任务。 这时来看看RegeX 3如何解决此问题吧:   第一步 去除注释 输入表达式:s*//.+ 替换字符为空 执行替换 由左侧可以看到匹配到105条注释。 替换结果可以看到注释都被去除:   第二步 匹配整个方法体 左侧选中OutputText节点。 表达式:public (S+) (?<FuncName>w+)((?<Parameters>[sS]*?))s*{s*ns*(?<Return>return)?[^}]+ 此时暂不输入替代文本 执行替换   第三步 去除...

更多

正则表达式替换器 RegeX 3 发布 (Silverlight版)

继上一版本RegeX发布以来已有三年多了,此次发布全新设计的RegeX 3供广大开发者使用。 新版基于Silverlight开发,支持安装到本地运行,采用类似WindowsPhone7的Metro风格设计。 新版本的主打功能有两点: 支持无限层级的复杂多重匹配与替换 支持在替换时以$@符号引用经过处理后的组内容 这两个功能主要为了解决如下问题: 冗长的表达式结构。 在匹配复杂的格式时,使用的表达式不仅冗长,且晦涩如天书,一旦修改时不小心改变了某个符号后患无穷。 无限级多重替换功能将极大改善这一情况,你可以将替换工作拆分成若干个步骤,分别处理,使得思路清晰,表达式易于维护。 不可能的任务。 正则表达式是万能的,但万这个数字并不大,有很多格式是不可能或很难用一个表达式来完成的,很多时候我们需要自己来写一个新程序予以解决,而当有了$@引用功能,很多问题迎刃而解。 $@符号允许引用目标组的处理结果,比如以前我们在替换时以$1形式引用组1的内容,现在我们可以对$1组再进行正则替换,然后以$@1形式引用其替换结果,这在处理复杂格式时极为有用。   立即开始使用RegeX3 提示:程序中单...

更多

RegeX 3 正则表达式替换器 (Silverlight版)

强烈建议右键安装到本地后使用。 分享或转载本博客站点内的所有原创内容时,都必须遵循此协议: 姓名标示-非商业性-相同方式分享 4.0 国际 (CC BY-NC-SA 4.0) 同时必须附加指向本文页面或本博客首页的超链接。 除此之外的转载、分享方式都必须征得本博客作者的授权,否则将会诉诸法律。

更多

Silverlight中后台代码设置TreeView选定项的方法

当TreeView在XAML中以嵌套数据模板(HierarchicalDataTemplate)方式绑定数据时,其子元素都是特定类型的对象,而非TreeViewItem,这样就没法通过设置TreeViewItem子元素的IsSelected属性实现选定效果。 这时可以通过Silverlight Toolkit项目提供的扩展功能实现选取,项目网址:http://silverlight.codeplex.com/ 下载并安装后引入System.Windows.Controls.Toolkit.dll: 此时TreeView控件就可以获得如下扩展方法支持: 只需利用其中的SelectItem()方法,传入目标对象即可实现对其选定。 需注意的是,有时候此方法并不起作用,这可能是因为数据变更后UI布局尚未更新导致的,你可以在SelectItem()方法执行之前执行UpdateLayout()方法强制更新一下即可。 分享或转载本博客站点内的所有原创内容时,都必须遵循此协议: 姓名标示-非商业性-相同方式分享 4.0 国际 (CC BY-NC-SA 4.0) 同时必须附加指向本文页面或本博客首页的超...

更多

关于Asp.Net中FileUpload控件属性PostedFile.ContentType的提示

PostedFile.ContentType这个属性通常用来判断上传文件的MIME类型,我们通常以此来拒绝某些类型的上传,比如仅允许上传图像文件,然而这个属性其实是很不稳定的:   MIME类型没有统一 假如我们希望仅允许上传jpg文件,那么通常做法就是判断上传文件的ContentType是否为“image/jpeg”,不是则拒绝,着看起来很简单,但是实际上这个网站通过Chrome浏览和使用时不会有问题,但使用IE(测试时使用的是IE8)上传jpg文件就会遭拒了,经过调试,发现IE上传时的ContentType是“image/pjpeg”。 这还仅限于两个浏览器、一种文件格式的情况,如果是多家浏览器多种文件格式的话,要兼顾就有得头疼了。 在我简单的几下测试中,发现的其他区别有: png文件Chrome提交的ContentType为image/png,而IE提交为image/x-png zip、rar、msi等文件使用Chrome提交的ContentType都为null,IE可以正确获取   可靠性与安全性低 由上一个问...

更多

递归选取扩展方法(RecursionSelect)的新重载形式

RecursionSelect是一个极其方便的扩展方法,使用它仅需少量代码即可完成递归操作,从而大大提升编码速度和质量,此扩展方法在我的代码中被高频使用,这是我之前提供过的一个范例: [TestMethod] public void TestMethod13() { //获取指定目录中所有包含子目录的目录集合 var d = new DirectoryInfo(@”C:UsersPublicDownloads”); var c = d.RecursionSelect(f => f.GetDirectories(), f => f.GetDirectories().Length > 0); MessageBox.Show(c.Count().ToString()); } 此方法源于鹤冲天的这篇文章:http://www.cnblogs.com/ldp615/archive/2009/11/09/1599312.html 我曾在我的这篇文章中分享过我自己的实现版本(即RecursionSelect):http://www.cnblogs.com/SkyD/archive/...

更多