一个简易命令行解析器的实现

  • 2010年09月1日
  • 20 次阅读

  命令行解析器是很常用的一个模块,很多软件都会用到。但是,由于各类软件的命令行语法各不相同,所以很难写一个通用的达到语义解析级别的解析器。不过,写一个简易的、能提取命令行中各个参数的解析器还是容易的。

  下面实现的这个解析器参考了一些网上开源的代码的命令行语法定义。这个语法基本上是这样的:每个参数用空格字符(广义的)或者终止符来定界,双引号可以用来定界那些具有空格字符的参数(比如路径字符串)和双引号本身。比如:

JGShining "loves" ""Zhuzhu"" for"ev"er

最终被分割为这些参数(用逗号隔开的符号):

JGShining,loves,"Zhuzhu",for"ev"er

  其实这个语法和Windows命令行语法是兼容的。 阅读这个条目剩下部分 »

一种高精度UI定时器的设计与实现

  • 2010年08月12日
  • 72 次阅读

  定时器的设计是一门学问。理想的定时器是高精度的,理想的定时器是低系统资源消耗的,但是软件实现的前提下两者是矛盾的。

  Windows提供了很多种模型的定时器,有些内核线程池方式实现的定时器精度很不错,但是那些不在本文的讨论范围内,本文讨论的是UI定时器。

  说起UI定时器,很多人第一个会想到的就是SetTimer的方法,但是这种方式不但精度不高而且相对较占资源。设计UI定时器比较困难的一点就是不能影响UI线程的高响应性,这使得纯粹轮询之类的方法变得不可行。

  经典的Windows消息驱动程序会使用GetMessage来取消息队列中的消息并同时处理APC任务,但是这个方法取消息的时候,往往伴随着UI线程的挂起操作,在消息队列空闲的情况下,如果没有WM_TIMER的消息来唤醒,那么定时的功能根本不可行。

  PeekMessage提供了非阻塞取消息队列中消息的机制,但是当消息队列为空的时候,如果控制不当,往往会使消息循环空循环从而不必要地大量消耗CPU资源。这就需要用一种方法来判断是否有必要Peek掉队列中的消息,如果没有必要则让UI线程挂起指定的时间,MsgWaitForMultipleObjects(Ex)很好地完成了这个工作。

  下面的代码实现了上面讨论的内容。这个代码比较简单,有很多地方可以改进(比如定时器执行时可能长时间占用锁的问题),但是作为示例用用也无妨。 阅读这个条目剩下部分 »

Global hooking mouse & keyboard is easy…

  • 2010年07月30日
  • 65 次阅读

  很多IM软件都会在用户长时间未响应的时候,自动转为“离开”状态,从而具备很好的用户体验。要实现这个功能,首先就需要探测用户的输入状态,比如用户是否敲击了键盘,是否点击了鼠标等,然后根据探知的状态,智能判断是否需要转换在线状态。探测用户的输入状态,一下子能想到的方法无非也就:

* 轮询设备的状态
* 加全局Hook

  前者技术难度很低,但是在开销和灵敏度之间很难找到平衡,所以一般都采用后面的方法。一般全局Hook的话,都需要写成DLL,但是就是有几类的Hook是不需要写成DLL的,包括键盘、鼠标、输入日志等。用DLL来实现全局Hook的方式一般都会伴随着注入,各个安全软件可能对这种方式会比较敏感,所以用这种方式实现的全局Hook在具有主动防御的机器上用户体验会比较糟糕,而且如果DLL书写不当,往往会导致被注入进程的不稳定。对于键盘之类的全局Hook,Windows采用了另外一种机制,即当Hook条件满足的时候,通过跨进程APC来完成Hook过程,不过这种方式也有缺点,那就是需要不停切换进程上下文。在Vista之前的系统内,利用输入日志记录Hook(最初盗号木马的键盘记录器也是用这个实现的)的方式来实现对用户输入的探测可能是最佳的方式,但是Vista中引入UAC之后,一切都变了,Vista的UI Access Protection让这种方式的使用受到了很大的限制,所以考虑到系统的兼容性,这种方式正在逐渐退出历史舞台。所以,综合来看,一般还是认为在本进程内分别设置全局键盘和鼠标Hook的方式是最优的。

  下面的代码片段完成了一些对键盘和鼠标Hook的操作: 阅读这个条目剩下部分 »

入手M1及初听感受

  • 2010年07月29日
  • 36 次阅读

  之前听过森海、AKG、拜亚的相对平民化的旗舰HD650、K701、DT880和一系列其他耳机、耳塞,自己也有好几个森海的东东以及S01之类的怪胎,但是从没有听过同为四大耳机之一的歌德的东西。所以这次想找个歌德的听听,据说M1是千元以下王者(可能有点夸张,但是既然很多人这么说,那么至少它是“之一”吧),所以好奇心使然,昨天就入了一个。

  M1到手的时候,第一眼看到实物,说实在的,感觉真的很山寨——这哪是一个价值750大洋的东西啊,明明就是一个比地摊上卖的还难看的东西么…不过还好,之前就听说了它的丑,所以虽然这个丑超出了想象,但是还是能接受,毕竟我入它主要是为了在家里欣赏而不是像MX90VC、PX200那样作为出行的装饰之用。

M1

  之前很少听开放式的耳机,所以拆盒后插在公司电脑的德国坦克Aureon 7.1 PCI声卡上时感觉很诧异,因为声音很轻,公司虽然还比较安静,但是还远远没有达到能开放式耳机要求的那种静。Win7 下尝试着将音量开到15,响度够了,但是还是听不到很多细节;再到20,已经很响了,但是细节还是不多;再后大就不试了,因为耳机漏音已经明显会影响到别人了。之前听的耳机或者耳塞,细节都是挺丰富的,一下子啥都没了,还真有点不适应。再加上中频干瘪,低频量少而肥,真有种上当受骗的感觉。这种感觉一直维持到晚上下班后,很多同事都回家了,公司一下子变得很安静,开始比较适合聆听了,这时候,Foobar2000用WASAPI方式播放一张周华健的APE,手头继续敲代码,不知什么时候,突然觉得耳朵一阵感动…对,这个才是真正的流行乐,除了感动还是感动,从来没有听见过这么好听的周华健。自此,M1的感染力初见端倪。 阅读这个条目剩下部分 »

婚纱照Demo

  • 2010年07月17日
  • 83 次阅读

婚纱照

[zz]本山大叔的名言

  • 2010年07月15日
  • 19 次阅读

1、干掉熊猫,我就是国宝!
2、别和我谈理想,戒了!
3、跌倒了,爬起来再哭~~~
4、低调!才是最牛B的炫耀!!
5、不吃饱哪有力气减肥啊?
6、真不好意思,让您贱笑了。
7、我能抵抗一切,除了诱惑……
8、老子不但有车,还是自行的……
9、点的是烟、抽的却是寂寞……
10、不是你不笑,一笑粉就掉!
阅读这个条目剩下部分 »