<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_春夏秋冬</title><subtitle type="text">chuncn</subtitle><id>http://feed.cnblogs.com/blog/u/27538/rss</id><updated>2012-05-30T07:21:34Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/27538/rss"/><entry><id>http://www.cnblogs.com/chuncn/archive/2012/05/30/2526397.html</id><title type="text">Qt编码风格 -- 转</title><summary type="text">http://developer.qt.nokia.com/wiki/Qt_Coding_Stylehttp://developer.qt.nokia.com/wiki/Writing_Qt_Examples如果它使你的代码看起来不好，你可以打破任何一个规则。缩进采用4个空格空格，不要用TAB！变量每行一个变量尽可能避免短的变量名单字符的变量只在临时变量或循环的计数中使用等到真正需要使用时再定义变量// Wrongint a, b;char *c, *d; // Correctint height;int width;char *nameOfThis;char *nameOfThat;以小写字</summary><published>2012-05-30T07:21:00Z</published><updated>2012-05-30T07:21:00Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chuncn/archive/2012/05/30/2526397.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/archive/2012/05/30/2526397.html"/><content type="html">&lt;ul&gt;&lt;li&gt;&lt;p class="line891"&gt;&lt;a class="http" href="http://developer.qt.nokia.com/wiki/Qt_Coding_Style"&gt;http://developer.qt.nokia.com/wiki/Qt_Coding_Style&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p class="line891"&gt;&lt;a class="http" href="http://developer.qt.nokia.com/wiki/Writing_Qt_Examples"&gt;http://developer.qt.nokia.com/wiki/Writing_Qt_Examples&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="line867"&gt;&lt;strong&gt;如果它使你的代码看起来不好，你可以打破任何一个规则&lt;/strong&gt;&amp;nbsp;。&lt;/p&gt;&lt;h2 id="A.2BfymP2w-"&gt;缩进&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;采用4个空格&lt;/li&gt;&lt;li&gt;空格，不要用TAB！&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="A.2BU9iRzw-"&gt;变量&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;每行一个变量&lt;/li&gt;&lt;li&gt;尽可能避免短的变量名&lt;/li&gt;&lt;li&gt;单字符的变量只在临时变量或循环的计数中使用&lt;/li&gt;&lt;li&gt;等到真正需要使用时再定义变量&lt;/li&gt;&lt;/ul&gt;// Wrong&lt;br/&gt;int a, b;&lt;br/&gt;char *c, *d;&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;int height;&lt;br/&gt;int width;&lt;br/&gt;char *nameOfThis;&lt;br/&gt;char *nameOfThat;&lt;ul&gt;&lt;li&gt;以小写字符开头，后续单词以大写开头&lt;/li&gt;&lt;li&gt;避免使用缩写&lt;/li&gt;&lt;/ul&gt;// Wrong&lt;br/&gt;short Cntr;&lt;br/&gt;char ITEM_DELIM = '/t';&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;short counter;&lt;br/&gt;char itemDelimiter = '/t';&lt;ul&gt;&lt;li&gt;类名总是以大写开头&lt;/li&gt;&lt;/ul&gt;&lt;h3 id="A.2BiGVRRQ-"&gt;补充&lt;/strong&gt;&lt;/p&gt;&lt;p class="line874"&gt;在Qt例子编写中，对变量名有如下建议：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;成员变量前不要加 "m_" 或其他什么东西&lt;/li&gt;&lt;li&gt;&lt;p class="line862"&gt;如果参数名和成员变量名发生冲突，使用 "this-&amp;gt;" 解决&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;void MyClass::setColor(const QColor &amp;amp;color;)&lt;br/&gt;{&lt;br/&gt;    this-&amp;gt;color = color;&lt;br/&gt;}&lt;p class="line874"&gt;或&lt;/p&gt;void MyClass::setColor(const QColor &amp;amp;newColor;)&lt;br/&gt;{&lt;br/&gt;    color = newColor;&lt;br/&gt;}&lt;p class="line867"&gt;&lt;strong&gt;避免使用&lt;/strong&gt;&amp;nbsp;(意义不明确的字符)：&lt;/p&gt;void MyClass::setColor(const QColor &amp;amp;c)&lt;br/&gt;{&lt;br/&gt;    color = c;&lt;br/&gt;}&lt;p class="line874"&gt;注意：在构造函数中，会遇到同样的问题。但无论你信与不信，下面的可以工作&lt;/p&gt;MyClass::MyClass(const QColor &amp;amp;color;)&lt;br/&gt;    : color(color)&lt;br/&gt;{&lt;br/&gt;}&lt;h2 id="A.2Benp2fQ-"&gt;空白&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;利用空行将语句恰当地分组&lt;/li&gt;&lt;li&gt;总是使用一个空行(不要空多行)&lt;/li&gt;&lt;li&gt;总是在每个关键字和大括号前使用一个空格&lt;/li&gt;&lt;/ul&gt;// Wrong&lt;br/&gt;if(foo){&lt;br/&gt;}&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;if (foo) {&lt;br/&gt;}&lt;ul&gt;&lt;li&gt;&lt;p class="line862"&gt;对指针和引用，在类型和*、&amp;amp;之间加一个空格，但在*、&amp;amp;与变量之间不加空格&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;char *x;&lt;br/&gt;const QString &amp;amp;myString;&lt;br/&gt;const char * const y = "hello";&lt;ul&gt;&lt;li&gt;二元操作符前后加空白&lt;/li&gt;&lt;li&gt;类型转换后不加空白&lt;/li&gt;&lt;li&gt;尽量避免C风格的类型转换&lt;/li&gt;&lt;/ul&gt;// Wrong&lt;br/&gt;char* blockOfMemory = (char* ) malloc(data.size());&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;char *blockOfMemory = reinterpret_cast&amp;lt;char *&amp;gt;(malloc(data.size()));&lt;ul&gt;&lt;li&gt;除了断行外，不要尝试用空白对齐一些东西&lt;/li&gt;&lt;/ul&gt;//Wrong&lt;br/&gt;x      = rect.x();&lt;br/&gt;y      = rect.y();&lt;br/&gt;width  = rect.width();&lt;br/&gt;height = rect.height();&lt;h2 id="A.2BWSdi7FP3-"&gt;大括号&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;基本原则：左大括号和语句保持在同一行&lt;/li&gt;&lt;/ul&gt;// Wrong&lt;br/&gt;if (codec)&lt;br/&gt;{&lt;br/&gt;}&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;if (codec) {&lt;br/&gt;}&lt;ul&gt;&lt;li&gt;例外：函数定义和类定义中，左大括号总是单独占一行&lt;/li&gt;&lt;/ul&gt;class Moo&lt;br/&gt;{&lt;br/&gt;};&lt;ul&gt;&lt;li&gt;控制语句的body中只有一行时不使用大括号&lt;/li&gt;&lt;/ul&gt;// Wrong&lt;br/&gt;if (address.isEmpty()) {&lt;br/&gt;    return false;&lt;br/&gt;}&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;if (address.isEmpty())&lt;br/&gt;    return false;&lt;br/&gt;&lt;br/&gt;if (x) {&lt;br/&gt;    // do something strange&lt;br/&gt;    yyyyyyyyy = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy +&lt;br/&gt;                zzzzzzzzzzzzzzzzzzzzzz;&lt;br/&gt;}&lt;ul&gt;&lt;li&gt;例外1：如果父语句跨多行，则使用大括号&lt;/li&gt;&lt;/ul&gt;// Correct&lt;br/&gt;if (address.isEmpty() || !isValid()&lt;br/&gt;      || !codec) {&lt;br/&gt;    return false;&lt;br/&gt;}&lt;ul&gt;&lt;li&gt;例外2：在if-else结构中，有一处跨多行，则使用大括号&lt;/li&gt;&lt;/ul&gt;// Wrong&lt;br/&gt;if (address.isEmpty())&lt;br/&gt;    return false;&lt;br/&gt;else {&lt;br/&gt;    qDebug("%s", qPrintable(address));&lt;br/&gt;    ++it;&lt;br/&gt;}&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;if (address.isEmpty()) {&lt;br/&gt;    return false;&lt;br/&gt;} else {&lt;br/&gt;    qDebug("%s", qPrintable(address));&lt;br/&gt;    ++it;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;// Wrong&lt;br/&gt;if (a)&lt;br/&gt;    if (b)&lt;br/&gt;        ...&lt;br/&gt;    else&lt;br/&gt;        ...&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;if (a) {&lt;br/&gt;    if (b)&lt;br/&gt;        ...&lt;br/&gt;    else&lt;br/&gt;        ...&lt;br/&gt;}&lt;ul&gt;&lt;li&gt;如果控制语句的body为空，则使用大括号&lt;/li&gt;&lt;/ul&gt;// Wrong&lt;br/&gt;while (a);&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;while (a) {}&lt;h2 id="A.2BVwZi7FP3-"&gt;圆括号&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;使用圆括号将表达式分组&lt;/li&gt;&lt;/ul&gt;// Wrong&lt;br/&gt;if (a &amp;amp;&amp;amp; b || c)&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;if ((a &amp;amp;&amp;amp; b) || c)&lt;br/&gt; &lt;br/&gt;// Wrong&lt;br/&gt;a + b &amp;amp; c&lt;br/&gt; &lt;br/&gt;// Correct&lt;br/&gt;(a + b) &amp;amp; c&lt;h2 id="switch.2Bi.2B1T5Q-"&gt;switch语句&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;case 和 switch 位于同一列&lt;/li&gt;&lt;li&gt;每一个case必须有一个break或renturn语句，或者用注释说明无需break&lt;/li&gt;&lt;/ul&gt;switch (myEnum) {&lt;br/&gt;case Value1:&lt;br/&gt;    doSomething();&lt;br/&gt;    break;&lt;br/&gt;case Value2:&lt;br/&gt;    doSomethingElse();&lt;br/&gt;    // fall through&lt;br/&gt;default:&lt;br/&gt;    defaultHandling();&lt;br/&gt;    break;&lt;br/&gt;}&lt;h2 id="A.2BZa2ITA-"&gt;断行&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;保持每行短于&lt;strong&gt;100&lt;/strong&gt;&amp;nbsp;个字符（注意补充部分），需要时进行断行&lt;/li&gt;&lt;li&gt;逗号放一行的结束，操作符放到一行的开头（操作符和同级的前一行对齐）&lt;/li&gt;&lt;/ul&gt;// Correct&lt;br/&gt;if (longExpression&lt;br/&gt;    + otherLongExpression&lt;br/&gt;    + otherOtherLongExpression) {&lt;br/&gt;}&lt;ul&gt;&lt;li&gt;&lt;p class="line862"&gt;例外：如果使用的 if 语句 和 &amp;amp;&amp;amp; 或者 ||，对齐需要一点调整(否则控制语句和body会较难以分辨)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;//Wrong&lt;br/&gt;if (dsfljfsfskjldsjkljklsjdk&lt;br/&gt;    &amp;amp;&amp;amp; fdsljsjdsdljklsjsjkdfs&lt;br/&gt;    &amp;amp;&amp;amp; dsfljkdfjkldksdfjdjkfdksfdkjld) {&lt;br/&gt;    sadjdjddadhsad;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//Correct&lt;br/&gt;if (dsfljfsfskjldsjkljklsjdk&lt;br/&gt;        &amp;amp;&amp;amp; fdsljsjdsdljklsjsjkdfs&lt;br/&gt;        &amp;amp;&amp;amp; dsfljkdfjkldksdfjdjkfdksfdkjld) {&lt;br/&gt;    sadjdjddadhsad;&lt;br/&gt;}&lt;p class="line874"&gt;对 whle 或else if，不存在这个问题：&lt;/p&gt;while (dsfljfsfskjldsjkljklsjdk&lt;br/&gt;       &amp;amp;&amp;amp; fdsljsjdsdljklsjsjkdfs&lt;br/&gt;       &amp;amp;&amp;amp; dsfljkdfjkldksdfjdjkfdksfdkjld) {&lt;br/&gt;    sadjdjddadhsad;&lt;br/&gt;}&lt;h3 id="A.2BiGVRRQ--1"&gt;补充&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Qt 例子中比前面的标准100严格一点，采用的是80.&lt;/li&gt;&lt;li&gt;Qt Quarterly 中采用的是 58&lt;/li&gt;&lt;li&gt;Qt 书籍中采用的是 68 (?)&lt;/li&gt;&lt;/ul&gt;&lt;h2 id="A.2Bfudif04O-virtual"&gt;继承与virtual&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;重新实现一个虚函数时，头文件中不放置 virtual 关键字&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/chuncn/aggbug/2526397.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chuncn/archive/2012/05/30/2526397.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chuncn/archive/2012/04/07/2436614.html</id><title type="text">win32里玩事件-转</title><summary type="text">#include "stdafx.h"#include &lt;stdio.h&gt;#include &lt;windows.h&gt;#include &lt;iostream&gt;#include &lt;process.h&gt;#define UM_MSG1 WM_USER+1#define UM_MSG2 WM_USER+2DWORD WINAPI Thread1(LPVOID para){DWORD dwThreadId = *(DWORD *)para;DWORD i=0;TCHAR *p;char strTmp[100];while(TRUE)</summary><published>2012-04-07T14:06:00Z</published><updated>2012-04-07T14:06:00Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chuncn/archive/2012/04/07/2436614.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/archive/2012/04/07/2436614.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#include "stdafx.h"&lt;br/&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br/&gt;#include &amp;lt;windows.h&amp;gt;&lt;br/&gt;#include &amp;lt;iostream&amp;gt;&lt;br/&gt;#include &amp;lt;process.h&amp;gt;&lt;br/&gt;&lt;br/&gt;#define UM_MSG1 WM_USER+1&lt;br/&gt;#define UM_MSG2 WM_USER+2&lt;br/&gt;&lt;br/&gt;DWORD WINAPI Thread1(LPVOID para)&lt;br/&gt;{&lt;br/&gt;DWORD dwThreadId = *(DWORD *)para;&lt;br/&gt;DWORD i=0;&lt;br/&gt;TCHAR *p;&lt;br/&gt;char strTmp[100];&lt;br/&gt;while(TRUE)&lt;br/&gt;{&lt;br/&gt;Sleep(1700);        &lt;br/&gt;p=new TCHAR[10];&lt;br/&gt;sprintf(strTmp,"Hello %d %x",i++,p);&lt;br/&gt;PostThreadMessage(dwThreadId,UM_MSG1,(WPARAM)strTmp,(LPARAM)p);&lt;br/&gt;//delete []p;&lt;br/&gt;}&lt;br/&gt;return 0;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;DWORD WINAPI Thread2(LPVOID para)&lt;br/&gt;{&lt;br/&gt;char strTmp[100];&lt;br/&gt;DWORD dwThreadId = *(DWORD *)para;&lt;br/&gt;DWORD i=0;&lt;br/&gt;TCHAR *p;&lt;br/&gt;while(TRUE)&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;Sleep(3000);&lt;br/&gt;p=new TCHAR[10];&lt;br/&gt;sprintf(strTmp,"World %d %x",i++,p);&lt;br/&gt;PostThreadMessage(dwThreadId,UM_MSG2,(WPARAM)strTmp,(LPARAM)p);&lt;br/&gt;delete []p;&lt;br/&gt;}&lt;br/&gt;return 0;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;int _tmain(int argc, _TCHAR* argv[])&lt;br/&gt;{&lt;br/&gt;DWORD dwValue =GetCurrentThreadId();&lt;br/&gt;HANDLE hThread1 = CreateThread(NULL,0,&amp;amp;Thread1,&amp;amp;dwValue,0,NULL);&lt;br/&gt;HANDLE hThread2 = CreateThread(NULL,0,&amp;amp;Thread2,&amp;amp;dwValue,0,NULL);&lt;br/&gt;CloseHandle(hThread1);&lt;br/&gt;CloseHandle(hThread2);&lt;br/&gt;MSG msg;&lt;br/&gt;while(GetMessage(&amp;amp;msg,NULL,0,0))&lt;br/&gt;{&lt;br/&gt;switch(msg.message)&lt;br/&gt;{&lt;br/&gt;case UM_MSG1:&lt;br/&gt;case UM_MSG2:&lt;br/&gt;printf("msg:0x%x      w:%x   ws:%s     l:%x\n",msg.message,&amp;amp;msg.wParam,msg.wParam,msg.lParam);&lt;br/&gt;delete [](TCHAR *)msg.lParam;  //注释掉这句你就会看到堆内存地址变化&lt;br/&gt;break;&lt;br/&gt;default:&lt;br/&gt;printf("Unknown msg:0x%x\n",msg.message);&lt;br/&gt;break;&lt;br/&gt;}&lt;br/&gt;Sleep(1);&lt;br/&gt;}&lt;br/&gt;return 0;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chuncn/aggbug/2436614.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chuncn/archive/2012/04/07/2436614.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chuncn/archive/2012/04/01/2429305.html</id><title type="text">c++中捕捉内存泄露、异常</title><summary type="text">//在Watch面板加上可以观察当前断点处最后一条异常信息:@err,hr#include "stdafx.h"#include &lt;iostream&gt;using namespace std;#ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif#define _CRTDBG_MAP_ALLOC#include &lt;stdlib.h&gt;#include &lt;crtdbg.h&gt;</summary><published>2012-04-01T12:21:00Z</published><updated>2012-04-01T12:21:00Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chuncn/archive/2012/04/01/2429305.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/archive/2012/04/01/2429305.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;//在Watch面板加上可以观察当前断点处最后一条异常信息:@err,hr&lt;br /&gt;&lt;br /&gt;#include "stdafx.h"&lt;br/&gt;#include &amp;lt;iostream&amp;gt;&lt;br/&gt;using namespace std;&lt;br/&gt;&lt;br/&gt;#ifdef _DEBUG&lt;br/&gt;#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)&lt;br/&gt;#else&lt;br/&gt;#define DEBUG_CLIENTBLOCK&lt;br/&gt;#endif&lt;br/&gt;&lt;br/&gt;#define _CRTDBG_MAP_ALLOC&lt;br/&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br/&gt;#include &amp;lt;crtdbg.h&amp;gt;&lt;br/&gt;#include &amp;lt;string.h&amp;gt;&lt;br/&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br/&gt;&lt;br/&gt;#ifdef _DEBUG&lt;br/&gt;#define new DEBUG_CLIENTBLOCK&lt;br/&gt;#endif&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;int _tmain(int argc, _TCHAR* argv[])&lt;br/&gt;{&lt;br/&gt;_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);&lt;br/&gt; &amp;nbsp;//_CrtSetBreakAlloc(52); &lt;br /&gt;char* d;&lt;br/&gt;int *p;&lt;br/&gt;d= (char*)malloc(100);&lt;br/&gt;p = new int;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/***这两行注释与不注释结果不一样&lt;br/&gt;free(d);&lt;br/&gt;delete p;&lt;br/&gt;***/&lt;br/&gt;&lt;br/&gt;_CrtDumpMemoryLeaks();&lt;br/&gt;&lt;br/&gt;system("pause");&lt;br/&gt;&lt;br/&gt;return 0;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;在&lt;a href="http://www.cnblogs.com/view/100377.htm" target="_blank"&gt;Visual C++&lt;/a&gt; 中，可以在监视窗口添加 $err,hr &lt;br /&gt;一行来实时现实错误。调试过程中，该项相当于在每次调用API函数之后调用GetLastError函数。其值由两部分组成，一个是错误代码（十六进制），另一个是错误代码所对应的文本提示。该方法支持多语言&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chuncn/aggbug/2429305.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chuncn/archive/2012/04/01/2429305.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chuncn/archive/2012/03/26/2417889.html</id><title type="text">win32 http download</title><summary type="text">HTTPClient.h#pragma once#ifndef HTTPClient_H_#define HTTPClient_H_#include &lt;string&gt;using namespace std;class HTTPClient{public: HTTPClient(void); ~HTTPClient(void); bool DownloadFile(string serverName,int port,string sourcePath, string fileName, string localDirectory);};#endif HTTPClient.c...</summary><published>2012-03-26T06:49:00Z</published><updated>2012-03-26T06:49:00Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chuncn/archive/2012/03/26/2417889.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/archive/2012/03/26/2417889.html"/><content type="html">&lt;p&gt;HTTPClient.h&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#pragma once&lt;br/&gt;#ifndef HTTPClient_H_&lt;br/&gt;#define HTTPClient_H_&lt;br/&gt;&lt;br/&gt;#include &amp;lt;string&amp;gt;&lt;br/&gt;using namespace std;&lt;br/&gt;&lt;br/&gt;class HTTPClient&lt;br/&gt;{&lt;br/&gt;public:&lt;br/&gt;    HTTPClient(void);&lt;br/&gt;    ~HTTPClient(void);&lt;br/&gt;&lt;br/&gt;    bool DownloadFile(string serverName,int port,string sourcePath, string fileName, string localDirectory);&lt;br/&gt;};&lt;br/&gt;#endif&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;HTTPClient.cpp&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#include "StdAfx.h"&lt;br/&gt;#include "HTTPClient.h"&lt;br/&gt;#include &amp;lt;winsock.h&amp;gt;&lt;br/&gt;#include &amp;lt;fstream&amp;gt;&lt;br/&gt;//#include "Log.h"&lt;br/&gt;#pragma comment(lib,"ws2_32.lib")&lt;br/&gt;&lt;br/&gt;HTTPClient::HTTPClient(void)&lt;br/&gt;{&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;HTTPClient::~HTTPClient(void)&lt;br/&gt;{&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;bool HTTPClient::DownloadFile(string serverName,int port, string sourcePath, string fileName, string localDirectory)&lt;br/&gt;{&lt;br/&gt;//Log &amp;amp;log = Log::getLog("HTTPClient","DownloadFile");&lt;br/&gt;//log.debug("\nserverName = %s; sourcePath = %s; fileName = %s\n",serverName.c_str(),sourcePath.c_str(),fileName.c_str());&lt;br/&gt;&lt;br/&gt;WSADATA wsaData;&lt;br/&gt;int nRet;&lt;br/&gt;&lt;br/&gt;//&lt;br/&gt;// Initialize WinSock.dll&lt;br/&gt;//&lt;br/&gt;nRet = WSAStartup(0x101, &amp;amp;wsaData);&lt;br/&gt;if (nRet)&lt;br/&gt;{&lt;br/&gt;//log.debug("\nWinSock.dll initialize failed. WSAStartup(): %d\n", nRet);&lt;br/&gt;WSACleanup();&lt;br/&gt;return false;&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;//log.debug("\nWSAStartup success!\n");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//&lt;br/&gt;// Check WinSock version&lt;br/&gt;//&lt;br/&gt;if (wsaData.wVersion != 0x101)&lt;br/&gt;{&lt;br/&gt;//log.debug("\nWinSock version not supported\n");&lt;br/&gt;WSACleanup();&lt;br/&gt;return false;&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;//log.debug("\nwsaData.wVersion ==0x101\n");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;ofstream fout;&lt;br/&gt;string newfile = localDirectory + fileName;&lt;br/&gt;fout.open(newfile.c_str(),ios_base::binary);&lt;br/&gt;if(!fout.is_open())&lt;br/&gt;{&lt;br/&gt;//log.debug("open newfile error!");&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;//log.debug("open local newfile success!");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;IN_ADDR        iaHost;&lt;br/&gt;LPHOSTENT    lpHostEntry;&lt;br/&gt;&lt;br/&gt;iaHost.s_addr = inet_addr(serverName.c_str());&lt;br/&gt;if (iaHost.s_addr == INADDR_NONE)&lt;br/&gt;{&lt;br/&gt;// Wasn't an IP address string, assume it is a name&lt;br/&gt;lpHostEntry = gethostbyname(serverName.c_str());&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;// It was a valid IP address string&lt;br/&gt;lpHostEntry = gethostbyaddr((const char *)&amp;amp;iaHost, &lt;br/&gt;sizeof(struct in_addr), AF_INET);&lt;br/&gt;}&lt;br/&gt;if (lpHostEntry == NULL)&lt;br/&gt;{&lt;br/&gt;//log.debug("gethostbyname() error");&lt;br/&gt;return false;&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;//log.debug("gethostbyname() success!");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//    &lt;br/&gt;// Create a TCP/IP stream socket&lt;br/&gt;//&lt;br/&gt;SOCKET    Socket;    &lt;br/&gt;&lt;br/&gt;Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);&lt;br/&gt;if (Socket == INVALID_SOCKET)&lt;br/&gt;{&lt;br/&gt;//log.debug("socket() error"); &lt;br/&gt;return false;&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;//log.debug("socket() success!");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//&lt;br/&gt;// Find the port number for the HTTP service on TCP&lt;br/&gt;//&lt;br/&gt;SOCKADDR_IN saServer;&lt;br/&gt;//LPSERVENT lpServEnt;&lt;br/&gt;&lt;br/&gt;//lpServEnt = getservbyname("http", "tcp");&lt;br/&gt;//if (lpServEnt == NULL)&lt;br/&gt;//saServer.sin_port = htons(80);&lt;br/&gt;//else&lt;br/&gt;//saServer.sin_port = lpServEnt-&amp;gt;s_port;&lt;br/&gt;&lt;br/&gt;saServer.sin_port = htons(port);&lt;br/&gt;&lt;br/&gt;//&lt;br/&gt;// Fill in the rest of the server address structure&lt;br/&gt;//&lt;br/&gt;saServer.sin_family = AF_INET;&lt;br/&gt;saServer.sin_addr = *((LPIN_ADDR)*lpHostEntry-&amp;gt;h_addr_list);&lt;br/&gt;&lt;br/&gt;//&lt;br/&gt;// Connect the socket&lt;br/&gt;//&lt;br/&gt;nRet = connect(Socket, (LPSOCKADDR)&amp;amp;saServer, sizeof(SOCKADDR_IN));&lt;br/&gt;if (nRet == SOCKET_ERROR)&lt;br/&gt;{&lt;br/&gt;//log.debug("connect() error");&lt;br/&gt;closesocket(Socket);&lt;br/&gt;return false;&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;//log.debug("connect() success!");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//&lt;br/&gt;// Format the HTTP request&lt;br/&gt;//&lt;br/&gt;char szBuffer[1024];&lt;br/&gt;&lt;br/&gt;string requestFile = sourcePath + fileName;&lt;br/&gt;&lt;br/&gt;sprintf(szBuffer, "GET %s\n", requestFile.c_str());&lt;br/&gt;//log.debug("sended GET %s Request",requestFile.c_str());&lt;br/&gt;nRet = send(Socket, szBuffer, strlen(szBuffer), 0);&lt;br/&gt;if (nRet == SOCKET_ERROR)&lt;br/&gt;{&lt;br/&gt;//log.debug("send() error");&lt;br/&gt;closesocket(Socket);    &lt;br/&gt;return false;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//&lt;br/&gt;// Receive the file contents and print to stdout&lt;br/&gt;//&lt;br/&gt;while(1)&lt;br/&gt;{&lt;br/&gt;// Wait to receive, nRet = NumberOfBytesReceived&lt;br/&gt;nRet = recv(Socket, szBuffer, sizeof(szBuffer), 0);&lt;br/&gt;if (nRet == SOCKET_ERROR)&lt;br/&gt;{&lt;br/&gt;//log.debug("recv() error");&lt;br/&gt;break;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;//log.debug("\nrecv() returned %d bytes", nRet);&lt;br/&gt;// Did the server close the connection?&lt;br/&gt;if (nRet == 0)&lt;br/&gt;break;&lt;br/&gt;// Write to stdout&lt;br/&gt;//        fwrite(szBuffer, nRet, 1, stdout);&lt;br/&gt;fout.write(szBuffer,nRet);&lt;br/&gt;}&lt;br/&gt;closesocket(Socket);    &lt;br/&gt;fout.close();&lt;br/&gt;&lt;br/&gt;WSACleanup();&lt;br/&gt;return true;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;调用示例:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#include "stdafx.h"&lt;br/&gt;#include "HTTPClient.h"&lt;br/&gt;&lt;br/&gt;int _tmain(int argc, _TCHAR* argv[])&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;HTTPClient* client;&lt;br/&gt;client=new HTTPClient();&lt;br/&gt;bool a = client-&amp;gt;DownloadFile("127.0.0.1",80,"/","KeyBoardSelectionComboBox.zip","c:\\");&lt;br/&gt;bool b = client-&amp;gt;DownloadFile("www.zt.cn",88,"/ClientBin/","Main.xap","c:\\");&lt;br/&gt;&lt;br/&gt;return 0;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chuncn/aggbug/2417889.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chuncn/archive/2012/03/26/2417889.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chuncn/archive/2012/03/23/2413082.html</id><title type="text">win32 DirectUI控件开发与调用指南</title><summary type="text">相较于win32/mfc，directui(win32)更加轻量化，在开发方式上更加现代化，使得其在c++应用方面成为主流，官方中提到了可以开发控件（插件），也就是说新的库可以不写在dui里，而独立出来。研究了许久终于知道如何玩，故此总结一下：一、创建Dui DLL控件库 使用vc或vs创建一个win32 dll类型的项目，头文件PriceTableUI.h如下：#pragma onceclass DuiLib_API PriceTableUI : public CContainerUI//注意要导出类{public:PriceTableUI();~PriceTableUI();L...</summary><published>2012-03-22T23:54:00Z</published><updated>2012-03-22T23:54:00Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chuncn/archive/2012/03/23/2413082.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/archive/2012/03/23/2413082.html"/><content type="html">&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/chuncn/314273/o_dui2.png" alt="" width="800" height="572" /&gt;&lt;/p&gt;&lt;p&gt;相较于win32/mfc，directui(win32)更加轻量化，在开发方式上更加现代化，使得其在c++应用方面成为主流，官方中提到了可以开发控件（插件），也就是说新的库可以不写在dui里，而独立出来。研究了许久终于知道如何玩，故此总结一下：&lt;/p&gt;&lt;p&gt;一、创建Dui DLL控件库&lt;/p&gt;&lt;p&gt;使用vc或vs创建一个win32 dll类型的项目，头文件PriceTableUI.h如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#pragma once&lt;br/&gt;&lt;br/&gt;class DuiLib_API PriceTableUI : public CContainerUI//注意要导出类&lt;br /&gt;{&lt;br/&gt;public:&lt;br/&gt;PriceTableUI();&lt;br/&gt;~PriceTableUI();&lt;br/&gt;LPCTSTR GetClass() const;&lt;br/&gt;LPVOID GetInterface(LPCTSTR pstrName);&lt;br/&gt;void DoEvent(TEventUI&amp;amp; event);&lt;br/&gt;void PaintText(HDC hDC);&lt;br/&gt;};&lt;br/&gt;&lt;/div&gt;&lt;p&gt;对应的代码PriceTableUI.cpp如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#include "StdAfx.h"&lt;br/&gt;#include "PriceTableUI.h"&lt;br/&gt;&lt;br/&gt;PriceTableUI::PriceTableUI()&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;PriceTableUI::~PriceTableUI()&lt;br/&gt;{&lt;br/&gt;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;LPCTSTR PriceTableUI::GetClass() const&lt;br/&gt;{&lt;br/&gt;return _T("PriceTableUI");&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;LPVOID PriceTableUI::GetInterface( LPCTSTR pstrName )&lt;br/&gt;{&lt;br/&gt;if( _tcscmp(pstrName, _T("PriceTable")) == 0 )&lt;br/&gt;return static_cast&amp;lt;PriceTableUI*&amp;gt;(this);&lt;br/&gt;&lt;br/&gt;return CControlUI::GetInterface(pstrName);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;void PriceTableUI::DoEvent( TEventUI&amp;amp; event )&lt;br/&gt;{&lt;br/&gt;if( event.Type == UIEVENT_SETFOCUS ) &lt;br/&gt;{&lt;br/&gt;m_bFocused = true;&lt;br/&gt;return;&lt;br/&gt;}&lt;br/&gt;if( event.Type == UIEVENT_KILLFOCUS ) &lt;br/&gt;{&lt;br/&gt;m_bFocused = false;&lt;br/&gt;return;&lt;br/&gt;}&lt;br/&gt;if( event.Type == UIEVENT_MOUSEENTER )//鼠标进入控件&lt;br/&gt;{&lt;br/&gt;return;&lt;br/&gt;}&lt;br/&gt;if( event.Type == UIEVENT_MOUSELEAVE )//鼠标离开控件&lt;br/&gt;{&lt;br/&gt;return;&lt;br/&gt;}&lt;br/&gt;//其它事件（消息）go to 到dui里自己看了&lt;br/&gt;CControlUI::DoEvent(event);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;void PriceTableUI::PaintText( HDC hDC )&lt;br/&gt;{&lt;br/&gt;RECT rect = m_rcPaint;&lt;br/&gt;&lt;br/&gt;HBRUSH redHBrush =  CreateSolidBrush(RGB(255,0,0));&lt;br/&gt;&lt;br/&gt;FillRect(hDC,&amp;amp;rect,redHBrush);&lt;br/&gt;TextOut(hDC,rect.left,rect.top,"china mobile",strlen("china mobile"));&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;为了简化，这个示例没有对基类函数进一步实现，有需求自行去dui库里复制过来或者自己扩展即可。&lt;/p&gt;&lt;p&gt;二、在主程序中定向自定义控件&lt;/p&gt;&lt;p&gt;ControlEx.h如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;#pragma once&lt;br/&gt;#include "stdafx.h"&lt;br/&gt;&lt;br/&gt;class CDialogBuilderCallbackEx : public IDialogBuilderCallback&lt;br/&gt;{&lt;br/&gt;public:&lt;br/&gt;CControlUI* CreateControl(LPCTSTR pstrClass) &lt;br/&gt;{&lt;br/&gt;if( _tcscmp(pstrClass, "PriceTable") == 0 )&lt;br/&gt;return new PriceTableUI;&lt;br/&gt;&lt;br/&gt;return NULL;&lt;br/&gt;}&lt;br/&gt;};&lt;br/&gt;&lt;/div&gt;&lt;p&gt;三、调用控件&lt;/p&gt;&lt;p&gt;如此，即可在dui的xml界面文件里使用&amp;lt;PriceTable /&amp;gt;或在程序中调用，比如：&lt;/p&gt;&lt;p&gt;PriceTableUI* table=static_cast&amp;lt;PriceTableUI*&amp;gt;(m_pm.FindControl("table1"));&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chuncn/aggbug/2413082.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chuncn/archive/2012/03/23/2413082.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chuncn/archive/2012/03/02/2376917.html</id><title type="text">Windows 8小技巧集锦(50项)</title><summary type="text">1、锁屏 启动之后，用户将首先看到Windows 8的锁屏界面，每当系统启动、恢复或登录的时候，锁屏就会出现。如果您使用的是触摸屏设备，那么用手指一扫然后输入密码就可以登录系统。如果不是触摸屏设备，那么就用鼠标点击之后就能够登录系统。2、Metro主屏 当用户登录Windows 8系统之后，新的Metro启动屏幕就会出现，上面铺满了瓦片式的程序。当然了，如果您不喜欢某个应用程序，您也可以右击将其移除，然后按照自己的喜好重新排列应用程序的位置。3、简化的开始菜单 Metro用户界面具备自己的开始菜单，其中包含一些简单的选项，如设置、设备、共享和搜索等。4、运行任何程序 按住Win...</summary><published>2012-03-02T04:31:00Z</published><updated>2012-03-02T04:31:00Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chuncn/archive/2012/03/02/2376917.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/archive/2012/03/02/2376917.html"/><content type="html">&lt;p&gt;&lt;strong&gt;1、锁屏&lt;/strong&gt; 启动之后，用户将首先看到Windows 8的锁屏界面，每当系统启动、恢复或登录的时候，锁屏就会出现。如果您使用的是触摸屏设备，那么用手指一扫然后输入密码就可以登录系统。如果不是触摸屏设备，那么就用鼠标点击之后就能够登录系统。&lt;br /&gt;&lt;strong&gt;2、Metro主屏&lt;/strong&gt; 当用户登录Windows 8系统之后，新的Metro启动屏幕就会出现，上面铺满了瓦片式的程序。当然了，如果您不喜欢某个应用程序，您也可以右击将其移除，然后按照自己的喜好重新排列应用程序的位置。&lt;br /&gt;&lt;strong&gt;3、简化的开始菜单&lt;/strong&gt; Metro用户界面具备自己的开始菜单，其中包含一些简单的选项，如设置、设备、共享和搜索等。&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;4、运行任何程序&lt;/strong&gt;&lt;/span&gt; 按住Windows键或者是Win+F就可以打来搜索窗口，键入程序的名称就可以打开指定的应用程序。&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;5、任务切换&lt;/strong&gt;&lt;/span&gt; Metro屏幕不具备任务栏，因此用户很容易会找不到那些运行的应用程序，这种情况下，用户只需按住Alt+Tab键就能够查看正在运行的应用程序，而按住Win+Tab键则能够自一个正在运行的应用程序切换到下一个应用程序。&lt;br /&gt;&lt;strong&gt;6、关闭应用程序&lt;/strong&gt; Metro应用程序不包含一个&amp;ldquo;关闭&amp;rdquo;按钮，其实这是微软的故意设计，当运行另外一个应用程序的时候，当前的应用程序就会被挂起，当资源不足时，系统就会自动关闭这个应用程序。&lt;br /&gt;当然了，用户也可以手动关闭应用程序，按住Ctrl+Alt+Esc就可打开任务管理器，右击多余的应用程序选择终止任务即可。&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;7、关闭系统&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;如果想要在Metro界面中关闭系统，那么只需调出设置对话框，点击电源按钮，然后关闭即可。当然了，如果处于桌面状态，您也可以按住Alt+F4，然后选择关闭、重启、切换用户或注销等选项。&lt;br /&gt;&lt;strong&gt;8、Metro Internet Explorer&lt;/strong&gt; 点击IE的Metro窗格，一个全屏版的浏览器就会出现，它是一个触摸友好的浏览器，鼠标用户当然也有一些优势：右击即可将网站固定到Metro屏幕中，例如打开一个新的浏览器标签或切换到旧标签。&lt;br /&gt;当然了，如果您喜爱的是旧式IE界面，那么只需在桌面中启动IE浏览器即可，或者是按住Windows键再按1即可。&lt;br /&gt;&lt;strong&gt;9、多屏显示&lt;/strong&gt;&lt;br /&gt;正常情况下，Metro应用程序是全屏运行的，但是如果您运行的是触摸屏设备，那么也可同时查看两个应用程序。&lt;br /&gt;&lt;strong&gt;10、查询天气&lt;/strong&gt;&lt;br /&gt;一般情况下，很多绑定的Metro应用程序都能够通过右击重新配置。默认情况下，天气应用程序是显示加利福尼亚州阿纳海姆市的天气，如果用户想要查看本地天气的话，只需右击选择添加城市，键入距离最近的城市名称即可。&lt;br /&gt;&lt;strong&gt;11、拼写检查&lt;/strong&gt; Metro应用程序都具备拼写检查功能，与Office相似。一旦出现错误，违规词下方就会显示一个红色波浪下划线，右击就可看到建议的替代字词，用户还可以将这些字词添加到自己的字典中。&lt;br /&gt;&lt;strong&gt;12、以管理员身份运行&lt;/strong&gt; 有些应用程序只有在管理员权限下方可运行，只需右击应用程序，点击&amp;ldquo;高级&amp;rdquo;，选择&amp;ldquo;以管理员身份运行&amp;rdquo;选项即可。&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;13、休眠或睡眠&lt;/strong&gt;&lt;/span&gt; 默认情况下，休眠或睡眠选项是不会出现在 Windows 8关闭对话框中的，但是用户可以恢复它们。&lt;br /&gt;启动电源选项程序(powercfg.cpl)，点击左侧窗格中的&amp;ldquo;选择电源按钮运行状况&amp;rdquo;，如果看到&amp;ldquo;更改当前不可用&amp;rdquo;的链接，点击它，选择&amp;ldquo;休眠或睡眠&amp;rdquo;选项，点击保存设置，此后&amp;ldquo;休眠或睡眠&amp;rdquo;选项就会出现在关闭对话框中。&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;14、自动登录&lt;/strong&gt;&lt;/span&gt; 厌倦手动登录Windows 8?下面就是自动登录Windows 8的方法：按住Windows键，按R，键入netplwiz然后按回车键启动用户账户对话框。清除&amp;ldquo;用户必须输入用户名和密码才能使用这台计算机&amp;rdquo;复选框，点击&amp;ldquo;确定&amp;rdquo;即可。&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;15、Windows 8中的Windows快捷键&lt;/strong&gt;&lt;/span&gt; 虽然Windows Metro用户界面主要是针对触摸屏设计的，但是它支持大多数的旧Windows快捷键。&lt;br /&gt;Win + C ：显示Charms，如设置、设备、共享和搜索等选项;&lt;br /&gt;Win + D：启动桌面;&lt;br /&gt;Win + E：启动资源管理器;&lt;br /&gt;Win + F：打开搜索;&lt;br /&gt;Win + I：打开设置;&lt;br /&gt;Win + L：锁定您的电脑;&lt;br /&gt;Win + P：将您的显示器切换到第二显示器或投影仪;&lt;br /&gt;Win + R：打开运行框;&lt;br /&gt;Win + U：打开轻松访问中心;&lt;br /&gt;Win + W：搜索您的系统设置;&lt;br /&gt;Win + Z：当打开一个全屏Metro应用程序时，显示右击上下文菜单;&lt;br /&gt;Win + ：放大;&lt;br /&gt;Win &amp;mdash;：缩小;&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;16、快速启动应用程序&lt;/strong&gt;&lt;/span&gt; 如果您习惯使用键盘设备，不想要滚动去查找所需的应用程序，那么别担心，Windows 8还支持一个有用的老式快捷方式。&lt;br /&gt;打开桌面，启动媒体播放器，右击它的任务栏图标，选择固定这个程序到任务栏。关闭媒体播放器，拖动它的任务栏图标到最左边，与之任务栏按钮紧靠，然后再次按住Windows键切换到Metro用户界面。&lt;br /&gt;按住Windows键，按下1，您就会看到桌面出现，而媒体播放器也启动了。当然了，用户也可以按住Windows+2或3键去启动第二(默认是IE)或第三个图标(默认是任务管理器)。&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;17、查看所有已安装的应用程序&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Windows 8中不再显示开始菜单，这意味着用户不能够轻易地看到系统中的所有非Metro应用程序。除非用户按住Windows+F键去查看搜索对话框，您将会看到一个按字母顺序排列的已安装应用程序列表，点击即可启动它。&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;18、关机快捷键&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;最快速的关机方式就是通过一个合适的快捷方式，启动桌面应用程序，右击桌面上的空白部分，单击新建快捷方式。&lt;br /&gt;输入shutdown.exe -s -t 00是关闭计算机;&lt;br /&gt;输入shutdown.exe -h -t 00是休眠计算机;&lt;br /&gt;点击下一步，输入一个快捷方式名称，点击完成。&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;19、恢复&amp;ldquo;开始&amp;rdquo;菜单&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;如果您不喜欢Metro用户界面，那么可以通过以下方式去恢复到一个更加传统的Windows外观：启动REGEDIT(注册表)然后浏览至 HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorer，双击 RPEnabled，然后将其参数值自1调为0去移除Metro、新任务栏和新开始菜单等。&lt;br /&gt;另外，设置RPEnabled的参数值为2是移除Metro，恢复开始菜单并且保留Windows 8中大多数的其他改进。&lt;br /&gt;&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;20、自桌面启动Metro应用程序&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;将大多数时间花在桌面上并不意味着放弃Metro应用程序，在桌面中创建一个名为&amp;ldquo;应用程序&amp;rdquo;的文件夹，然后打开它就会发现Metro屏幕中的每个应用程序图标以及其他的Windows小程序。如果您想要打开一个特定的Metro应用程序，那么打开这个文件夹，双击这个应用程序的图标即可。&lt;br /&gt;Win + Tab：在打开的应用程序之间切换。&lt;br /&gt;&lt;strong&gt;21、自USB闪存驱动器安装Windows 8&lt;/strong&gt; 如果您想要自USB闪存驱动器安装Windows 8操作系统，而不是DVD，那么Windows 7 USB/DVD下载工具可以帮助您。用户可以将 Windows 7 USB/DVD下载工具指向Windows 8 ISO文件，然后它就能够在USB驱动器上创建一个可启动的Windows 8安装程序。&lt;br /&gt;&lt;strong&gt;22、SmartScreen&lt;/strong&gt; Windows 8全系统都使用IE的SmartScreen安全功能，检查下载文件去确保它们的安全。但是，如果用户不想要SmartScreen功能的话，那么也可以对其进行调整，按住Windows+R键，键入control.exe，回车启动旧式控制面板。&lt;br /&gt;打开行动中心面板，点击更改SmartScreen设置，这样一来，用户就可以开启警告，但是避免打扰到自己，或者是直接关闭SmartScreen功能。&lt;br /&gt;&lt;strong&gt;23、64位IE&lt;/strong&gt; 如果您使用的是64位Windows 8，那么它的IE副本运行的也是64位模式，不过需要用户手动开启。&lt;br /&gt;点击工具互联网选项安全，选择您想要调整的安全区域，选中启动64位模式，点击确定，重启即可。&lt;br /&gt;&lt;strong&gt;24、虚拟机器&lt;/strong&gt; 安装Windows 8之后，您还可获得微软的Hyper-V虚拟功能，它允许您创建和运行虚拟机器。启动OptionalFeatures.exe，检查Hyper-V，然后点击确定去启用Hyper-V功能。&lt;br /&gt;切换到Metro用户界面，滑动到右侧的Hyper-V瓦片去开始探索这个功能。&lt;br /&gt;&lt;strong&gt;25、早期推出反恶意软件功能&lt;/strong&gt;&lt;br /&gt;当Windows 8系统启动之后，它能够选择性地决定初始化哪个驱动程序、拒绝加载可疑或未知的驱动程序去保证您的计算机免受感染。&lt;br /&gt;不过，用户需要手动去启动这个反恶意软件功能，启动GPEDIT.MSC，浏览至计算机配置管理模板系统早期启动恶意软件，双击右侧启动初始化驱动程序安装策略，选择您想要的选项即可。&lt;br /&gt;当然了，笔者需要提醒大家的是，如果这个反恶意软件不小心阻止了一个合法驱动程序的话，那么您的系统可能会崩溃。&lt;br /&gt;&lt;strong&gt;26、Windows 8文件历史记录&lt;/strong&gt;&lt;br /&gt;Windows 8包含一个很好的文件历史功能，它能够备份任何用户选定的文件。&lt;br /&gt;&lt;strong&gt;27、USB驱动器&lt;/strong&gt; 将USB驱动器连接到Windows 8系统中，自菜单中选择&amp;ldquo;配置这个驱动器去备份使用的文件历史&amp;rdquo;，默认情况下，用户的库、联系人、收藏夹和桌面内容将会被立即备份。&lt;br /&gt;&lt;strong&gt;28、控制面板&lt;/strong&gt; 当点击新的Metro控制面板瓦片的时候，Windows 8自定义的过程就开始了。例如，点击个性化，您就可以更改您的锁屏图片;点击屏幕顶部的&amp;ldquo;用户&amp;rdquo;瓦片，您就可以更改代表您账户的图片。&lt;br /&gt;&lt;strong&gt;29、图片密码&lt;/strong&gt; Windows 8允许用户创建图片密码，选择一个图片，然后在上面拖动绘制出波浪线、直线和圆圈组合，此后，只有能够重现此模式的人才能够登录系统。&lt;br /&gt;点击控制面板用户创建一个图片密码。&lt;br /&gt;&lt;strong&gt;30、简化搜索&lt;/strong&gt; 在默认情况下，Windows 8在其搜索结果中包含每一个绑定的应用程序，如果您不想看到某些应用程序，那么点击Metro屏幕上的控制面板，选择搜索，选择不想看到的应用程序。这样一来，用户的列表将会更加易于管理。&lt;br /&gt;&lt;strong&gt;31、触摸式键盘&lt;/strong&gt; 在默认情况下，触摸式键盘是对用户来讲是非常有益的，例如在用户键入的时候播放声音，将每句话开头的第一个字母自动调整为大写，双击空格键的时候留出空间等。如果其中某个功能是您不喜欢的话，那么进入控制面板自定义键盘去满足您的需求。&lt;br /&gt;&lt;strong&gt;32、选择性地同步&lt;/strong&gt; Windows 8能够跨越每个系统去同步设置，这听起来不错，但是却很容易导致隐私问题，它会同步互联网历史、密码等。如果这个不符合您的需求的话，那么您可以自Metro控制面板去自定义同步，点击同步PC设置，并选择您中意的选项。&lt;br /&gt;&lt;strong&gt;33、完整的控制面板&lt;/strong&gt; 按住Windows+R键，键入Control.exe并按下回车，能够直接打开一个完整的控制面板。&lt;br /&gt;&lt;strong&gt;34、Windows 8资源管理器&lt;/strong&gt; 如今，Windows 8资源管理器中包含一个Ribbon用户界面。&lt;br /&gt;&lt;strong&gt;35、隐藏Ribbon&lt;/strong&gt; 如果您觉得ribbon占用了太大的空间，以下就是隐藏ribbon的方法：按住Windows+R键，输入gpedit.msc按回车，点击计算机配置管理模板Windows组件Windows资源管理器区。&lt;br /&gt;双击&amp;ldquo;最小化ribbon启动Windows资源管理器&amp;rdquo;，启用这个功能即可。&lt;br /&gt;&lt;strong&gt;36、快速访问工具栏&lt;/strong&gt; 最新的资源管理器包含一个快速访问工具栏功能，使得用户能够简易地访问&amp;ldquo;新建文件夹&amp;rdquo;、&amp;ldquo;最小化&amp;rdquo;以及&amp;ldquo;撤销删除&amp;rdquo;等选项。&lt;br /&gt;&lt;strong&gt;37、磁盘错误检查&lt;/strong&gt; 当检查驱动器错误的时候，Windows 8还提供了一个额外的选项，一个是&amp;ldquo;扫描驱动器&amp;rdquo;选项，另外一个就是新的&amp;ldquo;扫描和修复&amp;rdquo;选项，能够修复计算机中所存在的问题。&lt;br /&gt;&lt;strong&gt;38、改进的文件复制&lt;/strong&gt; 在资源管理器中复制文件，用户将能够看到一个增强的对话框，其中提供更多信息，如果有问题，用户可以点击暂停按钮中止一段时间。如果有冲突的话，那么用户可以自己决定保留或取消哪些文件。&lt;br /&gt;&lt;strong&gt;39、在Windows 8中Mount ISO文件&lt;/strong&gt; 想要细看一个ISO文件?右击资源管理器，点击Mount然后就可查看一个虚拟驱动器，用户可以打开其中包含的文件或添加更多的文件。&lt;br /&gt;&lt;strong&gt;40、Windows 8文件夹选项&lt;/strong&gt; Windows 8的文件夹选项又有了新的变化，工具栏菜单不见了，但是如果用户点击文件改变文件夹和搜索选项的话，旧式的对话框就会出现。&lt;br /&gt;当然了，用户也可以自旧式的控制面板去加载文件夹选项：按住Windows+R键，输入Control.exe然后按回车去启动控制面板，选择视图列表中的大图标，然后点击文件夹选项去打开对话框。&lt;br /&gt;&lt;strong&gt;41、打开一个新进程&lt;/strong&gt; Windows 8的资源管理器看起来更稳定，不过一旦出现崩溃的话，用户可以通过以下步骤去打开它们：点击文件打开新窗口在新进程中打开新窗口，资源管理器将会在单独的Explorer.exe进程中运行新窗口。&lt;br /&gt;&lt;strong&gt;42、重启资源管理器&lt;/strong&gt; 如果Windows 8的资源管理器由于某些原因而锁定了，那么用户是不需要关闭资源管理器再重启的，只需按住Ctrl+Alt+Esc，在列表中选择资源管理器然后再点击重启即可。&lt;br /&gt;&lt;strong&gt;43、虚拟安装问题&lt;/strong&gt; 如果在虚拟机器中安装Windows 8的话，那么您很有可能会遇到一些问题，例如VMware Workstation 7无法顺利完成任务，而微软自己的虚拟PC和虚拟服务器也运行失败。在此，用户的最佳选择就是运行最新版本的VirtualBox，Mac上的 VMware Workstation 8和Parallels 7也可正常工作。&lt;br /&gt;&lt;strong&gt;44、解决性能问题&lt;/strong&gt; 如果您的Windows 8系统运行缓慢，但又不知道是何原因的话，那么新的任务管理器很有可能帮助您解决问题。&lt;br /&gt;按住Ctrl+Shift+Esc或右击任务栏并选择启动任务管理器去启动新版的任务管理器，进程选项卡会为您显示当前使用CPU时间、内存、硬盘驱动器和网络带宽的详细视图，性能选项卡会为您显示资源使用的图形视图，而应用程序历史对话框则会为您显示哪个应用程序是最消耗资源的。&lt;br /&gt;&lt;strong&gt;45、Metro应用程序无法启动&lt;/strong&gt; 如果您点击一个Metro应用程序，但是它却无法启动的话，这可能是因为显示问题。据悉，Metro应用程序当前是不支持低于1024x768的屏幕分辨率的，因此您应该尽可能地增加您的屏幕分辨率。&lt;br /&gt;如果还是不行的话，那么就更新您的视频驱动器。此外，用户账户问题也是常见的导致Metro应用程序无法启动的原因，尝试通过不同的电子邮件地址去创建一个新的用户账户。&lt;br /&gt;&lt;strong&gt;46、旧的任务管理器&lt;/strong&gt; 如果新版任务管理器不符合您的需求的话，您可以按住Windows+R键，然后输入TaskMGR按回车去启动旧的任务管理器。&lt;br /&gt;&lt;strong&gt;47、16位应用程序&lt;/strong&gt; 打开桌面控制面板，打开16位应用程序支持小应用程序，并点击确定即可在Windows 8中运行古老的16位应用程序。&lt;br /&gt;&lt;strong&gt;48、Windows 8崩溃&lt;/strong&gt; 当Windows 8出现蓝屏崩溃情况的时候，就会出现以下画面。&lt;br /&gt;&lt;strong&gt;49、设备管理器事件&lt;/strong&gt; 如果您在Windows 8中遇到一个驱动器或硬件相关的问题，那么启动设备管理器，浏览至相关的设备，右击它，然后选择属性和点击新的事件标签，您就可以看到Windows所安装的驱动器、相关服务等。&lt;br /&gt;&lt;strong&gt;50、修复Windows 8&lt;/strong&gt; 如果Windows 8停止工作的话，那么下面有几种新的方法去使Windows 8恢复正常工作。&lt;br /&gt;如果Windows 8能够启动，选择Metro控制面板应用程序，点击&amp;ldquo;常规&amp;rdquo;选择&amp;ldquo;刷新&amp;rdquo;选项去重新安装Windows并同时保留您的数据，如果选择&amp;ldquo;重置&amp;rdquo;选项的话，那么就可以恢复Windows并同时删除您的数据和应用程序。&lt;br /&gt;如果Windows 8无法启动的话，那么就自您的原始安装光盘中启动，选择语言和键盘，点击&amp;ldquo;修复您的计算机&amp;rdquo;然后选择&amp;ldquo;疑难解答&amp;rdquo;，此后您就可以重新安装或重置您的计算机。单击&amp;ldquo;高级&amp;rdquo;选项，您将会看到自之前的还原点去恢复Windows的工具或系统镜像文件以及一个&amp;ldquo;自动修复&amp;rdquo;选项去解决 Windows中的常见启动问题。&lt;/p&gt;&lt;p&gt;----------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Windows 8消费者预览版新快捷键：&lt;/strong&gt;&lt;br /&gt;Windows键+空格键：切换输入语言和键盘布局&lt;br /&gt;Windows键+O：禁用屏幕翻转&lt;br /&gt;Windows键+,：临时查看桌面&lt;br /&gt;Windows键+V：切换系统通知信息&lt;br /&gt;Windows键+Shift+V：反向切换系统通知信息&lt;br /&gt;Windows键+回车：打开&amp;ldquo;讲述人&amp;rdquo;&lt;br /&gt;Windows键+PgUp：将开始屏幕或Metro应用移至左侧显示器&lt;br /&gt;Windows键+PgDown：将开始屏幕或Metro应用移至右侧显示器&lt;br /&gt;Windows键+Shift+.：将应用移至左侧&lt;br /&gt;Windows键+.：将应用移至右侧&lt;br /&gt;Windows键+C：打开Charms栏(提供设置、设备、共享和搜索等选项)&lt;br /&gt;Windows键+I：打开设置栏&lt;br /&gt;Windows键+K：打开连接显示屏&lt;br /&gt;Windows键+H：打开共享栏&lt;br /&gt;Windows键+Q：打开应用搜索面板&lt;br /&gt;Windows键+W：打开&amp;ldquo;设置搜索&amp;rdquo;应用&lt;br /&gt;Windows键+F：打开&amp;ldquo;文件搜索&amp;rdquo;应用&lt;br /&gt;Windows键+Tab：循环切换应用&lt;br /&gt;Windows键+Shift+Tab：反向循环切换应用&lt;br /&gt;Windows键+Ctrl+Tab：循环切换应用，切换时手动选择应用&lt;br /&gt;Windows键+Z：打开&amp;ldquo;应用栏&amp;rdquo;&lt;br /&gt;Windows键+/：恢复默认输入法&lt;br /&gt;Windows键+J：显示之前操作的应用&lt;br /&gt;Windows键+X：快捷菜单&lt;br /&gt;&lt;strong&gt;沿袭Windows 7的快捷方式：&lt;/strong&gt;&lt;br /&gt;Windows键：显示或隐藏开始菜单&lt;br /&gt;Windows键 + &amp;larr;：最大化窗口到左侧的屏幕上(与Metro应用无关)&lt;br /&gt;Windows键 + &amp;rarr;：最大化窗口到右侧的屏幕上(与Metro应用无关)&lt;br /&gt;Windows键+ &amp;uarr;：最大化窗口(与Metro应用无关)&lt;br /&gt;Windows键+ &amp;darr;：最小化窗口(与Metro应用无关)&lt;br /&gt;Windows键+ SHIFT +&amp;uarr;：垂直拉伸窗口，宽度不变(与Metro应用无关)&lt;br /&gt;Windows键+ SHIFT +&amp;darr;：垂直缩小窗口，宽度不变(与Metro应用无关)&lt;br /&gt;Windows键+SHIFT+&amp;larr;：将活动窗口移至左侧显示器 (与Metro应用无关)&lt;br /&gt;Windows键+SHIFT+&amp;rarr;：将活动窗口移至右侧显示器(与Metro应用无关)&lt;br /&gt;Windows键+ P：演示设置&lt;br /&gt;Windows键+ Home：最小化所有窗口，第二次键击恢复窗口(不恢复Metro应用)&lt;br /&gt;Windows键+ 数字键：打开或切换位于任务栏指定位置的程序&lt;br /&gt;Windows键+Shift+数字键：打开位于任务栏指定位置程序的新实例&lt;br /&gt;Windows键+B：光标移至通知区域&lt;br /&gt;Windows键+Break：显示"系统属性"对话框&lt;br /&gt;Windows键+D：显示桌面，第二次键击恢复桌面 (不恢复Metro应用)&lt;br /&gt;Windows键+E：打开我的电脑&lt;br /&gt;Windows键+Ctrl+F：搜索计算机(如果你在网络上)&lt;br /&gt;Windows键+G：循环切换侧边栏小工具&lt;br /&gt;Windows键+L：锁住电脑或切换用户&lt;br /&gt;Windows键+M：最小化所有窗口&lt;br /&gt;Windows键+Shift+M：在桌面恢复所有最小化窗口(不恢复Metro应用)&lt;br /&gt;Windows键+R：打开&amp;ldquo;运行&amp;rdquo;对话框&lt;br /&gt;Windows键+T：切换任务栏上的程序&lt;br /&gt;Windows键+Alt+回车：打开Windows媒体中心&lt;br /&gt;Windows键+U：打开轻松访问中心&lt;br /&gt;Windows键+F1：打开Windows帮助和支持&lt;br /&gt;Windows键+N：插件新笔记(OneNote)&lt;br /&gt;Windows键+S：打开屏幕截图工具(OneNote)&lt;br /&gt;Windows键+Q：打开Lync，Windows 8搜索功能移除了该快捷键&lt;br /&gt;Windows键+A：接受所有来电 (Lync)&lt;br /&gt;Windows键+X：拒绝来电(Lync)，如果Windows移动中心存在，该快捷键不起作用&lt;br /&gt;Windows键+减号：缩小(放大镜)&lt;br /&gt;Windows键+加号：放大(放大镜)&lt;br /&gt;Windows键+Esc：关闭放大镜&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chuncn/aggbug/2376917.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chuncn/archive/2012/03/02/2376917.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chuncn/archive/2012/03/02/2376721.html</id><title type="text">把Windows 8安装到U盘 创建Windows to Go启动盘</title><summary type="text">来源 http://tweaks.com/windows/52279/how-to-create-a-windows-to-go-usb-drive/Windows To Go是来自Windows 8的全新安装方式，通过它我们可以创建一个从U盘启动的完整的Windows 8系统环境。 你需要准备：你需要准备：容量至少为32GB的U盘一枚（或者硬盘）安装好Windows 8的PCWindows 8 DVD ISO文件Imagex.exe （安装 Windows 7 Automated Installation Kit之后，可以从C:\Program Files\Windows AIK\Tools</summary><published>2012-03-02T02:26:00Z</published><updated>2012-03-02T02:26:00Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chuncn/archive/2012/03/02/2376721.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/archive/2012/03/02/2376721.html"/><content type="html">&lt;p&gt;来源 &lt;a href="http://tweaks.com/windows/52279/how-to-create-a-windows-to-go-usb-drive/" target="_blank"&gt;http://tweaks.com/windows/52279/how-to-create-a-windows-to-go-usb-drive/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Windows To Go是来自Windows 8的全新安装方式，通过它我们可以创建一个从U盘启动的完整的Windows 8系统环境。 你需要准备：&lt;/p&gt;&lt;p&gt;你需要准备：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;容量至少为32GB的U盘一枚（或者硬盘）&lt;/li&gt;&lt;li&gt;安装好Windows 8的PC&lt;/li&gt;&lt;li&gt;Windows 8 DVD ISO文件&lt;/li&gt;&lt;li&gt;Imagex.exe （安装 Windows 7 Automated Installation Kit之后，可以从C:\Program Files\Windows AIK\Tools\amd64 或者 C:\Program Files\Windows AIK\Tools\x86中找到该文件）&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;建立Windows To Go USB 驱动设备：&lt;/p&gt;&lt;ol&gt;&lt;ol&gt;&lt;li&gt;安装Windows To Go 需要一个单独的分区，我们使用diskpark来进行分区操作。使用管理员身份运行cmd.exe&lt;/li&gt;&lt;li&gt;确认你的U盘已经插在电脑上并且被成功识别&lt;/li&gt;&lt;li&gt;在命令提示行中输入 &amp;ldquo;list disk&amp;rdquo; 并回车，查看列表中你的USB设备&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;输入&amp;ldquo;select disk #&amp;rdquo;然后回车（#是你的U盘的序号）选择U盘为当前设备&lt;/li&gt;&lt;li&gt;清理分区，输入&amp;ldquo; clean &amp;rdquo;， 回车&lt;/li&gt;&lt;li&gt;输入&amp;ldquo;create partition primary&amp;rdquo;创建新分区&lt;/li&gt;&lt;li&gt;格式化分区&amp;ldquo; format fs=ntfs quick &amp;rdquo;&lt;/li&gt;&lt;li&gt;将分区设置为活动分区，输入&amp;ldquo; active &amp;rdquo;&lt;/li&gt;&lt;li&gt;输入&amp;ldquo;exit&amp;rdquo;退出diskpart&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p&gt;&lt;img class="alignnone" style="font-size: xx-small;" title="windows to go 1" src="http://img.cnbeta.com/newsimg/120302/07043501440580995.png" alt="" width="500" height="266" /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;现在打开Windows 8的ISO文件，复制 \source\install.wim 到 imagex.exe 的相同文件夹。&lt;/li&gt;&lt;li&gt;在命令提示符中进入imagex.exe的文件夹，输入&amp;ldquo; imagex.exe /apply install.wim 1 x:\ &amp;rdquo;（替换x为u盘在系统中的盘符）&lt;/li&gt;&lt;li&gt;安装好了之后，输入&amp;ldquo; bcdboot.exe&amp;nbsp; x:\windows&amp;nbsp; /s&amp;nbsp; x:&amp;nbsp; /f&amp;nbsp; ALL &amp;rdquo;（替换x为u盘在系统中的盘符）&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;如果以上步骤成功完成，祝贺你，你拥有一枚Windows 8 To Go的U盘了。&lt;/div&gt;&lt;img src="http://www.cnblogs.com/chuncn/aggbug/2376721.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chuncn/archive/2012/03/02/2376721.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chuncn/archive/2012/03/01/2374987.html</id><title type="text">WIN32API之常用进程、线程函数</title><summary type="text">CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 ConnectNamedPipe 指示一台服务器等待下去，直至客户机同一个命名管道连接 CreateEvent 创建一个事件对象 CreateMailslot 创建一个邮路。返回的句柄由邮路服务器使用（收件人） CreateMutex 创建一个互斥体（MUTEX） CreateNamedPipe 创建一个命名管道。返回的句柄由管道的服务器端使用 CreatePipe 创建一个匿名管道 CreateProcess 创建一个新进程（比如</summary><published>2012-03-01T01:08:00Z</published><updated>2012-03-01T01:08:00Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chuncn/archive/2012/03/01/2374987.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/archive/2012/03/01/2374987.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作 &lt;br/&gt;CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用 &lt;br/&gt;ConnectNamedPipe 指示一台服务器等待下去，直至客户机同一个命名管道连接 &lt;br/&gt;CreateEvent 创建一个事件对象 &lt;br/&gt;CreateMailslot 创建一个邮路。返回的句柄由邮路服务器使用（收件人） &lt;br/&gt;CreateMutex 创建一个互斥体（MUTEX） &lt;br/&gt;CreateNamedPipe 创建一个命名管道。返回的句柄由管道的服务器端使用 &lt;br/&gt;CreatePipe 创建一个匿名管道 &lt;br/&gt;CreateProcess 创建一个新进程（比如执行一个程序） &lt;br/&gt;CreateSemaphore 创建一个新的信号机 &lt;br/&gt;CreateWaitableTimer 创建一个可等待的计时器对象 &lt;br/&gt;DisconnectNamedPipe 断开一个客户与一个命名管道的连接 &lt;br/&gt;DuplicateHandle 在指出一个现有系统对象当前句柄的情况下，为那个对象创建一个新句柄 &lt;br/&gt;ExitProcess 中止一个进程 &lt;br/&gt;FindCloseChangeNotification 关闭一个改动通知对象 &lt;br/&gt;FindExecutable 查找与一个指定文件关联在一起的程序的文件名 &lt;br/&gt;FindFirstChangeNotification 创建一个文件通知对象。该对象用于监视文件系统发生的变化 &lt;br/&gt;FindNextChangeNotification 重设一个文件改变通知对象，令其继续监视下一次变化 &lt;br/&gt;FreeLibrary 释放指定的动态链接库 &lt;br/&gt;GetCurrentProcess 获取当前进程的一个伪句柄 &lt;br/&gt;GetCurrentProcessId 获取当前进程一个唯一的标识符 &lt;br/&gt;GetCurrentThread 获取当前线程的一个伪句柄 &lt;br/&gt;GetCurrentThreadId 获取当前线程一个唯一的线程标识符 &lt;br/&gt;GetExitCodeProces 获取一个已中断进程的退出代码 &lt;br/&gt;GetExitCodeThread 获取一个已中止线程的退出代码 &lt;br/&gt;GetHandleInformation 获取与一个系统对象句柄有关的信息 &lt;br/&gt;GetMailslotInfo 获取与一个邮路有关的信息 &lt;br/&gt;GetModuleFileName 获取一个已装载模板的完整路径名称 &lt;br/&gt;GetModuleHandle 获取一个应用程序或动态链接库的模块句柄 &lt;br/&gt;GetPriorityClass 获取特定进程的优先级别 &lt;br/&gt;GetProcessShutdownParameters 调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况 &lt;br/&gt;GetProcessTimes 获取与一个进程的经过时间有关的信息 &lt;br/&gt;GetProcessWorkingSetSize 了解一个应用程序在运行过程中实际向它交付了多大容量的内存 &lt;br/&gt;GetSartupInfo 获取一个进程的启动信息 &lt;br/&gt;GetThreadPriority 获取特定线程的优先级别 &lt;br/&gt;GetTheardTimes 获取与一个线程的经过时间有关的信息 &lt;br/&gt;GetWindowThreadProcessId 获取与指定窗口关联在一起的一个进程和线程标识符 &lt;br/&gt;LoadLibrary 载入指定的动态链接库，并将它映射到当前进程使用的地址空间 &lt;br/&gt;LoadLibraryEx 装载指定的动态链接库，并为当前进程把它映射到地址空间 &lt;br/&gt;LoadModule 载入一个Windows应用程序，并在指定的环境中运行 &lt;br/&gt;MsgWaitForMultipleObjects 等侯单个对象或一系列对象发出信号。如返回条件已经满足，则立即返回 &lt;br/&gt;SetPriorityClass 设置一个进程的优先级别 &lt;br/&gt;SetProcessShutdownParameters 在系统关闭期间，为指定进程设置他相对于其它程序的关闭顺序 &lt;br/&gt;SetProcessWorkingSetSize 设置操作系统实际划分给进程使用的内存容量 &lt;br/&gt;SetThreadPriority 设定线程的优先级别 &lt;br/&gt;ShellExecute 查找与指定文件关联在一起的程序的文件名 &lt;br/&gt;TerminateProcess 结束一个进程 &lt;br/&gt;WinExec 运行指定的程序&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chuncn/aggbug/2374987.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chuncn/archive/2012/03/01/2374987.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chuncn/archive/2012/02/15/2352624.html</id><title type="text">Lua语言如何调用自己编写的C DLL -- 转</title><summary type="text">Lua语言如何调用自己编写的C DLL文件#include "lua.h"#include "lualib.h"#include "lauxlib.h"#include &lt;windows.h&gt;static int MyLuaDLL_HelloWorld(lua_State* L){ MessageBox(NULL,"Hello","World",MB_OK); return 0;}static int MyLuaDLL_average(lua_State *L){ int n = l</summary><published>2012-02-15T06:48:00Z</published><updated>2012-02-15T06:48:00Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chuncn/archive/2012/02/15/2352624.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/archive/2012/02/15/2352624.html"/><content type="html">&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;Lua语言如何调用自己编写的C DLL文件&lt;br/&gt;&lt;br/&gt;#include "lua.h"&lt;br/&gt;#include "lualib.h"&lt;br/&gt;#include "lauxlib.h"&lt;br/&gt;#include &amp;lt;windows.h&amp;gt;&lt;br/&gt;&lt;br/&gt;static int MyLuaDLL_HelloWorld(lua_State* L)&lt;br/&gt;{&lt;br/&gt;     MessageBox(NULL,"Hello","World",MB_OK);&lt;br/&gt;     return 0;&lt;br/&gt;}&lt;br/&gt;static int MyLuaDLL_average(lua_State *L)&lt;br/&gt;{&lt;br/&gt;    &lt;br/&gt;     int n = lua_gettop(L);&lt;br/&gt;     double sum = 0;&lt;br/&gt;     int i;&lt;br/&gt;    &lt;br/&gt;     for (i = 1; i &amp;lt;= n; i++)&lt;br/&gt;     {&lt;br/&gt;        &lt;br/&gt;         sum += lua_tonumber(L, i);&lt;br/&gt;     }&lt;br/&gt;    &lt;br/&gt;     lua_pushnumber(L, sum / n);&lt;br/&gt;    &lt;br/&gt;     lua_pushnumber(L, sum);&lt;br/&gt;    &lt;br/&gt;     return 2;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;static const luaL_reg MyLuaDLLFunctions [] =&lt;br/&gt;{&lt;br/&gt;     {"HelloWorld",MyLuaDLL_HelloWorld},&lt;br/&gt;     {"average",MyLuaDLL_average},&lt;br/&gt;     {NULL, NULL}&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;int __cdecl __declspec(dllexport) luaopen_MyLuaDLL(lua_State* L)&lt;br/&gt;{&lt;br/&gt;     luaL_openlib(L, "MyLuaDLL", MyLuaDLLFunctions, 0);&lt;br/&gt;     return 1;&lt;br/&gt;}&lt;br/&gt; &lt;br/&gt;-- lua code: --&lt;br/&gt;&lt;br/&gt;local testlib = package.loadlib("Lua_Dll.dll","luaopen_MyLuaDLL");   --获取DLL中抛出函数地址&lt;br/&gt;print (testlib) &lt;br/&gt;if(testlib)then&lt;br/&gt;    testlib();  --调用DLL中抛出函数&lt;br/&gt;else&lt;br/&gt;    -- Error&lt;br/&gt;end&lt;br/&gt;&lt;br/&gt;MyLuaDLL.HelloWorld();&lt;br/&gt;&lt;br/&gt;a,b=MyLuaDLL.average(23,33,3344);&lt;br/&gt;print("average:",a,"sum:",b);&lt;br/&gt;--------------------------------------------&lt;br/&gt;my.c文件：&lt;br/&gt;&lt;br/&gt;#include "stdafx.h"&lt;br/&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br/&gt;#include "my.h"&lt;br/&gt;&lt;br/&gt;static int pri(lua_State *L)&lt;br/&gt;{ &lt;br/&gt; MessageBox(NULL,"Hello","this is a c program!",MB_OK);&lt;br/&gt; return 0;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;static const struct luaL_Reg mylib[]={&lt;br/&gt; {"pri",pri},&lt;br/&gt; {NULL,NULL}&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;__declspec(dllexport) int luaopen_mylib (lua_State* L)&lt;br/&gt;{&lt;br/&gt; luaL_register(L,"mylib",mylib);&lt;br/&gt; return 1;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;my.h文件：&lt;br/&gt;&lt;br/&gt;#include "lua.h" &lt;br/&gt;#include "lualib.h"&lt;br/&gt;#include "lauxlib.h"&lt;br/&gt;#pragma   comment(lib,"lua5.1.lib")&lt;br/&gt;&lt;br/&gt;test.lua文件：&lt;br/&gt;&lt;br/&gt;local a=package.loadlib("my.dll","luaopen_mylib");&lt;br/&gt;&lt;br/&gt;a()&lt;br/&gt;mylib.pri()&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chuncn/aggbug/2352624.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chuncn/archive/2012/02/15/2352624.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/chuncn/archive/2012/01/16/2323986.html</id><title type="text">Silverlight桌面部署器及其使用</title><summary type="text">一、文件简介SL.ini 配置文件InstallSL.exe 安装Silveright应用至桌面RunSL.exe 运行Silverligh应用，无安装UnInstallSL.exe 卸载Silverlight应用二、配置文件说明SL.ini文件内容如下：[SL] App=App.xap Url=http://112.8.33.25:99/ClientBin/App.xap 其中App.xap文件应该放在当前路径下，Url为应用主程序在Web上的地址，可以位于Windows、Linux、 Mac等系统之上，且http://112.8.33.25:99/ClientBin/下允许有子模型、子应.</summary><published>2012-01-16T10:00:00Z</published><updated>2012-01-16T10:00:00Z</updated><author><name>chuncn</name><uri>http://www.cnblogs.com/chuncn/</uri></author><link rel="alternate" href="http://www.cnblogs.com/chuncn/archive/2012/01/16/2323986.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/chuncn/archive/2012/01/16/2323986.html"/><content type="html">&lt;p&gt;一、文件简介&lt;/p&gt;&lt;p&gt;SL.ini&amp;nbsp;&amp;nbsp; 配置文件&lt;/p&gt;&lt;p&gt;InstallSL.exe&amp;nbsp; 安装Silveright应用至桌面&lt;/p&gt;&lt;p&gt;RunSL.exe&amp;nbsp; 运行Silverligh应用，无安装&lt;/p&gt;&lt;p&gt;UnInstallSL.exe&amp;nbsp; 卸载Silverlight应用&lt;/p&gt;&lt;p&gt;二、配置文件说明&lt;/p&gt;&lt;p&gt;SL.ini文件内容如下：&lt;/p&gt;&lt;p&gt;[SL]&lt;br /&gt; App=App.xap&lt;br /&gt; Url=http://112.8.33.25:99/ClientBin/App.xap&lt;/p&gt;&lt;p&gt;其中App.xap文件应该放在当前路径下，Url为应用主程序在Web上的地址，可以位于Windows、Linux、 Mac等系统之上，且&lt;a href="http://112.8.33.25:99/ClientBin/"&gt;http://112.8.33.25:99/ClientBin/&lt;/a&gt;下允许有子模型、子应用。&lt;/p&gt;&lt;p&gt;三、使用方法&lt;/p&gt;&lt;p&gt;将App.xap（默认）复制到当前文件夹，并安装相应的Silverlight运行时(已有的版本有SL3、SL4、SL5 ，另外有mac版)，然后按上一节进行配置。&lt;/p&gt;&lt;p&gt;最后，若要安装至桌面则执行InstallSL.exe；若要无安装方式下直接运行该应用则执行RunSL.exe；若要卸载当前 配置的应用则执行UnInstallSL.exe。&lt;/p&gt;&lt;p&gt;注：Silverlight本质上是winform的升级版本，也是wpf的子集，但其本身并不像winform/wpf那样方便的直接运行和部署，故此，本文提供的工具旨在解决该问题。&lt;/p&gt;&lt;p&gt;注：本程序在windows server 2003且无.net的环境下测试通过，需要安装silverlight运行时。&lt;/p&gt;&lt;p&gt;注：本文程序为绿色的win32程序，可使用installshield等软件打包成安装文件包。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下载地址：&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/chuncn/RunSLInDesktop.zip"&gt;http://files.cnblogs.com/chuncn/RunSLInDesktop.zip&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/chuncn/aggbug/2323986.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/chuncn/archive/2012/01/16/2323986.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
