2023年2月

工作一直很忙,很久没有写博客了,有个朋友看过我的代码生成工具,觉得界面不错,随整理了一下界面代码,并加入了皮肤功能,现公布以飨读者。
可能做过Winform界面的朋友都知道,能够实现换肤的控件有很多,但做的比较不错的有如ActiveSkin、SkinCrafter、Irisskin、Skin++等等,不过都是收费的界面控件,这些控件很多来自C++的时代,但由于是OCX控件的方式,所以也可以使用到C#的Winform界面换肤中。
本人做过ActiveSkin、Skin++的界面换肤功能,觉得两者很是相似。现将Skin++的使用实现介绍如下。

1、定义一个Skin++控件变量用来存放。注意,该控件对象只要在主窗体中定义即可,其他派生的界面都会具有相同的皮肤效果。



Code

2、定义一个函数,用于加载相关的皮肤。



Code


在代码中添加
this
.Hide();

this
.Show();
是为了更新界面,否则会出现一些界面效果还停留在原有效果上,这样处理一下就比较好了。

3、其他注意事项:
有时候您的项目代码是强名称的,那么也需要所引用的东西是强名称的才行,Skin++的控件对象默认是没有强名称的,需要强名称的话,那么执行下面的代码进行包装一下即可:



Code


另外要注意的是,如果在各种SKin++的定义皮肤中切换,效果很平滑,也很好,但是如果切换到系统默认的皮肤,总觉得界面有一些效果残留,不太好,因此最好提示软件客户重启软件。

4、界面各种皮肤效果如下

Skin1.jpg

Skin2.jpg

Skin3.jpg

Skin4.jpg

Skin5.jpg

默认没有皮肤的界面
Skin6.jpg

演示程序:
https://files.cnblogs.com/wuhuacong/SkinPlusDemo.rar
感兴趣的可以下载来研究研究,已经包含了上图的各种皮肤文件。

在很多时候,我们需要一个定时器,当间隔某段时间或者在某一个时刻的时候,触发某个业务的处理,这个时候,我们就可能需要引入Windows服务来做这个事情,如某些数据的同步操作、某些工作任务的创建或者侦听某些端口的工作等等。
做过Windows Forms开发的人,对开发Windows服务可能会熟悉一些,其实它本身应该算是一个Windows Forms程序。基本上整个Windows服务的程序分为几个部分:安装操作实现、程序启动、服务操作等。
本例子创建一个Windows服务,服务可以在整点运行,也可以在某段间隔时间运行,通过配置指定相关的参数。
完整的服务代码请下载文件进行学习:
https://files.cnblogs.com/wuhuacong/AutoSyncService.rar

1)安装操作类的实现
首先需要继承System.Configuration.Install.Installer类,并且需要增加ServiceProcessInstaller、ServiceInstaller两个对象来处理,另外您需要重载BeforeUninstall 和 AfterInstall 来实现服务在安装前后的启动和停止操作。
WinserviceInstaller.png



Code



2)程序启动
程序的启动很简单,基本上是自动创建服务程序的时候就生成了,这里列出来解析是为了说明服务调试的操作。
程序的启动是在Main函数里面,添加下面的代码即可



Code


上面是标准的启动代码,但很多时候,我们需要调试服务,因此会加入一个跳转的开关



Code

上面的操作就是为了可以使用普通的调试功能调试Windows服务,其中的"-T"是在开发工具VS的IDE上设置的一个参数, 如下图所示。
WinserviceDebug.png


3)服务操作
首先需要创建一个集成自System.ServiceProcess.ServiceBase的服务类,如SocketService服务类,在SocketService类的构造函数中,您可能需要初始化一些信息,如创建一个定时器,修改服务器类的名称,读取配置参数等信息,以便初始化服务类的参数。
接着您需要重载服务基类的一些函数:OnStart、OnStop、OnContinue、OnPause、OnShutdown和定时器的触发函数timerReAlarm_Elapsed。完整的类如下



Code


4. 使用InstallUtil来安装和卸载服务
安装和卸载Windows服务,需要使用InstallUtil工具类进行操作,该工具是Dotnet框架附带的一个工具,在%SystemRoot%\Microsoft.NET\Framework\*** 对应的目录中。
其中App.config中的内容如下



Code


安装Windows服务的命令如下:


Code


winservice.png
卸载Windows服务的命令如下:



Code

说到QQ,估计中国大半的人都知道,也用过,QQ交友也迅速成为一种时尚,一种生活,乃至一种社会现象。扯远了,呵呵。

说到城市达人,估计很多QQ的用户都会知道,这是腾讯交友平台的一个举措,很多用户的信息都可以查询到,城市达人的网址如下:
http://city.qzone.qq.com/
,里面搜索QQ用户资料估计是一大亮点。因为在不仅在其网站上提供搜索用户信息的功能,更难难可贵的是提供了给外部访问的接口,因此,应运而生出很多QQ交友的软件,交友辅助软件,都是靠城市达人提供的数据接口。

笔者也在这个基础上做了一个QQ资料查询和导出的工具:QQ号码采集及邮件发送系统,QQ号码采集就是利用了城市达人的数据进行整理的。

本文主要介绍如何利用城市达人的外部访问接口,实现QQ数据的获取和解析,分享相关的开发经验,帮助大家了解相关的问题,希望大家创造出更好的QQ应用软件。

下面先看看这个软件的界面。

QQ号码采集及邮件发送系统

撇开邮件发送部分,大家可以看到,QQ的数据可以分页查看,也可以全部条件的数据导出,目前城市达人的数据接口是通过URL地址获取的,地址如下形式:

http://city.qzone.qq.com/json.php?mod=search&act=page&city=440300&age=8&sex=3&page=1

其中的city是城市代码(包含省、城市、地区的代码),age是年龄段,Sex是性别,page是第几页,一般是通过这些条件来获取的

这些数据返回的格式是Json格式的数据,不知道大家做.net有没有听说过,这在Java领域可是很早就出来的概念和应用了。

利用接口第一次获取的时候,返回的数据用包含有这些条件结果的页数、数据等信息,下面我介绍下返回的数据:

数据主要分为两部分,一部份是QQ用户资料,如{"uin":开始的数据,uin就是QQ号码,其他的根据英文就知道具体意思了;另外一部份是结果信息,包含当期页面的页数,总结果的数量和页数等信息,这些对我们非常有用。

如果想利用QQ城市达人接口进行编程,就是解析这些看似怪怪的字符了,它们其实是Json的标准格式,解析这些类型有两种方式,一种是根据这些数据的规律,使用字符定位的方式(如正则表达式等)方式进行提取数据,另外一种方式就是今天要讲的利用.NET的组件,直接将这些数据转换为实体类,一两行代码搞定,呵呵。

解析代码如下:

List
<
QQData
>
entities
=
(List
<
QQData
>
)JavaScriptConvert.DeserializeObject(json,
typeof
(List
<
QQData
>
));

我定义的实体类信息如下:



Code

使用城市达人接口数据几个地方要值得注意:

1)所有的数据是按页返回了,一般一页为10个数据,你如果要返回多页,或者每页返回多条记录,如我上面的软件,那就需要解析返回结果,或者循环查找指定的页面结果数据了。

2)查找多个页面的数据是比较耗费时间的,因此最好放到一个独立的线程处理数据,这样可以提高用户体验

3)使用Json.net的相关组件可以提高处理效率,不用去解析那些鬼怪的的字符,但是要注意的是,实体类的属性或者字段,必须符合返回结果的名称,大小写要统一,否则出错。

4)城市达人返回的中文字符是Unicode字符编码处理过的字符,因此要做相应的解析工作才能正常显示。

5)城市代码是一个很庞大的数据,里面有省份(包括其他国家地区)、城市(如广州)、地区(如天河区)等内容,这些可以找城市达人的页面里面的脚本拿到相关的数据,不过最好的是大家参考我上面说的软件,里面的相关数据我都整理好了,大家可以直接使用。我是基于那些脚本里面的Json格式这里的,至少花费1天的功夫,很辛苦,希望大家不要走老路。呵呵

希望此文对大家有所帮助,谢谢支持。

上面的软件“QQ号码采集及邮件发送系统”详细介绍地址:
http://www.iqidi.com/qqcollector.htm

软件用到的解析Json的类库是Newtonsoft.Json.dll, 大家可以在google里面查询相关的内容介绍,再此提供该压缩文件:
https://files.cnblogs.com/wuhuacong/Newtonsoft.Json.rar

我在上一篇中介绍了如何获取城市达人的资料《
QQ城市达人接口编程及经验分享
》,其中城市达人的信息可以通过Json方式获取数据,然后进行解析的。

除了QQ号码信息,腾讯的QQ群资料也是营销人群中非常重要的,如果能够拿到这些信息,那么也应该是很有意义的,腾讯的QQ群可以通过网址
http://qun.qq.com/
进行查询,可是并没有提供类似城市达人网页中调用的Json脚本连接,而且页面是采用了JQery方式进行解析的,虽然我们看到了数据,但对于获取页面数据毫无用处的,如下图所示。

但是,分析页面文件却毫无所获,是一堆看不懂的脚本文件



Code

这些估计是上面的群信息展示代码。

这样通过Json方式获取数据或者通过分析网页数据,都不能拿到群资料了。

查询QQ群采集的软件,有一个“
QQ群搜索小精灵
”软件好像可以采集数据,不知道其原理如何,甚是奇怪。不知道读者是否有人知道其中原理。如不吝赐教,则感激涕零。

另外发现另外一个非常厉害人物,叫“阿不”,弄了一个“
LumaQQ.NET
”的东西,好像可以提供很多QQ的接口进行使用,通过使用QQ的相关协议来实现如登陆、获取用户列表等用户管理功能、群组管理功能(
奇怪就是没有根据关键字模糊搜索群信息的接口)


LumaQQ.NET
”下载来看看,果然不错,里面有很多有价值的东西,其博客地址为
http://space.cnblogs.com/group/100260
,希望“阿不”继续完善,这样大家做QQ接口编程或者外挂程序,就省力不少了。

言归正题,还是没有能够找到获取群信息的接口或者方法,虽然从隐私保护的角度将,理解腾讯不公开群组资料获取接口的用意,不过,作为开发人员,总是觉得“开放才是硬道理”,大家参与才能丰富软件环境;从另外一个角度讲,目前的“
LumaQQ.NET
”应该也有这个可能,根据协议去查询QQ群的信息,或者企业信息等的,因为我们的QQ有这个功能,接口肯定就可以找得到的。

最后,希望大家能够讨论下群组信息的获取方法。

做共享软件业算起来也有5个年头了,还记得起初是给朋友做的一个送水软件,后来由于某种原因,没有继续合作下去,自己想想做的东西放在那里也是浪费,就修改下作为共享软件作为发布,那时候是2004年,还在学校读研究生课程,时间和热情都是很多。

万事开头难,起步总是很困难,需要处理的事情有很多,如哪里可以上传文件给下载,软件要做好帮助文档,安装要方便,如何推广等等,还有就是如何控制注册等。

1)软件我提交到了华军、天空下载网站,然后自己也申请了一个域名,做了一个网站介绍的。

2)帮助文档没有做过,重新学习如何用HTML HELP Workshop来做帮助文档了,当然也要会使用Hypersnap来截图,DreamWeaver制作网页了。

3)做安装包以前开始也不会,也一步步查资料学习,总算做的还可以,当时好像很开心,毕竟觉得又学会了一些技巧。

4)控制注册就比较麻烦了,开始是用很简单的密码方式,把客户的机器硬件信息(如硬盘序列号、网卡序列号、CPU序列号等)找出来,我当时只是把硬盘序列号拿来用,简单变换下就作为注册码了。现在一般用非对称的加密方式,且一般不用硬盘序列号了,因为格式化了就变了。另外还需要控制用户使用了多久就需要注册才能使用的,这个我找了很久才搞定。

5)然后就是软件的宣传了,可以通过一些论坛或者网站去发表广告信息,增加用户的了解,推广自己的产品。

由于当时送水软件采用.net做的不多,因此他们的界面做的都不太好看,我的好像还不错,呵呵,虽然那时候用的是VS.net2003开发的。

几个月后,软件卖出去了一份,400元,吉林某学校的后勤部,当时收到款狂喜,毕竟是第一桶金,而且当时没有太多的经济来源,现在几百块就没有当时那么开心了。

从此之后,对做共享软件慢慢有了兴趣,特别对代码生成有兴趣,然后研究做了一个SharpCode的东西,能够支持Oracle、SqlServer、Access的数据库的代码生成器,当时是在代码硬编码模版的,做法比较生硬,不过伴随新共享软件的开发,学了不少的知识,如各种数据库的操作和语法需要掌握,记得当时自己机器是没有Oracle,因为自己的配置比较低,只有在导师安排的机器上才有,以及后来在外面干活的时候也有,就逐渐把Oracle的数据库操作和PL-SQL语法也学的差不多了,另外也涉猎了更多的技术。这时候已经到了2005年间了,期间还没有毕业的时候,在外面全职打工,接触了一个C#编写的Winform项目,给了我很多帮助,从中吸收了不少精华代码。

开始做共享软件的时候,也梦想过做国外的软件市场,特别了解了很多相关的讨论,印象最深的是关于周宏伟(不记得是不是这个名字了)的故事,就是目前安全卫生360的老板,当时听说在国外卖共享软件赚了不少,也梦想有这一天,这种机会。因此把自己的软件界面修改了英文的,安装也做成英文的,网站了做了英文版,了解了几个国外的下载网站等,因为找不到门路,也不知道如何操作,尝试得到的是失败。

送水软件和SharpCode偶尔都能卖到一些钱,由于SharpCode是面向开发的,开发人员要掏钱很难,因此没有多少这个软件的收入。

后来自己迷上了代码生成工具的开发,一个是原有的SharpCode不能满足我开发软件的需要,第二是想学习NVelocity这个模版引擎,因此就诞生了Database2Sharp这个代码生成工具,这个是基于模版的,有时候我修改下模版就可以了,不用重新编码。

这个软件是我共享软件的一个里程碑,因为这个软件集合了我太多的期望和技术,而且也是我日常用的最多,修改时间最多的一个,随着参加各个公司项目,项目经验和技术积累越来越多的时候,我就把这些东西加入到我的软件中,更好的辅助我开发。后来我所有的共享软件开发或者公司中的软件开发,不管是Web的还是Winform的,都采用这个工具来辅助开发,效率提高了不少。

Database2Sharp逐渐得到更多的人认可,我偶尔也收到了来自开发人员的褒奖和资助,最重要的,这款软件在我任职的一家公司吸收并采用,并因此获得了年度奖项和奖金,比较惬意。也算是一种认可吧。这个时候主要是完善自己的送水管理软件和这款Database2Sharp软件了,这个是06~07年的事情,期间主要以项目开发为主,比较少开拓新的共享软件了。

下篇继续介绍一些经历了。。。