<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_saptechnique</title><subtitle type="text">Better late than never. - 郭富</subtitle><id>http://feed.cnblogs.com/blog/u/27017/rss</id><updated>2012-02-12T15:15:55Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/27017/rss"/><entry><id>http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348512.html</id><title type="text">移动/联通 2G/3G接入点连接设置教程</title><summary type="text">一、中国移动NET、WAP及彩信设置 （一）中国移动NET 设置 依次点击手机 MENU、设置、无线和网络、移动网络设置、接入点名称、MENU、新建接入点 名称：中国移动NET设置；接入点名称：cmnet；代理：空白；端口：空白；用户名：空白；密码：空白；服务器：空白；MMSC：空白；彩信代理：空白；彩信端口：空白；彩信协议：wap 2.0；MCC：460，MNC：00,；身份验证类型：空白；接入...</summary><published>2012-02-12T15:16:00Z</published><updated>2012-02-12T15:16:00Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><link rel="alternate" href="http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348512.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348512.html"/><content type="html">&lt;p&gt;一、中国移动NET、WAP及彩信设置 &lt;p&gt;（一）中国移动NET 设置 &lt;p&gt;依次点击手机 MENU、设置、无线和网络、移动网络设置、接入点名称、MENU、新建接入点 &lt;p&gt;名称：中国移动NET设置；接入点名称：cmnet；代理：空白；端口：空白；用户名：空白；密码：空白；服务器：空白；MMSC：空白；彩信代理：空白；彩信端口：空白；彩信协议：wap 2.0；MCC：460，MNC：00,；身份验证类型：空白；接入点名称类型：default。 &lt;p&gt;（二）中国移动WAP 设置 &lt;p&gt;名称：中国移动WAP设置；接入点名称：cmwap；代理：10.0.0.172；端口：80；用户名：空白；密码：空白；服务器：空白；MMSC：空白；彩信代理：空白；彩信端口：；彩信协议：wap 2.0；MCC：460，MNC：00,；身份验证类型：空白；接入点名称类型：default。 &lt;p&gt;（三）中国移动彩信设置（收发彩信用） &lt;p&gt;名称：中国移动彩信设置；接入点名称：cmwap；代理：10.0.0.172；端口：80；用户名：空白；密码：空白；服务器：空白；MMSC：http://mmsc.monternet.com；彩信代理：10.0.0.172；彩信端口：80；彩信协议：wap 2.0；MCC：460，MNC：00,；身份验证类型：空白；接入点名称类型：mms 。 &lt;p&gt;二、中国联通3G(2G) NET、WAP及彩信设置 &lt;p&gt;（一） 中国联通3G网络设置 &lt;p&gt;名称：中国联通3G设置；接入点名称：3gnet；代理：空白；端口：空白；用户名：空白；密码：空白；服务器：空白；MMSC：空白；彩信代理：空白；彩信端口：空白；彩信协议：wap 2.0；MCC：460，MNC：01,；身份验证类型：空白；接入点名称类型：default,supl 。 &lt;p&gt;（二） 中国联通3G彩信设置 &lt;p&gt;名称：中国联通3G彩信设置；接入点名称：3gwap；代理：空白；端口：空白；用户名：空白；密码：空白；服务器:空白；MMSC：http://mmsc.myuni.com.cn；彩信代理：10.0.0.172；彩信端口：80；彩信协议：wap 2.0；MCC：460，MNC：01,；身份验证类型：空白；接入点名称类型：mms &lt;p&gt;（三） 中国联通2G NET设置 &lt;p&gt;名称：中国联通2GNET设置；接入点名称：uninet；代理：空白；端口：空白；用户名：空白；密码：空白；服务器：空白；MMSC：空白；彩信代理：空白；彩信端口：空白；彩信协议：wap 2.0；MCC：460，MNC：01,；身份验证类型：空白；接入点名称类型：default &lt;p&gt;（四） 中国联通2G WAP设置 &lt;p&gt;名称：中国联通2GWAP设置；接入点名称：uniwap；代理：10.0.0.172；端口：9201；用户名：空白；密码：空白；服务器：空白；MMSC：空白；彩信代理：空白；彩信端口：空白；彩信协议：wap 2.0；MCC：460，MNC：01,；身份验证类型：空白；接入点名称类型：default &lt;p&gt;（五） 中国联通2G彩信设置 &lt;p&gt;名称：中国联通2G彩信设置；接入点名称：uniwap；代理：10.0.0.172；端口：80；用户名：空白；密码：空白；服务器：空白；MMSC：http://mmsc.myuni.com.cn；彩信代理：10.0.0.172；彩信端口：空白；彩信协议：wap 2.0；MCC：460，MNC：01,；身份验证类型：空白；接入点名称类型：mms &lt;p&gt;&lt;a title="http://www.xker.com/page/e2011/0106/99754.html" href="http://www.xker.com/page/e2011/0106/99754.html"&gt;http://www.xker.com/page/e2011/0106/99754.html&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/saptechnique/aggbug/2348512.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348512.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348329.html</id><title type="text">iOS5.0.1完美越狱教程 iPhone4可越狱了[转]</title><summary type="text">早前放出过 iOS5完美越狱视频的黑客 Pod2g，近日再度放出 iOS5.0.1完美越狱的操作视频，使用的设备为 iPhone4，频中完美越狱后的 iPhone4 手机可以顺利地开、关机。 Pod2g 称：发布这段视频是为了让那些以为完美越狱仅支持旧款 iPod 的用户放心。展示 iOS 5.0.1 在 iPhone 4 完美越狱的情况。 iOS5.0.1完美越狱视频 而近日让人期待已...</summary><published>2012-02-12T13:06:00Z</published><updated>2012-02-12T13:06:00Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><link rel="alternate" href="http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348329.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348329.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 早前放出过 iOS5完美越狱视频的黑客 Pod2g，近日再度放出 iOS5.0.1完美越狱的操作视频，使用的设备为 iPhone4，频中完美越狱后的 iPhone4 手机可以顺利地开、关机。 &lt;p&gt;Pod2g 称：发布这段视频是为了让那些以为完美越狱仅支持旧款 iPod 的用户放心。展示 iOS 5.0.1 在 iPhone 4 完美越狱的情况。 &lt;p&gt;iOS5.0.1完美越狱视频 &lt;p&gt;而近日让人期待已久的iOS5.0 和 iOS5.0.1完美越狱教程终于发布了！广大希望能够完美越狱 iPhone 4 的用户也终于可以摆脱不完美越狱的“羁绊”了。闲话小说，马上为大家奉上 iOS5.0.1完美越狱通教程，让大家轻松完美越狱。 &lt;p&gt;首先要说明的是，可以完美越狱 iOS 5.0.1 / 5.0 的红雪（RedSn0w 0.9.10b5）刚刚放出！目前支持 iPhone 3GS、iPhone 4、iPhone 4-CDMA、iPad 1、iPod touch 3G、iPod touch 4G。 &lt;p&gt;注：新手请勿着急越狱，先仔细看完教程，再按步骤进行 iOS5完美越狱。 &lt;p&gt;&lt;strong&gt;一、iOS 5.0.1完美越狱前注意事项：&lt;/strong&gt; &lt;p&gt;* iPad 2/iPhone4S 版的 iOS 5.0.1 完美越狱已经发布（点击阅读：&lt;a href="http://pcedu.pconline.com.cn/ios/1201/2657990.html"&gt;iPhone4/iPad2/iPhone4S 5.0.1完美越狱教程&lt;/a&gt;）； &lt;p&gt;* 目前iOS 5.0.1 正式版完美越狱已经实现（即关机或重启后无需再次引导进入越狱状态）； &lt;p&gt;* 建议手上是 iOS 4.3.4 或者是 iOS 4.3.5 的童鞋们升级到iOS 5.0.1正式版； &lt;p&gt;*升级 iOS5 后，是无法降级的。 &lt;p&gt;----------------------------------------------------------------------------- &lt;p&gt;&lt;strong&gt;iOS 5.0.1完美越狱前准备事项：&lt;/strong&gt; &lt;p&gt;1、下载对应您手中机器的 iOS 5.0.1正式版固件；&lt;br&gt;&lt;a href="http://bbs.app43.com/thread-22605-1-1.html"&gt;http://bbs.app43.com/thread-22605-1-1.html&lt;/a&gt; &lt;p&gt;2、下载iTunes 10.5.1；&lt;br&gt;&lt;a href="http://dl.pconline.com.cn/html_2/1/123/id=8432&amp;amp;pn=0.html"&gt;http://dl.pconline.com.cn/html_2/1/123/id=8432&amp;amp;pn=0.html&lt;/a&gt; &lt;p&gt;3、下载红雪RedSn0w 0.9.9b3&lt;br&gt;&lt;a href="http://dl.pconline.com.cn/download/90070.html"&gt;http://dl.pconline.com.cn/download/90070.html&lt;/a&gt; &lt;p&gt;4、用iTunes备份好iOS设备的设置和资料。&lt;br&gt;&lt;a href="http://bbs.app43.com/thread-8144-1-1.html"&gt;http://bbs.app43.com/thread-8144-1-1.html&lt;/a&gt; &lt;p&gt;----------------------------------------------------------------------------- &lt;p&gt;注意：以下教程是在【iOS5 不完美越狱】的教程基础上修改的，所以图片中的红雪（RedSn0w）的版本号并非正确，真正支持 iOS5.0.1完美的越狱的红雪（RedSn0w）的版本是【RedSn0w 0.9.10b5】 &lt;p&gt;&lt;strong&gt;二、iOS 5.0.1完美越狱步骤：&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;2.1、iOS 5.0.1完美第一步：&lt;/strong&gt;升级到 iOS 5.0.1正式版 &lt;p&gt;将 iOS 设备链接上电脑，之后进入 DFU 模式（&lt;a href="http://bbs.app43.com/thread-5645-1-1.html"&gt;进入DFU 模式视频教程&lt;/a&gt;），进入DFU 模式可以提高升级成功率。打开 iTunes，按住 Shift 键（Mac 按住 Option 键）点击 Restore 按钮，之后在填出窗口中选择之前下载好的 iOS 5 固件。 &lt;p&gt;&lt;a href="http://www.pconline.com.cn/images/html/viewpic_pconline.htm?http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_02.jpg&amp;amp;channel=6456"&gt;&lt;img title="iOS5越狱教程" alt="iOS5越狱教程" src="http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_02_thumb.jpg"&gt;&lt;/a&gt;&lt;br&gt;图1 载入 iOS5.0.1正式版固件 &lt;p&gt;&lt;strong&gt;2.2、iOS 5.0.1完美第二步：&lt;/strong&gt;检测 iOS 5.0.1固件 &lt;p&gt;iOS5.0.1升级完成后，打开红雪 RedSn0w 0.9.10b1，先点击“Extras”按钮，之后点击“Select IPSW”，在弹出窗口中选择对应的 iOS 5.0.1固件。 &lt;p&gt;注意：理论上 RedSn0w 0.9.10b1 正式支持 iOS5.0.1完美越狱，不需要检测固件，但是以防万一，还是先验证固件！ &lt;p&gt;注：Window 7用户请将红雪RedSn0w 0.9.10b1调教为XP兼容模式。 &lt;p&gt;----------------------------------------------------------------------------- &lt;p&gt;&lt;strong&gt;附上设置方法：&lt;/strong&gt; &lt;p&gt;红雪 RedSn0w 0.9.9b3 设置方法&lt;br&gt;&lt;a href="http://bbs.app43.com/thread-8454-1-1.html"&gt;http://bbs.app43.com/thread-8454-1-1.html&lt;/a&gt; &lt;p&gt;----------------------------------------------------------------------------- &lt;p&gt;&lt;a href="http://www.pconline.com.cn/images/html/viewpic_pconline.htm?http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_03.jpg&amp;amp;channel=6456"&gt;&lt;img title="iOS5越狱教程" alt="iOS5越狱教程" src="http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_03_thumb.jpg"&gt;&lt;/a&gt;&lt;br&gt;图2 启动红雪RedSn0w 0.9.9b3 进行 iOS5.0.1越狱 &lt;p&gt;&lt;a href="http://www.pconline.com.cn/images/html/viewpic_pconline.htm?http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_04.jpg&amp;amp;channel=6456"&gt;&lt;img title="iOS5越狱教程" alt="iOS5越狱教程" src="http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_04_thumb.jpg"&gt;&lt;/a&gt;&lt;br&gt;图3 用红雪载入 iOS5.0.1正式版固件 &lt;p&gt;成功检测 iOS5.0.1正式版固件后，点击“Back”按钮返回红雪RedSn0w 0.9.10b1主画面。 &lt;p&gt;&lt;a href="http://www.pconline.com.cn/images/html/viewpic_pconline.htm?http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_05.jpg&amp;amp;channel=6456"&gt;&lt;img title="iOS5越狱教程" alt="iOS5越狱教程" src="http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_05_thumb.jpg"&gt;&lt;/a&gt;&lt;br&gt;图4 成功检测 iOS5正式版固件 &lt;p&gt;&lt;strong&gt;2.3、iOS 5.0.1完美越狱第三步：&lt;/strong&gt;安装Cydia &lt;p&gt;检测完 iOS5.0.1固件之后，我们就可以开始进行 iOS 5.0.1完美越狱了。在红雪 RedSn0w 0.9.10b1 主界面中，我们点击“Jaibreak”按钮，接着红雪便会自动验证 iOS 5.0.1固件。 &lt;p&gt;&lt;a href="http://www.pconline.com.cn/images/html/viewpic_pconline.htm?http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_06.jpg&amp;amp;channel=6456"&gt;&lt;img title="iOS5越狱教程" alt="iOS5越狱教程" src="http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_06_thumb.jpg"&gt;&lt;/a&gt;&lt;br&gt;图5 启动 Jailbreak &lt;p&gt;等红雪 RedSn0w 0.9.10b1 验证成功之后，勾上“Install Cydia”选项，之后点击“Next”。 &lt;p&gt;&lt;a href="http://www.pconline.com.cn/images/html/viewpic_pconline.htm?http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_07.jpg&amp;amp;channel=6456"&gt;&lt;img title="iOS5越狱教程" alt="iOS5越狱教程" src="http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_07_thumb.jpg"&gt;&lt;/a&gt;&lt;br&gt;图6 安装 Cydia &lt;p&gt;接着 RedSn0w 0.9.10b1 会提示你按照提示进入 DFU 模式（&lt;a href="http://bbs.app43.com/thread-5645-1-1.html"&gt;进入DFU 模式视频教程&lt;/a&gt;），当你成功进入 DFU 模式之后，RedSn0w 0.9.10b1将会自动进行 iOS5.0.1完美越狱。 &lt;p&gt;如果你之前一直都用跟随着 iOS 4.X.X 系列的越狱，那下面这些画面相必你已经很熟悉的了。这时候，你只需等待红雪 RedSn0w 0.9.10b1 完成 Cydia 的安装即可。 &lt;p&gt;&lt;a href="http://www.pconline.com.cn/images/html/viewpic_pconline.htm?http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_09.jpg&amp;amp;channel=6456"&gt;&lt;img title="iOS5越狱教程" alt="iOS5越狱教程" src="http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_09_thumb.jpg"&gt;&lt;/a&gt;&lt;br&gt;图7 完成 Cydia 安装 &lt;p&gt;&lt;strong&gt;2.4、iOS 5.0.1/iOS5.0完美越狱第四步：&lt;/strong&gt;等待Cydia安装完成 &lt;p&gt;当红雪 RedSn0w 0.9.10b1 完成 Cydia 安装之后，iOS 设备将会重启，并会自动开机。开机后就会发现桌面已经多出一个【Cydia】的图标。 &lt;p&gt;请保证在有网络连接的情况下打开Cydia，等待Cydia自动安装完成。Cydia安装完成后会自动注销，至此iOS 5.0.1/5.0 的完美越狱到此完成！ &lt;p&gt;注意：请在英文系统下添加源，否则Cydia还会闪退。或者，Cydia　添加源时闪退不用修改输入法也可解决： &lt;p&gt;方法是：用同步推PC版或 iFunBox 或 iTools&amp;nbsp; 、把/VAR/MOBILE/LIBRERY/KEYBOARD复制到ar/root/Librery/下然后再次进入 Cydia，问题即可解决（感谢网友jams指出） &lt;p&gt;至此 iOS5.0.1越狱达成。 &lt;p&gt;&lt;img title="iOS5越狱教程" alt="iOS5越狱教程" src="http://img0.pconline.com.cn/pconline/1110/11/2551330_iOS-5-GM-Jaibreak_10.jpg"&gt;&lt;br&gt;图8 放心点击“Just boot”吧！ &lt;p&gt;&lt;strong&gt;3.5、iOS 5.0.1完美越狱第五步：&lt;/strong&gt;完善 iOS5.0.1越狱功能 &lt;p&gt;当然，越狱成功后，我们还需要使用 Cydia 安装 AppSync 补丁才可以肆无忌惮的安装海量破解游戏和软件的。 &lt;p&gt;注意：iOS5.0.1请选择 AppSync 5.0版安装（&lt;a href="http://bbs.app43.com/thread-6159-1-1.html"&gt;AppSyc 安装教程&lt;/a&gt;）。 &lt;p&gt;&lt;img title="iOS 4.3.1 完美越狱" alt="iOS 4.3.1 完美越狱" src="http://img0.pconline.com.cn/pconline/1104/07/2380688_iOS_4.3.1_jailbreak_12.jpg"&gt;&lt;br&gt;图9 安装 AppSync &lt;p&gt;&lt;a href="http://www.pconline.com.cn/images/html/viewpic_pconline.htm?http://img0.pconline.com.cn/pconline/1112/27/2634801_152004il3hlcmrlzpsrz5m.jpg&amp;amp;channel=6456"&gt;&lt;img title="iOS5.0完美越狱" alt="iOS5.0完美越狱" src="http://img0.pconline.com.cn/pconline/1112/27/2634801_152004il3hlcmrlzpsrz5m_thumb.jpg"&gt;&lt;/a&gt;&lt;br&gt;iPhone4完美越狱 &lt;p&gt;----------------------------------------------------------------------------- &lt;p&gt;&lt;strong&gt;更多软件资讯：&lt;/strong&gt; &lt;p&gt;iOS5完美越狱教程 图文并茂超级详细!&lt;br&gt;&lt;a href="http://pcedu.pconline.com.cn/ios/1110/2551330.html"&gt;http://pcedu.pconline.com.cn/ios/1110/2551330.html&lt;/a&gt; &lt;p&gt;苹果如何做产品 iOS 5系统开发血泪史！&lt;br&gt;&lt;a href="http://pcedu.pconline.com.cn/ios/1109/2524865.html"&gt;http://pcedu.pconline.com.cn/ios/1109/2524865.html&lt;/a&gt; &lt;p&gt;----------------------------------------------------------------------------- &lt;p&gt;FROM： &lt;p&gt;&lt;a title="http://pcedu.pconline.com.cn/ios/1112/2628556.html" href="http://pcedu.pconline.com.cn/ios/1112/2628556.html"&gt;http://pcedu.pconline.com.cn/ios/1112/2628556.html&lt;/a&gt;&lt;img src="http://www.cnblogs.com/saptechnique/aggbug/2348329.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348329.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348315.html</id><title type="text">iphone4 5.0.1完美越狱教程（RedSn0w 0.9.10b3）[转]</title><summary type="text">iPhone4完美越狱，需要使用最新发布的RedSn0w越狱工具。在升级中，可能会导致基带升级，所以有锁机请注意保留基带，使用自制固件进行升级越狱。 首先，下载iOS5.0.1版本对应设备固件，以及RedSn0w 0.9.10b3版本越狱工具。（如果你的设备已经是iOS5.0.1，则不需要下载固件）。 RedSn0w 0.9.10b3下载地址 iTunes10.5.2下载地址 iOS5.0...</summary><published>2012-02-12T12:55:00Z</published><updated>2012-02-12T12:55:00Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><link rel="alternate" href="http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348315.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348315.html"/><content type="html">&lt;p&gt;iPhone4完美越狱，需要使用最新发布的RedSn0w越狱工具。在升级中，可能会导致基带升级，所以有锁机请注意保留基带，使用自制固件进行升级越狱。 &lt;p&gt;首先，下载iOS5.0.1版本对应设备固件，以及RedSn0w 0.9.10b3版本越狱工具。（如果你的设备已经是iOS5.0.1，则不需要下载固件）。 &lt;p&gt;&lt;a href="http://dl.dbank.com/c0kqi9abfo"&gt;&lt;u&gt;RedSn0w 0.9.10b3下载地址&lt;/u&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://iphone.tgbus.com/software/applesoft/201112/20111213092158.shtml"&gt;&lt;u&gt;iTunes10.5.2下载地址&lt;/u&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://iphone.tgbus.com/software/applesoft/201111/20111111095434.shtml"&gt;&lt;u&gt;iOS5.0.1固件下载地址&lt;/u&gt;&lt;/a&gt; &lt;p&gt;&lt;strong&gt;　　注意：越狱过程中，Redsn0w在设备重启后无法自动检测的（卡在Waiting for reboot步骤），请参照这一教程进行越狱：&lt;a href="http://iphone.tgbus.com/tutorial/hacktutorial/201112/20111229145302.shtml"&gt;&lt;u&gt;&lt;b&gt;iOS 5.0.1完美越狱出现“Waiting for reboot”解决方法&lt;/b&gt;&lt;/u&gt;&lt;/a&gt;&lt;/strong&gt; &lt;p&gt;其他设备详细越狱方法，请看： &lt;p&gt;&lt;a href="http://iphone.tgbus.com/Special/20gujian/"&gt;&lt;u&gt;&lt;b&gt;iPhone中文网破解越狱专题《查看最新越狱破解资讯&lt;/b&gt;&lt;/u&gt;&lt;/a&gt; &lt;p&gt;&lt;a href="http://iphone.tgbus.com/Special/20gujian/"&gt;&lt;u&gt;&lt;b&gt;&lt;/b&gt;&lt;/u&gt;&lt;/a&gt; &lt;p&gt;将iPhone连接到计算机上，打开iTunes，按住Shift点击“恢复”按钮，在弹出的菜单中选择下载的iOS5.0.1固件，将设备升级至iOS5.0.1（在此之前，请备份个人数据。如果设备已经是iOS5.0.1固件，则可以跳过此步）。  &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202239400.jpg"&gt; &lt;p&gt;打开RedSn0w（Win7等用户需要右键选择“以管理员身份运行”），点击“Jailbreak”按钮。 &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202239221.jpg"&gt; &lt;p&gt;将iPhone4连接到电脑上，按住锁机键不放，直到出现滑动关机按钮，关机。 &lt;p&gt;在RedSn0w中单击下一步，按RedSn0w提示，将引导iPhone4进入DFU模式《同时按“Home”和锁机键10秒钟》松开锁机键，保持按住Home键不放，直到RedSn0w检测到设备。 &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202239869.jpg"&gt; &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202239119.jpg"&gt; &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202239274.jpg"&gt; &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202239762.jpg"&gt; &lt;p&gt;RedSn0w将重启机器，并自动进行越狱工作，耐心等待它完成。 &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202239801.jpg"&gt; &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202239261.jpg"&gt; &lt;p&gt;选择“Install Cydia”选项，其他三个选项保持空白，点击下一步。RedSn0w将安装Cydia商店，并完成完美越狱，等待进度条走完，设备将再次重启。 &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202239854.jpg"&gt; &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202239927.jpg"&gt; &lt;p&gt;OK，你现在拥有一台iOS5.0.1的完美越狱iPhone4. &lt;p&gt;&lt;img src="http://iphone.tgbus.com/UploadFiles/201112/20111227202240199.jpg"&gt; &lt;p&gt;越狱完成后，还有一项重要的工作就是在CYIDIA上安装ipa补丁AppSync 5.0+，翻到下一页继续 &lt;p&gt;[NextPage] &lt;p&gt;越狱完成后，还有一项重要的工作就是在CYIDIA上安装ipa补丁AppSync 5.0+ &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811335047.jpg"&gt; &lt;p&gt;第一次进入Cydia程序 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811335039.jpg"&gt; &lt;p&gt;需要选择“用户”，点击右上角“完成” &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811335017.jpg"&gt; &lt;p&gt;选择界面底部的“管理”菜单，选择“软件源”菜单 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811335062.jpg"&gt; &lt;p&gt;点右上角的编辑按钮 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811335044.jpg"&gt; &lt;p&gt;点左上角的“添加”按钮 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811335026.jpg"&gt; &lt;p&gt;输入&lt;a href="http://cydia.hackulo.us/"&gt;http://cydia.hackulo.us&lt;/a&gt;地址，然后点“添加源”按钮，等待载入 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811335052.jpg"&gt;&lt;br&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811335078.jpg"&gt; &lt;p&gt;验证地址后会出现“软件源警告”，选择“仍然添加”。 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811335046.jpg"&gt; &lt;p&gt;这时开始下载源文件和列表清单，途中可能提示出错不用理会，直到他完成，最好不要让屏幕黑掉。 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811335045.jpg"&gt; &lt;p&gt;一旦加入完成，点最下面的“回到Cydia”按钮 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811355931.jpg"&gt; &lt;p&gt;回到之前的页面就看到cydia.hackulo.us源已经加好，点击进入 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811350773.jpg"&gt; &lt;p&gt;如果你没有看到上面的列表，说明有些文件没下载到，需要到变更页刷新一下源列表，请耐心多刷几次，如果刷新多次没有效果就删除刚才添加的源再添加一次。有时候是网络问题或者用的人比较多。 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811350781.jpg"&gt; &lt;p&gt;我们这里选择安装ipa补丁AppSync 5.0+，进入后点击右上角的“安装”。 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811350757.jpg"&gt; &lt;p&gt;点击右上角“确认”安装文件 &lt;p&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811350796.jpg"&gt;&lt;br&gt;&lt;img border="0" hspace="0" alt="" src="http://iphone.tgbus.com/UploadFiles/201112/2011122811350778.jpg"&gt; &lt;p&gt;安装完成以后点击“重启SpringBoard”回到设备主页面，如果回到页面显示不正常，请手动重新启动机器便恢复正常，至此你就可以安装网上下载到的破解以后的ipa软件游戏等应用了。 &lt;p&gt;更多越狱相关内容 &lt;p&gt;&lt;a href="http://iphone.tgbus.com/tutorial/hacktutorial/201112/20111229145302.shtml"&gt;iOS 5.0.1完美越狱出现“Waiting for reboot”解决方法&lt;/a&gt; &lt;p&gt;&lt;a href="http://iphone.tgbus.com/tutorial/hacktutorial/201112/20111229131311.shtml"&gt;iOS 5.0.1完美越狱后iBooks闪退临时解决办法&lt;/a&gt; &lt;p&gt;&lt;a href="http://iphone.tgbus.com/tutorial/hacktutorial/201112/20111227201429.shtml"&gt;iOS 5/iOS 5.0.1完美越狱后必装AppSync补丁教程&lt;/a&gt; &lt;p&gt;&lt;a title="http://iphone.tgbus.com/tutorial/hacktutorial/201112/20111229163638.shtml" href="http://iphone.tgbus.com/tutorial/hacktutorial/201112/20111229163638.shtml"&gt;http://iphone.tgbus.com/tutorial/hacktutorial/201112/20111229163638.shtml&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/saptechnique/aggbug/2348315.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/saptechnique/archive/2012/02/12/2348315.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/saptechnique/archive/2012/02/10/2344888.html</id><title type="text">看看你的密码有多安全？</title><summary type="text">您的密码有多安全？保护在线隐私的第一步就是要创建一个安全的密码，它难以被计算机程序或挖空心思的人在短期内轻易猜中。为帮助您选择安全的密码，我们开发了一种功能，使您可在创建密码后立即直观地了解到密码的安全程度。有关创建安全密码的提示：加入标点符号和/或数字。大小写字母混合。包含外观类似的替代字符，例如用数字“0”替代字母“O”或用“$”替代“S”。创建独一无二的首字母缩写词。包含语音替换，例如“Love to Laugh”替换成“Luv 2 Laf”。需要避免的事项：不要在多个重要的帐户（如 Gmail 和网上银行）中重复使用相同的密码。请勿使用在选取安全密码示例中给出的密码。请勿使用包含个人信</summary><published>2012-02-10T01:58:00Z</published><updated>2012-02-10T01:58:00Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><link rel="alternate" href="http://www.cnblogs.com/saptechnique/archive/2012/02/10/2344888.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/archive/2012/02/10/2344888.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: arial,sans-serif;"&gt;&lt;strong&gt;您的密码有多安全？&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;保护在线隐私的第一步就是要创建一个安全的密码，它难以被计算机程序或挖空心思的人在短期内轻易猜中。为帮助您选择安全的密码，我们开发了一种功能，使您可在创建密码后立即直观地了解到密码的安全程度。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;有关创建安全密码的提示：&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;span style="font-family: arial,sans-serif;"&gt;加入标点符号和/或数字。&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;大小写字母混合。&lt;/li&gt;&#xD;
&lt;li&gt;包含外观类似的替代字符，例如用数字&amp;ldquo;0&amp;rdquo;替代字母&amp;ldquo;O&amp;rdquo;或用&amp;ldquo;$&amp;rdquo;替代&amp;ldquo;S&amp;rdquo;。&lt;/li&gt;&#xD;
&lt;li&gt;创建独一无二的首字母缩写词。&lt;/li&gt;&#xD;
&lt;li&gt;包含语音替换，例如&amp;ldquo;Love to Laugh&amp;rdquo;替换成&amp;ldquo;Luv 2 Laf&amp;rdquo;。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span  style="widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; letter-spacing: normal; font: medium arial, sans-serif; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"&gt;&lt;span  style="widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; letter-spacing: normal; font: medium arial, sans-serif; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"&gt;&lt;span style="font-family: arial,sans-serif;"&gt;&lt;strong&gt;需要避免的事项：&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;不要在多个重要的帐户（如 Gmail 和网上银行）中重复使用相同的密码。&lt;/li&gt;&#xD;
&lt;li&gt;请勿使用在选取安全密码示例中给出的密码。&lt;/li&gt;&#xD;
&lt;li&gt;请勿使用包含个人信息（姓名、出生日期等）的密码&lt;/li&gt;&#xD;
&lt;li&gt;请勿使用可以在词典中找到的词或缩写词。&lt;/li&gt;&#xD;
&lt;li&gt;不要使用同键盘布局一致的形式 (asdf) 或连续数字 (1234)。&lt;/li&gt;&#xD;
&lt;li&gt;不要全部使用数字、大写字母或小写字母作为密码。&lt;/li&gt;&#xD;
&lt;li&gt;不要使用重复字符 (aa11)。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;span  style="widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; letter-spacing: normal; font: medium arial, sans-serif; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"&gt;&lt;span  style="widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; letter-spacing: normal; font: medium arial, sans-serif; white-space: normal; orphans: 2; color: #000000; word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"&gt;&lt;span style="font-family: arial,sans-serif;"&gt;&lt;strong&gt;保障密码安全的技巧：&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;请勿将您的密码告诉任何人（包括至交、室友、快嘴朋友等等）。&lt;/li&gt;&#xD;
&lt;li&gt;请勿写下密码。&lt;/li&gt;&#xD;
&lt;li&gt;不要使用电子邮件发送密码。&lt;/li&gt;&#xD;
&lt;li&gt;定期测试您的当前密码并进行更改。&lt;/li&gt;&#xD;
&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/saptechnique/aggbug/2344888.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/saptechnique/archive/2012/02/10/2344888.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/saptechnique/archive/2012/02/04/2337811.html</id><title type="text">C# 轻松实现对窗体（Form）换肤[转]</title><summary type="text">打下广告：窗体换肤高级版本可以从这里获取。高级版本可以实现XML文件更换皮肤、实现了用图片绘制皮肤。一直想写一个比较完整的、容易扩展的窗体换肤的方案，由于时间问题，都没去实现这个想法。现在有朋友提出需要，就把以前写的重新拿出来看了一篇，花了些时间，做出了现在的这个换肤的方案。实现的过程中遇到了不少问题，但还是解决了，虽然也许还有些缺陷，但也算是比较完善了。现在只实现了完全代码绘制的SkinFormProfessionalRenderer，接下来有时间会写一个SkinFormImageRenderer，实现只要做好图片就可以换肤。在这先里发一下牢骚，最近看到很多网站转载了截图控件那几篇文章，但是</summary><published>2012-02-04T03:15:00Z</published><updated>2012-02-04T03:15:00Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><link rel="alternate" href="http://www.cnblogs.com/saptechnique/archive/2012/02/04/2337811.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/archive/2012/02/04/2337811.html"/><content type="html">&lt;div &gt;&#xD;
&lt;p&gt;&lt;strong&gt;打下广告：窗体换肤高级版本可以&lt;a href="http://starts2000.taobao.com/"&gt;从这里获取&lt;/a&gt;。高级版本可以实现XML文件更换皮肤、实现了用图片绘制皮肤。&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;一直想写一个比较完整的、容易扩展的窗体换肤的方案，由于时间问题，都没去实现这个想法。现在有朋友提出需要，就把以前写的重新拿出来看了一篇，花了些时间，做出了现在的这个换肤的方案。实现的过程中遇到了不少问题，但还是解决了，虽然也许还有些缺陷，但也算是比较完善了。现在只实现了完全代码绘制的SkinFormProfessionalRenderer，接下来有时间会写一个SkinFormImageRenderer，实现只要做好图片就可以换肤。&lt;/p&gt;&#xD;
&lt;p&gt;在这先里发一下牢骚，最近看到很多网站转载了截图控件那几篇文章，但是版权声明、作者信息都去掉了，说实话，心里很不爽，这些文章和代码都是我辛辛苦苦的花了不少时间写出来的，我也没有不允许转载，但是你转载的时候为什么还要把作者信息去掉呢，请你尊重一下作者的劳动好吗？发完牢骚，先来看一下窗体换肤后的效果吧。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;input type="text" src="http://www.cnblogs.com/upload/SkinFormDemo.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;input type="text" src="http://www.cnblogs.com/upload/SkinFormDemo1.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;看完效果，来看看SkinForm的实现原理：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、 把Form设置为无标题栏窗口。&lt;/p&gt;&#xD;
&lt;p&gt;2、 为了使Form可以像标准的Windows窗体那样拥有系统菜单和拖动改变窗体大小，加入WS_THICKFRAME和WS_SYSMENU窗体样式。&lt;/p&gt;&#xD;
&lt;p&gt;3、 处理相应得窗体消息，实现窗体的标准操作。&lt;/p&gt;&#xD;
&lt;p&gt;4、 实现SkinFormRenderer，绘制窗体的标题栏、边框、按钮等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;原理只做简单介绍，要详细说明，那得写很多东西了，介绍一下SkinForm中加入的几个属性的功能：&lt;/p&gt;&#xD;
&lt;p&gt;1、 BorderWidth，设置或获取窗体的边框的宽度。&lt;/p&gt;&#xD;
&lt;p&gt;2、 CanResize：设置或获取窗体是否可以改变大小。&lt;/p&gt;&#xD;
&lt;p&gt;3、 CaptionFont：设置或获取窗体标题的字体。&lt;/p&gt;&#xD;
&lt;p&gt;4、 CapntionHeight：设置或获取窗体标题栏的高度。&lt;/p&gt;&#xD;
&lt;p&gt;5、 CloseBoxSize：设置或获取关闭按钮的大小。&lt;/p&gt;&#xD;
&lt;p&gt;6、 MinimizeBoxSize：设置或获取最小化按钮的大小。&lt;/p&gt;&#xD;
&lt;p&gt;7、 MaximizeBoxSize：设置或获取最大化（还原）按钮的大小。&lt;/p&gt;&#xD;
&lt;p&gt;8、 ControlBoxOffset：设置或获取控制按钮的偏移。&lt;/p&gt;&#xD;
&lt;p&gt;9、 ControlBoxSpace：设置或获取控制按钮的间距。&lt;/p&gt;&#xD;
&lt;p&gt;10、 RoundStyle：设置或获取窗体的圆角样式。&lt;/p&gt;&#xD;
&lt;p&gt;11、 Radius：设置或获取窗体的圆角的大小。&lt;/p&gt;&#xD;
&lt;p&gt;12、 Renderer：设置或获取窗体的绘制方法。&lt;/p&gt;&#xD;
&lt;p&gt;接下来介绍窗体的绘制类SkinFormRenderer，这是比较重要的类，它是一个抽象类，重写它里面的绘制方法，就可以得到新的窗体皮肤。这个类里面主要有几个抽象方法：&lt;/p&gt;&#xD;
&lt;p&gt;1、 CreateRegion：创建一个Region，提供给SkinForm使用。&lt;/p&gt;&#xD;
&lt;p&gt;2、 OnRenderSkinFormCaption：绘制窗体标题栏。&lt;/p&gt;&#xD;
&lt;p&gt;3、 OnRenderSkinFormBorder：绘制窗体边框。&lt;/p&gt;&#xD;
&lt;p&gt;4、 OnRenderSkinFormBackground：绘制窗体背景。&lt;/p&gt;&#xD;
&lt;p&gt;5、 OnRenderSkinFormControlBox：绘制窗体控制按钮（最小化、最大化、关闭）；&lt;/p&gt;&#xD;
&lt;p&gt;看看SkinFormRenderer的完整代码：&lt;/p&gt;&#xD;
&lt;div&gt;public abstract class SkinFormRenderer &lt;br /&gt;...{ &lt;br /&gt;Fields#region Fields &lt;br /&gt;&lt;br /&gt;private EventHandlerList _events; &lt;br /&gt;&lt;br /&gt;private static readonly object EventRenderSkinFormCaption = new object(); &lt;br /&gt;private static readonly object EventRenderSkinFormBorder = new object(); &lt;br /&gt;private static readonly object EventRenderSkinFormBackground = new object(); &lt;br /&gt;private static readonly object EventRenderSkinFormControlBox = new object(); &lt;br /&gt;&lt;br /&gt;#endregion &lt;br /&gt;&lt;br /&gt;Constructors#region Constructors &lt;br /&gt;&lt;br /&gt;protected SkinFormRenderer() &lt;br /&gt;...{ &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;#endregion &lt;br /&gt;&lt;br /&gt;Properties#region Properties &lt;br /&gt;&lt;br /&gt;protected EventHandlerList Events &lt;br /&gt;...{ &lt;br /&gt;get &lt;br /&gt;...{ &lt;br /&gt;if (_events == null) &lt;br /&gt;...{ &lt;br /&gt;_events = new EventHandlerList(); &lt;br /&gt;} &lt;br /&gt;return _events; &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;#endregion &lt;br /&gt;&lt;br /&gt;Events#region Events &lt;br /&gt;&lt;br /&gt;public event SkinFormCaptionRenderEventHandler RenderSkinFormCaption &lt;br /&gt;...{ &lt;br /&gt;add ...{ AddHandler(EventRenderSkinFormCaption, value); } &lt;br /&gt;remove ...{ RemoveHandler(EventRenderSkinFormCaption, value); } &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;public event SkinFormBorderRenderEventHandler RenderSkinFormBorder &lt;br /&gt;...{ &lt;br /&gt;add ...{ AddHandler(EventRenderSkinFormBorder, value); } &lt;br /&gt;remove ...{ RemoveHandler(EventRenderSkinFormBorder, value); } &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;public event SkinFormBackgroundRenderEventHandler RenderSkinFormBackground &lt;br /&gt;...{ &lt;br /&gt;add ...{ AddHandler(EventRenderSkinFormBackground, value); } &lt;br /&gt;remove ...{ RemoveHandler(EventRenderSkinFormBackground, value); } &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;public event SkinFormControlBoxRenderEventHandler RenderSkinFormControlBox &lt;br /&gt;...{ &lt;br /&gt;add ...{ AddHandler(EventRenderSkinFormControlBox, value); } &lt;br /&gt;remove ...{ RemoveHandler(EventRenderSkinFormControlBox, value); } &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;#endregion &lt;br /&gt;&lt;br /&gt;Public Methods#region Public Methods &lt;br /&gt;&lt;br /&gt;public abstract Region CreateRegion(SkinForm form); &lt;br /&gt;&lt;br /&gt;public abstract void InitSkinForm(SkinForm form); &lt;br /&gt;&lt;br /&gt;public void DrawSkinFormCaption( &lt;br /&gt;SkinFormCaptionRenderEventArgs e) &lt;br /&gt;...{ &lt;br /&gt;OnRenderSkinFormCaption(e); &lt;br /&gt;SkinFormCaptionRenderEventHandler handle = &lt;br /&gt;Events[EventRenderSkinFormCaption] &lt;br /&gt;as SkinFormCaptionRenderEventHandler; &lt;br /&gt;if (handle != null) &lt;br /&gt;...{ &lt;br /&gt;handle(this, e); &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void DrawSkinFormBorder( &lt;br /&gt;SkinFormBorderRenderEventArgs e) &lt;br /&gt;...{ &lt;br /&gt;OnRenderSkinFormBorder(e); &lt;br /&gt;SkinFormBorderRenderEventHandler handle = &lt;br /&gt;Events[EventRenderSkinFormBorder] &lt;br /&gt;as SkinFormBorderRenderEventHandler; &lt;br /&gt;if (handle != null) &lt;br /&gt;...{ &lt;br /&gt;handle(this, e); &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public void DrawSkinFormBackground( &lt;br /&gt;SkinFormBackgroundRenderEventArgs e) &lt;br /&gt;...{ &lt;br /&gt;OnRenderSkinFormBackground(e); &lt;br /&gt;SkinFormBackgroundRenderEventHandler handle = &lt;br /&gt;Events[EventRenderSkinFormBackground] &lt;br /&gt;as SkinFormBackgroundRenderEventHandler; &lt;br /&gt;if (handle != null) &lt;br /&gt;...{ &lt;br /&gt;handle(this, e); &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;public void DrawSkinFormControlBox( &lt;br /&gt;SkinFormControlBoxRenderEventArgs e) &lt;br /&gt;...{ &lt;br /&gt;OnRenderSkinFormControlBox(e); &lt;br /&gt;SkinFormControlBoxRenderEventHandler handle = &lt;br /&gt;Events[EventRenderSkinFormControlBox] &lt;br /&gt;as SkinFormControlBoxRenderEventHandler; &lt;br /&gt;if (handle != null) &lt;br /&gt;...{ &lt;br /&gt;handle(this, e); &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;#endregion &lt;br /&gt;&lt;br /&gt;Protected Render Methods#region Protected Render Methods &lt;br /&gt;&lt;br /&gt;protected abstract void OnRenderSkinFormCaption( &lt;br /&gt;SkinFormCaptionRenderEventArgs e); &lt;br /&gt;&lt;br /&gt;protected abstract void OnRenderSkinFormBorder( &lt;br /&gt;SkinFormBorderRenderEventArgs e); &lt;br /&gt;&lt;br /&gt;protected abstract void OnRenderSkinFormBackground( &lt;br /&gt;SkinFormBackgroundRenderEventArgs e); &lt;br /&gt;&lt;br /&gt;protected abstract void OnRenderSkinFormControlBox( &lt;br /&gt;SkinFormControlBoxRenderEventArgs e); &lt;br /&gt;&lt;br /&gt;#endregion &lt;br /&gt;&lt;br /&gt;Protected Methods#region Protected Methods &lt;br /&gt;&lt;br /&gt;[UIPermission(SecurityAction.Demand, Window = UIPermissionWindow.AllWindows)] &lt;br /&gt;protected void AddHandler(object key, Delegate value) &lt;br /&gt;...{ &lt;br /&gt;Events.AddHandler(key, value); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;[UIPermission(SecurityAction.Demand, Window = UIPermissionWindow.AllWindows)] &lt;br /&gt;protected void RemoveHandler(object key, Delegate value) &lt;br /&gt;...{ &lt;br /&gt;Events.RemoveHandler(key, value); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;#endregion &lt;br /&gt;}&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在项目中实现了SkinFormProfessionalRenderer类，这个类实现了类似QQ2008的窗体的绘制，效果就是文章开始那贴出来的图了。还有一些其他辅助功能的类就不一一介绍了，接下来有时间，我会实现一个SkinFormImageRenderer绘制类，敬请大家关注。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;&lt;strong&gt;声明：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p align="left"&gt;本文版权归作者和CS 程序员之窗所有，欢迎转载，转载必须保留以下版权信息，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;作者：Starts_2000&lt;/p&gt;&#xD;
&lt;p align="left"&gt;出处：CS 程序员之窗 &lt;a href="http://www.csharpwin.com/"&gt;http://www.csharpwin.com&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p align="left"&gt;你可以免费使用或修改提供的源代码，但请保留源代码中的版权信息，详情请查看：&lt;/p&gt;&#xD;
&lt;p&gt;CS程序员之窗开源协议 &lt;a href="http://www.csharpwin.com/csol.html"&gt;http://www.csharpwin.com/csol.html&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;br /&gt;&#xD;
&lt;table  cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  align="center"&gt;序号&lt;/td&gt;&#xD;
&lt;td  align="center"&gt;附件标题&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  align="center"&gt;1&lt;/td&gt;&#xD;
&lt;td  align="center"&gt;&lt;a title="SkinFormDemo 源码、示例下载" href="http://www.csharpwin.com/accessorydirect.aspx?DID=2992&amp;amp;AID=1" target="_blank"&gt;SkinFormDemo 源码、示例下载&lt;/a&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div &gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table  cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr &gt;&#xD;
&lt;td &gt;文章ID&lt;/td&gt;&#xD;
&lt;td &gt;标题&lt;/td&gt;&#xD;
&lt;td &gt;录入时间&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td  align="center"&gt;2992&lt;/td&gt;&#xD;
&lt;td  align="center"&gt;&lt;a title="C# 轻松实现对窗体（Form）换肤" href="http://www.csharpwin.com/csharpresource/2992.shtml" target="_blank"&gt;C# 轻松实现对窗体（Form）换肤&lt;/a&gt;&lt;/td&gt;&#xD;
&lt;td  align="center"&gt;2009年09月25日&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div&gt;作者：starts&lt;/div&gt;&#xD;
&lt;div&gt;文章来源：&lt;/div&gt;&#xD;
&lt;div&gt;&lt;a href="http://www.csharpwin.com/csharpresource/2992.shtml"&gt;http://www.csharpwin.com/csharpresource/2992.shtml&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/saptechnique/aggbug/2337811.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/saptechnique/archive/2012/02/04/2337811.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/saptechnique/archive/2012/01/30/2331872.html</id><title type="text">在VC中用GDI+绘制角度可变的颜色渐变效果-.NET教程,VB.Net语言[转]</title><summary type="text">在VC中用GDI+绘制角度可变的颜色渐变效果-.NET教程,VB.Net语言 作者：网友供稿 点击：4 gdi+ 是gdi（windows 早期版本提供的图形设备接口）的后续版本，是microsoft windows xp作系统即后续版本的图形显示技术。它已经集成到了.net开发环境中，所以不管你的os是什么版本，只要安装了.net框架，就有了gdi+（注意：是.net框架，而不是.net开...</summary><published>2012-01-30T06:06:00Z</published><updated>2012-01-30T06:06:00Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><link rel="alternate" href="http://www.cnblogs.com/saptechnique/archive/2012/01/30/2331872.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/archive/2012/01/30/2331872.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;b&gt;在VC中用GDI+绘制角度可变的颜色渐变效果-.NET教程,VB.Net语言&lt;/b&gt;&lt;/strong&gt; &lt;p&gt;&lt;b&gt;作者&lt;/b&gt;：网友供稿 点击：4  &lt;p&gt;&lt;img src="http://www.west263.com/images/sp_05.gif" width="1" height="1"&gt; &lt;p&gt;gdi+ 是gdi（windows 早期版本提供的图形设备接口）的后续版本，是microsoft windows xp作系统即后续版本的图形显示技术。它已经集成到了.net开发环境中，所以不管你的os是什么版本，只要安装了.net框架，就有了gdi+（注意：是.net框架，而不是.net开发环境，所以win98中也可以使用gdi+）。  &lt;p&gt;现在，言归正传。 &lt;p&gt;在头文件中加入下面的代码： &lt;p&gt;#include &amp;lt;gdiplus.h&amp;gt;&lt;br&gt;using namespace gdiplus;&lt;br&gt;#pragma comment(lib,"gdiplus.lib") &lt;p&gt;注意：在使用gdi+函数时必须进行gdi+的初始化，使用完毕要销毁gdi+！&lt;br&gt;初始化： &lt;p&gt;gdiplusstartupinput gdiplusstartupinput; &lt;br&gt;ulong_ptr gdiplustoken; &lt;br&gt;gdiplusstartup(&amp;amp;gdiplustoken, &amp;amp;gdiplusstartupinput, null);  &lt;p&gt;销毁： &lt;p&gt;ulong_ptr gdiplustoken = null; &lt;br&gt;gdiplusshutdown(gdiplustoken); &lt;p&gt;下面以给一个ctestdlg的对话框绘制背景为例子，用gdi+实现角度可变的颜色渐变效果。用到的变量：&lt;br&gt;irotation：整型，渐变色的角度&lt;br&gt;color1、color2、color3：rgb颜色值 &lt;p&gt;两种颜色的比较简单，直接用gdi+提供的lineargradientbrush刷子就行了： &lt;p&gt;&lt;img alt="" align="middle" src="http://blog.csdn.net/images/blog_csdn_net/starlee/178527/o_1.jpg" width="486" height="350"&gt; &lt;p&gt;bool ctestdlg::onerasebkgnd(cdc* pdc)&lt;br&gt;{&lt;br&gt;cdialog::onerasebkgnd(pdc);  &lt;p&gt;// 取得第一种颜色的r，g，b值&lt;br&gt;int r1 = getrvalue(color1);&lt;br&gt;int g1 = getgvalue(color1);&lt;br&gt;int b1 = getbvalue(color1); &lt;p&gt;// 取得第二种颜色的r，g，b值&lt;br&gt;int r2 = getrvalue(color2);&lt;br&gt;int g2 = getgvalue(color2);&lt;br&gt;int b2 = getbvalue(color2); &lt;p&gt;// 得到绘制区域&lt;br&gt;crect rect;&lt;br&gt;getclientrect(&amp;amp;rect); &lt;p&gt;// gdi+对象&lt;br&gt;gdiplus::graphics graphics(pdc-&amp;gt;getsafehdc()); &lt;br&gt;// 刷子&lt;br&gt;gdiplus::lineargradientbrush lingrbrush(gdiplus::rect(0, 0, rect.width(), rect.height()), // 绘制区域&lt;br&gt;gdiplus::color(255, r1, g1, b1), // 第一种颜色&lt;br&gt;gdiplus::color(255, r2, g2, b2), // 第二种颜色 &lt;br&gt;(gdiplus::real)(90 - irotation)); // 渐变色的角度 &lt;p&gt;graphics.fillrectangle(&amp;amp;lingrbrush, gdiplus::rect(0, 0, rect.width(), rect.height()));&lt;br&gt;return true;&lt;br&gt;} &lt;p&gt;三种颜色比较复杂，也是用gdi+提供的lineargradientbrush刷子，不过需要计算绘制区域的对角线长度，并按照对角线平分为三等分。 &lt;p&gt;&lt;img alt="" src="http://blog.csdn.net/images/blog_csdn_net/starlee/178527/o_2.jpg" width="486" height="350"&gt; &lt;p&gt;具体的看以下代码： &lt;p&gt;bool ctestdlg::onerasebkgnd(cdc* pdc)&lt;br&gt;{&lt;br&gt;cdialog::onerasebkgnd(pdc);  &lt;p&gt;// 取得第一种颜色的r，g，b值&lt;br&gt;int r1 = getrvalue(color1);&lt;br&gt;int g1 = getgvalue(color1);&lt;br&gt;int b1 = getbvalue(color1); &lt;p&gt;// 取得第二种颜色的r，g，b值&lt;br&gt;int r2 = getrvalue(color2);&lt;br&gt;int g2 = getgvalue(color2);&lt;br&gt;int b2 = getbvalue(color2); &lt;p&gt;// 取得第三种颜色的r，g，b值&lt;br&gt;int r3 = getrvalue(color3);&lt;br&gt;int g3 = getgvalue(color3);&lt;br&gt;int b3 = getbvalue(color3); &lt;p&gt;// 得到绘制区域&lt;br&gt;crect rect;&lt;br&gt;getclientrect(&amp;amp;rect); &lt;p&gt;// 计算对角线长度&lt;br&gt;int iheight = rect.height();&lt;br&gt;int iwidth = rect.width();&lt;br&gt;double dwdiagonal = sqrt((double)(iwidth * iwidth + iheight * iheight)); &lt;p&gt;// 三块绘制区域&lt;br&gt;rect rectdraw(0, 0, (int)dwdiagonal, (int)dwdiagonal);&lt;br&gt;rect rectdraw1(0, 0, (int)dwdiagonal, ((int)dwdiagonal)/2);&lt;br&gt;rect rectdraw2(0, ((int)dwdiagonal) / 2, (int)dwdiagonal, ((int)dwdiagonal) / 2); &lt;p&gt;// gdi+对象&lt;br&gt;graphics graphics(pdc-&amp;gt;getsafehdc()); &lt;br&gt;gdiplus::bitmap bmp(rectdraw.width, rectdraw.height);&lt;br&gt;graphics grtmp(&amp;amp;bmp); &lt;p&gt;// 用刷子填充区域&lt;br&gt;gdiplus::lineargradientbrush lingrbrush(rectdraw1, color(r1, g1, b1), color(r2, g2, b2), 90);&lt;br&gt;grtmp.fillrectangle(&amp;amp;lingrbrush, rectdraw1);&lt;br&gt;gdiplus::lineargradientbrush lingrbrush1(rectdraw2, color(r2, g2, b2),color(r3, g3, b3), 90);&lt;br&gt;grtmp.fillrectangle(&amp;amp;lingrbrush1, rectdraw2); &lt;p&gt;// 计算&lt;br&gt;dwdiagonal *= 0.5;&lt;br&gt;double dwangle = irotation * 3.1415926 / 180.0;&lt;br&gt;double dwcosangle = cos(dwangle);&lt;br&gt;double dwsinangle = sin(dwangle);&lt;br&gt;double dwbeta = atan2((double)iheight, (double)iwidth);&lt;br&gt;double dwdistance = dwdiagonal * sin(fabs(dwangle) + dwbeta);&lt;br&gt;double xc = 0.5 * iwidth - dwdistance * dwsinangle;&lt;br&gt;double yc = 0.5 * iheight - dwdistance * dwcosangle;&lt;br&gt;double xc1 = 0.5 * iwidth + dwdistance * dwsinangle;&lt;br&gt;double yc1 = 0.5 * iheight + dwdistance * dwcosangle;&lt;br&gt;double dx = dwdiagonal * dwcosangle;&lt;br&gt;double dy = - dwdiagonal * dwsinangle; &lt;p&gt;// 绘制&lt;br&gt;point ptdestinationpoints[3];&lt;br&gt;ptdestinationpoints[0].x = (int)(xc - dx);&lt;br&gt;ptdestinationpoints[0].y = (int)(yc - dy);&lt;br&gt;ptdestinationpoints[1].x = (int)(xc + dx);&lt;br&gt;ptdestinationpoints[1].y = (int)(yc + dy);&lt;br&gt;ptdestinationpoints[2].x = (int)(xc1 - dx);&lt;br&gt;ptdestinationpoints[2].y = (int)(yc1 - dy);&lt;br&gt;graphics.drawimage(&amp;amp;bmp, ptdestinationpoints, 3);  &lt;p&gt;return true;&lt;br&gt;} &lt;p&gt;&lt;img border="0" src="http://www.west263.com/www/down_info.asp?id=40780" width="1" height="1"&gt;&lt;a title="http://www.west263.com/www/info/40780-1.htm" href="http://www.west263.com/www/info/40780-1.htm"&gt;http://www.west263.com/www/info/40780-1.htm&lt;/a&gt;&lt;img src="http://www.cnblogs.com/saptechnique/aggbug/2331872.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/saptechnique/archive/2012/01/30/2331872.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/saptechnique/archive/2012/01/29/2330963.html</id><title type="text">c# 中判断用户是否按下CTRL键</title><summary type="text">在WINFORM编程过程中，经常会让用户使用组合键。我们可以根据Control.ModifierKeys来判断用户是否按下了组合键。代码如下。if ((Control.ModifierKeys &amp;amp; Keys.Control) == Keys.Control) { MessageBox.Show(&amp;quot;Ctrl健被按下&amp;quot;); }</summary><published>2012-01-29T03:16:00Z</published><updated>2012-01-29T03:16:00Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><link rel="alternate" href="http://www.cnblogs.com/saptechnique/archive/2012/01/29/2330963.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/archive/2012/01/29/2330963.html"/><content type="html">&lt;p&gt;在WINFORM编程过程中，经常会让用户使用组合键。&lt;/p&gt;&#xD;
&lt;p&gt;我们可以根据Control.ModifierKeys来判断用户是否按下了组合键。&lt;/p&gt;&#xD;
&lt;p&gt;代码如下。&lt;/p&gt;&#xD;
&lt;p&gt;if ((Control.ModifierKeys &amp;amp; Keys.Control) == Keys.Control) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show("Ctrl健被按下"); &lt;br /&gt;}&lt;/p&gt;&lt;img src="http://www.cnblogs.com/saptechnique/aggbug/2330963.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/saptechnique/archive/2012/01/29/2330963.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/saptechnique/archive/2012/01/15/2323005.html</id><title type="text">C#双击非客户区关闭窗体[转]</title><summary type="text">重写窗口过程处理WM_NCLBUTTONDBLCLK消息：privateconstint WM_NCLBUTTONDBLCLK = 0xA3; .. protectedoverridevoid WndProc(ref Message m) { if (m.Msg == WM_NCLBUTTONDBLCLK) this.Close(); base.WndProc(ref m); } 还有个软件提一下，win32编程的法宝哦，APIViewer：来源：http://xcf007.blog.51cto.com/471707/435026</summary><published>2012-01-15T10:14:00Z</published><updated>2012-01-15T10:14:00Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><link rel="alternate" href="http://www.cnblogs.com/saptechnique/archive/2012/01/15/2323005.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/archive/2012/01/15/2323005.html"/><content type="html">&lt;p&gt;重写窗口过程处理WM_NCLBUTTONDBLCLK消息：&lt;/p&gt;&#xD;
&lt;ol &gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span &gt;const&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt; WM_NCLBUTTONDBLCLK = 0xA3; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;.. &lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;protected&lt;/span&gt;&lt;span &gt;override&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt; WndProc(&lt;/span&gt;&lt;span &gt;ref&lt;/span&gt;&lt;span&gt; Message m) &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;{ &lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt; (m.Msg == WM_NCLBUTTONDBLCLK) &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.Close(); &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li &gt;&lt;span&gt;&lt;span &gt;base&lt;/span&gt;&lt;span&gt;.WndProc(&lt;/span&gt;&lt;span &gt;ref&lt;/span&gt;&lt;span&gt; m); &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;} &lt;/span&gt;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;还有个软件提一下，win32编程的法宝哦，APIViewer：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://img1.51cto.com/attachment/201011/094756456.jpg" target="_blank"&gt;&lt;img src="http://img1.51cto.com/attachment/201011/094756456.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;来源：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://xcf007.blog.51cto.com/471707/435026"&gt;http://xcf007.blog.51cto.com/471707/435026&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/saptechnique/aggbug/2323005.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/saptechnique/archive/2012/01/15/2323005.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/saptechnique/archive/2012/01/12/2320627.html</id><title type="text">Winform中多国语言窗体的设计以及.NET中资源文件的使用[转]</title><summary type="text">Winform中多国语言窗体的设计以及.NET中资源文件的使用 最近在做一些多国语言的软件，就学习了一下.NET中的多国语言相应知识，受益不少，下面我就简单介绍一下winform中关于多国语言的实现方法。分为七个部分来讲：资源文件概述、资源文件的分类、资源文件的创建、利用IDE来制作多国语言版本、利用资源文件来做多国语言版本、常用.NET资源文件生成器的使用和总结这七个部分。前两个部分都是一些理论...</summary><published>2012-01-12T06:54:00Z</published><updated>2012-01-12T06:54:00Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><link rel="alternate" href="http://www.cnblogs.com/saptechnique/archive/2012/01/12/2320627.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/archive/2012/01/12/2320627.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Winform中多国语言窗体的设计以及.NET中资源文件的使用&lt;/strong&gt; &lt;p&gt;最近在做一些多国语言的软件，就学习了一下.NET中的多国语言相应知识，受益不少，下面我就简单介绍一下winform中关于多国语言的实现方法。分为七个部分来讲：&lt;strong&gt;资源文件概述&lt;/strong&gt;、&lt;strong&gt;资源文件的分类&lt;/strong&gt;、&lt;strong&gt;资源文件的创建、利用&lt;/strong&gt;&lt;strong&gt;IDE&lt;/strong&gt;&lt;strong&gt;来制作多国语言版本、利用资源文件来做多国语言版本、常用&lt;/strong&gt;&lt;strong&gt;.NET&lt;/strong&gt;&lt;strong&gt;资源文件生成器的使用&lt;/strong&gt;和&lt;strong&gt;总结&lt;/strong&gt;这七个部分。前两个部分都是一些理论性的东西，如果大家不感兴趣可以跳过，直接看三、四、五这三个部分。 &lt;p&gt;第一部分：&lt;strong&gt;资源文件概述&lt;/strong&gt; &lt;p&gt;资源文件顾名思义就是存放资源的文件。资源文件在程序设计中有着自身独特的优势，他独立于源程序，这样资源文件就可以被多个程序使用。同时在程序设计的时候，有时出于安全或者其它方面因素的考虑，把重要东西存放在资源文件中，也可以达到保密、安全的效果。 &lt;p&gt;资源文件中一般存三种类型的数据：byte流（byte[]）、对象（object）和字符串（string）。对于一些纯文件的信息可以用string类型来保存，对于图片（Image）、图标（Icon）等用object来保存，其它的可以用byte流来保存。 &lt;p&gt;System.Resources命名空间中有大量的类和方法来处理资源文件，我将在下面的篇章中进行介绍。 &lt;p&gt;&lt;strong&gt;&lt;/strong&gt; &lt;p&gt;第二部分：&lt;strong&gt;资源文件的分类&lt;/strong&gt; &lt;p&gt;资源文件可以分为两类，一类是以.resx为后缀名的文件，一类是以.resources为后缀名的文件。二者的区别在于： &lt;p&gt;1. resx虽然是以resx结尾的文件，但是它却是XML格式的文件，你可以用记事本等工具直接打开它修改里面的东西；而resources是二进制的文件，相对来说安全性更好一些。 &lt;p&gt;2. resources作为内嵌资源，在指定路径正确的前提下，可以在程序中直接引用；而resx虽然也是内嵌资源，但它却是要依附于.CS文件存在的。也就是说它是作为winform窗体的一个描述性资源存在的，要想在程序中直接使用它，在解决方案中必须有与它同名（只是名字相同，后缀名不同）的.CS文件存在（见图一）。这一点我会在下面的示例中作详细说明。 &lt;p&gt;3. 我们可以利用CSC命令把resx文件转换成resources文件。 &lt;p&gt;RESGEN.EXE LitwareStrings.resx LitwareStrings.resources &lt;p&gt;注意变量环境为framework1.1。 &lt;p&gt;第三部分：&lt;strong&gt;资源文件的创建&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;这里我介绍两种资源文件的创建方法，一个是利用System.Resources下的ResourceWriter类，另一个是利用资源文件生成器。本节重点讲利用ResourceWriter类来创建资源文件的方法，第二个方法请详见第六部分。 &lt;p&gt;首先要实例化一个ResourceWriter类型的变量： &lt;p&gt;ResourceWriter rw = new ResourceWriter ( "My.resources" ) ;其中My.resources就是你要生成的文件名。其次要在磁盘上产生这个文件：调用rw.Generate ( ) ;就可以了。 &lt;p&gt;接下来就要为这个资源文件来增加内容了。在ResourceWriter类中提供了一个AddResource ( )方法，这个方法的作用就是往资源文件中添加资源的。在C#中对不同的资源有着不同的加入方式。 &lt;p&gt;1.加入字节数组，语法格式为：  &lt;p&gt;public void AddResource ( string , byte [ ] ) ; &lt;p&gt;注释：其中string是在使用资源文件的时候，此字节数组在程序中的的唯一标识符 &lt;p&gt;2. 加入对象，语法格式为：  &lt;p&gt;public void AddResource ( string , object ); &lt;p&gt;注释：其中string是在使用资源文件的时候，此对象在程序中的唯一标识符 &lt;p&gt;在本文程序中，我们利用这种调用方式来加入图标和图象，具体如下：  &lt;p&gt;Icon ico = new Icon ( "main.ico" ) ;&lt;br&gt;Image Turnoff = Image.FromFile ("Turn-off.png") ;&lt;br&gt;Image Turnon = Image.FromFile ( " Turn -on.png" ) ; &lt;p&gt;rw.AddResource ( " main.ico" , ico ) ;//在资源文件中加入图标&lt;br&gt;//以下是在资源文件中加入图象&lt;br&gt;rw.AddResource ( " Turn -off.png" , Turnoff ) ;&lt;br&gt;rw.AddResource ( " Turn -on.png" , Turnlon ) ; &lt;p&gt;3. 加入字符串，具体语法如下： &lt;br&gt;public void AddResource ( string1 , string2) ; &lt;p&gt;注释：其中string1是在使用资源文件的时候，此字符串在程序中的唯一标识符在本文的程序中，是如此使用的：  &lt;p&gt;rw.AddResource ( "MyStr" , "从资源文件中读取字符串" ); &lt;p&gt;至此我们已经创建了一个资源文件，并且在资源文件中加入了若干个资源，当然在这之后，还应该注意，保存此资源文件，并关闭资源文件，具体如下：  &lt;p&gt;rw.Close ( ) ; &lt;p&gt;以上我介绍了用ResourceWrite类来创建resources文件的方法，对于resx文件，我们可以在vs2003的IDE中在解决方案管理中点右键-&amp;gt;添加新项目中-&amp;gt;控件资源档来添加。 &lt;p&gt;第四部分：&lt;strong&gt;利用&lt;/strong&gt;&lt;strong&gt;IDE&lt;/strong&gt;&lt;strong&gt;来制作多国语言版本&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;终于进入主题了，但是这一节的内容和前几节关系不大，因为我主要讲如何使用VS的IDE来制作多国语言版本。每一个Form1.cs文件都有一或多个相应的resx文件作为附属资源。他们的命名规则为Form1.cs的资源文件为Form1.resx，Form1.zh-CHS.resx，Form1.zh-CHT.resx等，其中Form1.resx是缺省的窗体资源文档，其它是在不同语言环境要使用的资源文档，其中Form1.zh-CHS.resx是中文简体系统，Form1.zh-CHT.resx是中文繁体系统（如下图一）。关于命名可不是随便起的，可以参见msdn中关于不同地区的命名规则。 &lt;p&gt;(图一) &lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/tjvictor/2241ebe0627d47da89d3ea3182add7e7.png"&gt; &lt;p&gt;每一个窗体都有Localizable和Language这两个属性，其缺省值如下图： &lt;p&gt;(图二) &lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/tjvictor/c2eecb6080be4444b9b22e5150ecfc98.png"&gt; &lt;p&gt;Localizable表示是否使用本地化资源，当其为true时，可以在Language中选择一种语种，例如选繁体中文，如下图： &lt;p&gt;(图三) &lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/tjvictor/50d4f0fd066746da9a639692c5dca6bb.png"&gt; &lt;p&gt;这时，窗体的布局会发现变化，你要重新布局窗体上的控件位置、大小、内容等等。布局好以后，你可以继续选择其它的语种来布局。不用担心，它们之间不会有冲突，因为所有不同语种之间的布局差别都被保存到相应的resx文件中了，如图一。最后保存、编译。 &lt;p&gt;为了测试结果，我们可以改变机器的语言环境，方法有二：一是在控件面板中的更改语言选项。另一个是用程序来改。下面我介绍一下第二种方法，用程序来改变当前进程的语言环境。 &lt;p&gt;在程序运行时，会自动检测当前的系统语言环境，我们可以通过修改System.Threading.Thread.CurrentThread.CurrentUICulture这个属性来改变当前UI运行的语言环境，代码如下： &lt;p&gt;static void Main() &lt;p&gt;{ &lt;p&gt;System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo( "zh-CHS" ); &lt;p&gt;Application.Run(new Form1()); &lt;p&gt;} &lt;p&gt;效果图如下： &lt;p&gt;(图四) &lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/tjvictor/c76c8e3ebc3e47e8b9d7a73ee9adf725.png"&gt; &lt;p&gt;更改System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo( "zh-CHT" );后，效果如下： &lt;p&gt;(图五) &lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/tjvictor/f8846715c06e43629d61d26f4a2eed6e.png"&gt; &lt;p&gt;第五部分：&lt;strong&gt;利用资源文件来做多国语言版本&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;在第三节我们已经说过如何利用ResourceWriter类来创建资源文件，本节就讲讲怎么来使用这些资源文件。利用第三节介绍的方法分别建立三个文件MyResource.resources、MyResourceZH_TW.resources和MyResourceEn.resources分别对应缺省、繁体和英文三个系统。每个文件中有两个string和一个object对象，分别对应button，textbox和Icon。 &lt;p&gt;图四、图五中的language的菜单栏对应代码如下： &lt;p&gt;private void English_Click(object sender, System.EventArgs e) &lt;p&gt;{ &lt;p&gt;ResourceManager rm = new ResourceManager( "EmbedResource.MyResourceEn" , Assembly.GetExecutingAssembly() ); &lt;p&gt;textBox1.Text = rm.GetString( "TextBoxValue" ); &lt;p&gt;button1.Text = rm.GetString( "ButtonValue" ); &lt;p&gt;this.Icon = (Icon)rm.GetObject( "Demo.ico" ); &lt;p&gt;} &lt;p&gt;private void ChineseTraditional_Click(object sender, System.EventArgs e) &lt;p&gt;{ &lt;p&gt;ResourceManager rm = new ResourceManager( "EmbedResource.MyResourceZH_TW" , Assembly.GetExecutingAssembly() ); &lt;p&gt;textBox1.Text = rm.GetString( "TextBoxValue" ); &lt;p&gt;button1.Text = rm.GetString( "ButtonValue" ); &lt;p&gt;this.Icon = (Icon)rm.GetObject( "Demo.ico" ); &lt;p&gt;} &lt;p&gt;效果图如下： &lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/tjvictor/fce78781c4fc4a438ff5110cce7a6571.png"&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/tjvictor/94522fb1edee44869835fed6c2ba0b00.png"&gt; &lt;p&gt;在第二部分中，我说过resx和resources调用的方法不同，下面我再说说resx文件如何来调用。由于resx是cs文件的附属文文件，所以项目中一定要有同名的cs文件存在。如图一。 &lt;p&gt;调用resx使用如下代码： &lt;p&gt;ResourceManager rm = new ResourceManager( "EmbedResource.Form1" , Assembly.GetAssembly(typeof(EmbedResource.Form1))); &lt;p&gt;textBox1.Text = rm.GetObject( "textBox1.Visible" ).ToString(); &lt;p&gt;其中EmbedResource是namespace，Form1为资源文件名（不包含后缀名），第二个参数Assembly.GetAssembly(typeof(EmbedResource.Form1))中EmbedResource是namespace，而Form1是resx附属的cs文件的名称。注意区分。 &lt;p&gt;第六部分：&lt;strong&gt;常用&lt;/strong&gt;&lt;strong&gt;.NET&lt;/strong&gt;&lt;strong&gt;资源文件生成器的使用&lt;/strong&gt; &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;在网上相关的软件已经很多了，我给大家介绍一个Resourcer.exe，它是开源的，可以在&lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;http://www.aisto.com/roeder/dotnet/ 中下载。其运行界面如下：&lt;/a&gt; &lt;p&gt;&lt;img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/tjvictor/f7cc608b123c4364a6ac47a7cde2ac14.png"&gt; &lt;p&gt;该软件可以自动保存成text、resx和resources三种格式的文件。前面的资源可以很方便的使用此软件来创建。大家可以自己下载下来试试。我在这里就不多说了。 &lt;p&gt;第七部分：&lt;strong&gt;总结&lt;/strong&gt; &lt;p&gt;通过上面的介绍我们已经具备了制作多国语言的基础，当然这只是对多国语言制作的初步介绍。有什么不妥的地方，请在评论中指正，我会尽快改过来的 &lt;p&gt;来源： &lt;p&gt;&lt;a title="http://blog.csdn.net/tjvictor/article/details/1464284" href="http://blog.csdn.net/tjvictor/article/details/1464284"&gt;http://blog.csdn.net/tjvictor/article/details/1464284&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/saptechnique/aggbug/2320627.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/saptechnique/archive/2012/01/12/2320627.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/saptechnique/archive/2012/01/12/2320136.html</id><title type="text">界面开发(一)[转]</title><summary type="text">界面开发(一) 2010-04-07 作者：zhjp11 来源：萧萧空间 界面开发概述 每个软件都要有自己的软件界面，对于软件开发来说，软件界面不一定是最重要的，但是也是相当重要的。一款软件要是可以在界面上做好，吸引了客户的眼球，那这款软件也就相对成功了一半。 现在各行各业的软件都添加了自己的皮肤色彩，显示出了不同的特点。例如QQ，MSN，Foxmail等等，这些软件都修改了自己软件的界面，将自...</summary><published>2012-01-12T01:36:00Z</published><updated>2012-01-12T01:36:00Z</updated><author><name>guofu</name><uri>http://www.cnblogs.com/saptechnique/</uri></author><link rel="alternate" href="http://www.cnblogs.com/saptechnique/archive/2012/01/12/2320136.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/saptechnique/archive/2012/01/12/2320136.html"/><content type="html">&lt;p&gt;界面开发(一) &lt;p&gt;2010-04-07 作者：zhjp11 来源：萧萧空间 &lt;p&gt;&lt;strong&gt;界面开发概述 &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;每个软件都要有自己的软件界面，对于软件开发来说，软件界面不一定是最重要的，但是也是相当重要的。一款软件要是可以在界面上做好，吸引了客户的眼球，那这款软件也就相对成功了一半。 &lt;p&gt;现在各行各业的软件都添加了自己的皮肤色彩，显示出了不同的特点。例如QQ，MSN，Foxmail等等，这些软件都修改了自己软件的界面，将自己的界面化做的很完善，很漂亮。使用起来感觉很舒服。我也是一个做软件的，于是也打算将自己的软件做的像那些软件产品一样漂亮，于是乎在网上寻求自己软件界面的解决方案。当然很多很多。下面列举几个： &lt;p&gt;一、使用皮肤组件（IrisSkin2.dll） &lt;p&gt;这个是东日软件公司开发的一套软件界面。IrisSkin 是为Microsoft Visual Studio.NET开发的最易用的界面增强.NET(WinForm)组件包。它能完全自动的为您的应用程序添加支持换肤功能，甚至不需要更改您的设计好的Form以及添加一行代码！您也不再需要花费很多时间来使得自己的应用程序更漂亮。当然他是收费的，但是网上很多具有破解版，当然我也下载了一套，使用起来相当的方便。 &lt;p&gt;下载地址：&lt;a href="http://www.uml.org.cn/jmshj/Irisskin.rar"&gt;Irisskin.rar&lt;/a&gt; &lt;p&gt;二、自定义开发 &lt;p&gt;这个就比较难了，要了解很多关于Windows开发的内容，其中有两种做法，一种就是使用自定义的皮肤Form和Button等所有的空间，继承.net Framework提供的控件中自己使用的大部分，然后扩展其中的WndProc方法或者其他的一些方法，这是市最普遍的一种方式。另外就是使用IrisSkin的方法，使用NativeWindow这个底层的类，进行Hook编程。主要的例子如下： &lt;p&gt;1、苏飞的博客： &lt;p&gt;&lt;a href="http://www.cnblogs.com/sufei/archive/2010/03/13/1685236.html"&gt;http://www.cnblogs.com/sufei/archive/2010/03/13/1685236.html&lt;/a&gt; &lt;p&gt;2、CsharpWin中的皮肤 &lt;p&gt;&lt;a href="http://www.csharpwin.com/csharpresource/2992.shtml"&gt;http://www.csharpwin.com/csharpresource/2992.shtml&lt;/a&gt; &lt;p&gt;这两个写的都非常好，让我受益匪浅。 &lt;p&gt;总结了以上的皮肤开发，我了解的到，所谓的皮肤开发无非就是使用了图片、颜色等内容将窗体进行了重绘或者就是覆盖，也就是重载了WndProc中的Paint，NCPaint等等操作。对于Winform来说，一个窗体主要分为两块，即Non Client Area和Client Area，如下图： &lt;p&gt;&lt;img border="0" alt="" src="http://www.uml.org.cn/jmshj/images/nonclientarea.JPG" width="375" height="326"&gt; &lt;p&gt;简单的说就是对Client Area和Non Client Area的绘制。而Form中的WndProc的Paint，NCPaint就是完成这样的操作。 &lt;p&gt;3、我的实现方式。 &lt;p&gt;我的实现方式主要研究了苏飞和CshaorpWindow的两个程序，还有就是查看了IrisSkin的反编译源代码，我觉得实现的方式还是使用IrisSkin的方式比较好，IrisSkin的实现是使用了本地的一个简单的类NativeWindow，这是是一个可以实现简单的窗体等的注册，也就是Hook。我按照了这种方法，写了一个简单的程序。基本上可以实现IrisSkin的内容，使用的方式和IrisSkin的使用方式一样，都是在窗体中添加一个SkinEngine的Component，这样窗体就会显示了Office2007的样式，如下图所示： &lt;p&gt;&lt;img border="0" alt="" src="http://www.uml.org.cn/jmshj/images/SkinExample.JPG" width="663" height="325"&gt; &lt;p&gt;现在主要实现了在窗体上的Label可以显示为皮肤的颜色，但是对于对话框中的颜色还没有进行处理。还需要很多的处理，包括皮肤的设计和窗体中各个控件的设计。我会将在后续专题中写相关的内容。  &lt;p&gt;源码如下：&lt;a href="http://www.uml.org.cn/jmshj/SkinEngines2010-03-17.rar"&gt;SkinEngines2010-03-17.rar&lt;/a&gt; &lt;p&gt;&lt;strong&gt;(一)--- Hook所有的窗体 &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;上篇文章界面开发概述，讲了我开发界面的一些心得体会和一些基本的原理，从这篇开始，我开始讲解一下我的界面开发的全部过程，一步一步的讲解开发界面的过程，这篇主要讲解的是Hook编程，Hook所有的窗体。 &lt;p&gt;Hook，对于大多数程序员来说，这个词并不陌生。对于Windows系统来说，消息Message的传递贯穿了整个系统，Message简单来说就是一个整数，它具有相应的意义。在C++的winuser.h中可以看到我们常用的很多的Message。Hook与Message是密不可分的，它的中文解释就是“钩子”，就是监控系统中Message的传递，就是在Message传递到最终的Message处理前，对特定的消息进行处理。 &lt;p&gt;对于Hook来说，开发主要的有3个API函数，均放在User32.dll文件中，这三个函数是： &lt;p&gt;Hook&lt;br&gt;1 /// &amp;lt;summary&amp;gt;&lt;br&gt;2 /// SetWindowsHookEx&lt;br&gt;3 /// &amp;lt;/summary&amp;gt;&lt;br&gt;4 /// &amp;lt;param name="idHook"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;5 /// &amp;lt;param name="lpfn"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;6 /// &amp;lt;param name="hMod"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;7 /// &amp;lt;param name="dwThreadId"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;8 /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;9 [DllImport("User32.dll", CharSet = CharSet.Auto)]&lt;br&gt;10 public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, int hMod, int dwThreadId);&lt;br&gt;11&lt;br&gt;12 /// &amp;lt;summary&amp;gt;&lt;br&gt;13 /// CallNextHookEx&lt;br&gt;14 /// &amp;lt;/summary&amp;gt;&lt;br&gt;15 /// &amp;lt;param name="hhk"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;16 /// &amp;lt;param name="nCode"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;17 /// &amp;lt;param name="wParam"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;18 /// &amp;lt;param name="lParam"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;19 /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;20 [DllImport("User32.dll", CharSet = CharSet.Auto)]&lt;br&gt;21 public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);&lt;br&gt;22&lt;br&gt;23 /// &amp;lt;summary&amp;gt;&lt;br&gt;24 /// UnhookWindowsHookEx&lt;br&gt;25 /// &amp;lt;/summary&amp;gt;&lt;br&gt;26 /// &amp;lt;param name="hhk"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;27 /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;28 [DllImport("User32.dll", CharSet = CharSet.Auto)]&lt;br&gt;29 public static extern bool UnhookWindowsHookEx(IntPtr hhk); &lt;p&gt;这三个方法分别就是添加Hook，释放Hook和执行下一个Hook。其中的参数就不必介绍了，网上有很多这方面的资料。 &lt;p&gt;接下来就是对Windows窗体的消息截取。 &lt;p&gt;我创建一个项目名称叫做SkinEngines，然后再NativeMethod中添加了这三个方法。其中SetWindowsHookEx中需要一个参数就是一个方面的名称，在C#中使用委托实现，所以也创建了一个专门保存委托的地点，放在Delegates.cs文件中。 &lt;p&gt;HookProc &lt;p&gt;/// &amp;lt;summary&amp;gt;&lt;br&gt;/// HookProc -- HookProc&lt;br&gt;/// &amp;lt;/summary&amp;gt;&lt;br&gt;/// &amp;lt;param name="nCode"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;/// &amp;lt;param name="wParam"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;/// &amp;lt;param name="lParam"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); &lt;p&gt;然后创建一个名为SkinEngine的Component。在SkinEngine的构造函数中添加了自己的一些操作，对窗体的Hook。代码如下： &lt;p&gt;1 /// &amp;lt;summary&amp;gt;&lt;br&gt;2 /// SkinEngine -- Skin All Form,Dialog,Control&lt;br&gt;3 /// &amp;lt;/summary&amp;gt;&lt;br&gt;4 public partial class SkinEngine : Component&lt;br&gt;5 {&lt;br&gt;6 #region Field&lt;br&gt;7 /// &amp;lt;summary&amp;gt;&lt;br&gt;8 /// CBTHook -- Hook WH_CBT&lt;br&gt;9 /// &amp;lt;/summary&amp;gt;&lt;br&gt;10 private static HookProc _cbtHook;&lt;br&gt;11&lt;br&gt;12 /// &amp;lt;summary&amp;gt;&lt;br&gt;13 /// Hook&lt;br&gt;14 /// &amp;lt;/summary&amp;gt;&lt;br&gt;15 private static IntPtr Hook;&lt;br&gt;16&lt;br&gt;17 /// &amp;lt;summary&amp;gt;&lt;br&gt;18 /// Current SkinEngine&lt;br&gt;19 /// &amp;lt;/summary&amp;gt;&lt;br&gt;20 internal static SkinEngine Engine;&lt;br&gt;21&lt;br&gt;22 /// &amp;lt;summary&amp;gt;&lt;br&gt;23 /// Skinned handled&lt;br&gt;24 /// &amp;lt;/summary&amp;gt;&lt;br&gt;25 internal static ArrayList SkinHandleList = new ArrayList();&lt;br&gt;26 #endregion&lt;br&gt;27&lt;br&gt;28 #region Constructor&lt;br&gt;29 /// &amp;lt;summary&amp;gt;&lt;br&gt;30 /// Constructor&lt;br&gt;31 /// &amp;lt;/summary&amp;gt;&lt;br&gt;32 public SkinEngine()&lt;br&gt;33 {&lt;br&gt;34 InitializeComponent();&lt;br&gt;35 // Internal Constructor&lt;br&gt;36 this.InternalConstructor();&lt;br&gt;37 }&lt;br&gt;38&lt;br&gt;39 /// &amp;lt;summary&amp;gt;&lt;br&gt;40 /// Constructor With container&lt;br&gt;41 /// &amp;lt;/summary&amp;gt;&lt;br&gt;42 /// &amp;lt;param name="container"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;43 public SkinEngine(IContainer container)&lt;br&gt;44 {&lt;br&gt;45 container.Add(this);&lt;br&gt;46&lt;br&gt;47 InitializeComponent();&lt;br&gt;48&lt;br&gt;49 // Internal Constructor&lt;br&gt;50 this.InternalConstructor();&lt;br&gt;51 }&lt;br&gt;52 #endregion&lt;br&gt;53&lt;br&gt;54 #region InternalConstructor&lt;br&gt;55 /// &amp;lt;summary&amp;gt;&lt;br&gt;56 /// the Internal Constructor to Create Hook and Get List of all control to skin.&lt;br&gt;57 /// &amp;lt;/summary&amp;gt;&lt;br&gt;58 private void InternalConstructor()&lt;br&gt;59 {&lt;br&gt;60 // IsDesignMode == false&lt;br&gt;61 if (!IsDesignMode)&lt;br&gt;62 {&lt;br&gt;63 // Check Engine&lt;br&gt;64 if (Engine == null)&lt;br&gt;65 {&lt;br&gt;66 // Set Engine&lt;br&gt;67 Engine = this;&lt;br&gt;68&lt;br&gt;69 // Hook Process&lt;br&gt;70 if (Hook == IntPtr.Zero)&lt;br&gt;71 {&lt;br&gt;72 _cbtHook = new HookProc(SkinEngine.FnHookProc);&lt;br&gt;73 Hook = NativeMethod.SetWindowsHookEx(5, _cbtHook, 0, AppDomain.GetCurrentThreadId());&lt;br&gt;74 Application.ApplicationExit += new EventHandler(Application_ApplicationExit);&lt;br&gt;75 }&lt;br&gt;76 }&lt;br&gt;77 }&lt;br&gt;78 }&lt;br&gt;79 #endregion&lt;br&gt;80&lt;br&gt;81 #region FnHookProc&lt;br&gt;82 /// &amp;lt;summary&amp;gt;&lt;br&gt;83 /// FnHookProc&lt;br&gt;84 /// &amp;lt;/summary&amp;gt;&lt;br&gt;85 /// &amp;lt;param name="nCode"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;86 /// &amp;lt;param name="wParam"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;87 /// &amp;lt;param name="lParam"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;88 /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br&gt;89 private static unsafe IntPtr FnHookProc(int nCode, IntPtr wParam, IntPtr lParam)&lt;br&gt;90 {&lt;br&gt;91 if (Engine != null)&lt;br&gt;92 {&lt;br&gt;93 switch (nCode)&lt;br&gt;94 {&lt;br&gt;95 case 5:&lt;br&gt;96 // Get Skin Control&lt;br&gt;97 Control control = Control.FromHandle(wParam);&lt;br&gt;98 // Control is null it Can be Dialog&lt;br&gt;99 if (control == null)&lt;br&gt;100 {&lt;br&gt;101 StringBuilder builder = new StringBuilder(260);&lt;br&gt;102 NativeMethod.GetClassName(wParam, builder, 260);&lt;br&gt;103 // #32770 is Dialog&lt;br&gt;104 if (builder.Length == 6 &amp;amp;&amp;amp; builder.ToString() == "#32770")&lt;br&gt;105 {&lt;br&gt;106 // Add to SkinHandleList&lt;br&gt;107 SkinHandleList.Add(wParam);&lt;br&gt;108 // Print&lt;br&gt;109 Debug.WriteLine(builder.ToString());&lt;br&gt;110 }&lt;br&gt;111 break;&lt;br&gt;112 }&lt;br&gt;113 if (!SkinHandleList.Contains(wParam) &amp;amp;&amp;amp; (control is Form))&lt;br&gt;114 {&lt;br&gt;115 // Add to SkinHandleList&lt;br&gt;116 SkinHandleList.Add(wParam);&lt;br&gt;117 // Print all control's Name&lt;br&gt;118 Debug.WriteLine(control.Name);&lt;br&gt;119 }&lt;br&gt;120 break;&lt;br&gt;121 default:&lt;br&gt;122 break;&lt;br&gt;123 }&lt;br&gt;124 }&lt;br&gt;125 return NativeMethod.CallNextHookEx(Hook, nCode, wParam, lParam);&lt;br&gt;126 }&lt;br&gt;127 #endregion&lt;br&gt;128&lt;br&gt;129 #region Application_ApplicationExit&lt;br&gt;130 /// &amp;lt;summary&amp;gt;&lt;br&gt;131 /// Application_ApplicationExit&lt;br&gt;132 /// &amp;lt;/summary&amp;gt;&lt;br&gt;133 /// &amp;lt;param name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;134 /// &amp;lt;param name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;br&gt;135 private void Application_ApplicationExit(object sender, EventArgs e)&lt;br&gt;136 {&lt;br&gt;137 Engine.Dispose(false);&lt;br&gt;138 }&lt;br&gt;139 #endregion&lt;br&gt;140&lt;br&gt;141 #region Property&lt;br&gt;142 /// &amp;lt;summary&amp;gt;&lt;br&gt;143 /// Gets or sets a value indicating whether we are currently in design mode.&lt;br&gt;144 /// &amp;lt;/summary&amp;gt;&lt;br&gt;145 /// &amp;lt;value&amp;gt;&lt;br&gt;146 /// &amp;lt;c&amp;gt;true&amp;lt;/c&amp;gt; if this we are in design mode; otherwise, &amp;lt;c&amp;gt;false&amp;lt;/c&amp;gt;.&lt;br&gt;147 /// &amp;lt;/value&amp;gt;&lt;br&gt;148 internal static bool IsDesignMode { get; set; }&lt;br&gt;149 #endregion&lt;br&gt;150 } &lt;p&gt;这样整个窗体就可以进行Hook，其中NativeMethod.SetWindowsHookEx设置了WM_CBT的消息，这个消息用来对Windows窗体的激活，显示。这样，窗体就会被我们记录下来，现在仅仅是将记录下来的窗体显示出来，写出了窗体的名称。结果如下： &lt;p&gt;&lt;img border="0" alt="" src="http://www.uml.org.cn/jmshj/images/SkinOutput.JPG" width="529" height="173"&gt; &lt;p&gt;这篇就暂时写道这里，下一篇将对Form的消息进行Hook并绘制。 &lt;p&gt;代码：&lt;a href="http://www.uml.org.cn/jmshj/SkinEngines20100318.rar"&gt;SkinEngines20100318.rar&lt;/a&gt; &lt;p&gt;&lt;strong&gt;(二)--- NativeWindow &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;NativeWindow是.net Framework提供的一个底层的类。微软官方的解释为：NativeWindow Provides a low-level encapsulation of a window handle and a window procedure.说道这些也相当于没有说，因为NativeWindow到底是干什么的也没有说清楚，意思就是一个低级别的对窗体句柄和窗体过程的一个封装。后来查询了很多的资料才明白了其中的意义。 &lt;p&gt;资料来源： &lt;p&gt;&lt;a href="http://www.diybl.com/course/4_webprogram/asp.net/netjs/2007921/72804.html"&gt;http://www.diybl.com/course/4_webprogram/asp.net/netjs/2007921/72804.html&lt;/a&gt; &lt;p&gt;这个讲解的是《利用NativeWindow监视WndProc消息》，这篇内容比较长，而且页数比较多，经过自己努力和耐心，终于完成了其中的例子，代码下载地址为：&lt;a href="http://www.uml.org.cn/jmshj/NativeWindowApplication.rar"&gt;NativeWindowApplication.rar&lt;/a&gt; &lt;p&gt;&lt;a href="http://www.codeproject.com/KB/dialog/OpenFileDialogEx.aspx"&gt;http://www.codeproject.com/KB/dialog/OpenFileDialogEx.aspx&lt;/a&gt; &lt;p&gt;这篇来自CodeProject，老外写的代码就是比较有水平。将Windows 的OpenFileDialog子类化，显示成了自定义的OpenFileDialog，而且添加了很多的事件。相当的佩服。 &lt;p&gt;经过这两篇的细心阅读，终于了解了NativeWindow的作用，NativeWindow就是提供了底层的封装，提供了AssignHandle和RealeseHandle这两个方法，主要就是对注册了窗体句柄的窗体进行Hook，将窗体的事件经过自己处理后交给Windows处理。使用Refector.net查看了NativeWindow中AssignHandle这个方法，也验证了我这个说法。在AssignHandle中有这样一段代码： &lt;p&gt;userDefWindowProc = UnsafeNativeMethods.GetProcAddress(new HandleRef(null,UnsafeNativeMethods.GetModuleHandle("user32.dll")), lpProcName);  &lt;p&gt;对Win32开发的也许都知道这段代码的意义，他也是Hook的一种。不过是更加高级的Hook方式。这里就不在细说，我们现在只要知道他可以对我们进行注册的窗体进行Hook，可以将自己的代码加载到我们想要的位置就可以了。 &lt;p&gt;然后我就使用NativeWindow获取所有的窗体的所有事件，然后输出Hook到的时间，结果图如下： &lt;p&gt;&lt;img border="0" alt="" src="http://www.uml.org.cn/jmshj/images/SkinHookProc.JPG" width="283" height="361"&gt; &lt;p&gt;下载代码如下：&lt;a href="http://www.uml.org.cn/jmshj/SkinEngines20100319.rar"&gt;SkinEngines20100319.rar&lt;/a&gt; &lt;p&gt;来源： &lt;p&gt;&lt;a title="http://www.uml.org.cn/jmshj/201004074.asp" href="http://www.uml.org.cn/jmshj/201004074.asp"&gt;http://www.uml.org.cn/jmshj/201004074.asp&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/saptechnique/aggbug/2320136.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/saptechnique/archive/2012/01/12/2320136.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
