⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdn_文档中心_microsoft agent技术应用.htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 2 页
字号:
            Agent控制指针: IAgentEx *g_pAgentEx。<BR>&nbsp; 角色指针: IAgentCharacterEx 
            *g_pMyAgent。<BR>&nbsp; 角色消息反应器指针: AgentNotifySink 
            *g_pSink。<BR><BR>&nbsp; 使用以上变量可很容易的调用Agent的功能,如显示角色:<BR>&nbsp; 
            &nbsp; BOOL agentShow()<BR>&nbsp; &nbsp; {<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; HRESULT hRes;<BR>&nbsp; &nbsp; &nbsp; &nbsp; long 
            lRequestID;<BR><BR>&nbsp; &nbsp; &nbsp; &nbsp; if( 
            !g_pMyAgent)<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return 
            FALSE;<BR>&nbsp; &nbsp; &nbsp; &nbsp; hRes = 
            g_pMyAgent-&gt;Show(FALSE, &amp;lRequestID);<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; if (FAILED(hRes))<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; return FALSE;<BR>&nbsp; &nbsp; &nbsp; &nbsp; return 
            TRUE;<BR>&nbsp; &nbsp; }<BR><BR>&nbsp; &nbsp; (二) 角色的语言处理<BR>&nbsp; 
            目前Agent支持很多种语言,不仅是显示,还有语音合成和语音识辨(对于中文,目前仅支持显示)。<BR>语言又分为主语言和子语言(或为副语言),如中文的主语言为中文(LANG_CHINESE),子语言则可为<BR>简体(SUBLANG_CHINESE_SIMPLIFIED)和繁体等。AgentShell中定义两个全局变量表达角色的语种:<BR><BR>&nbsp; 
            主语言:DWORD g_nMainLang。<BR>&nbsp; 子语言:DWORD g_nSubLang。<BR>&nbsp; 
            这样程序内必须根据当前语言的不同来显示不同的信息,如程序退出时的问候信:<BR>&nbsp; 
            首先定义不同的语言信息,可以为宏定义或资源数据:<BR>&nbsp; #define 
            MES_GOODBYEL"Goodbye!"<BR>&nbsp; #define MES_GOODBYE_CH 
            L"再见!"<BR>&nbsp; #define MES_GOODNIGHTL"Good night!"<BR>&nbsp; 
            #define MES_GOODNIGHT_CH L"祝您晚安!"<BR>&nbsp; 以下为实现退出提示代码:<BR>&nbsp; 
            void Goodbye()<BR>&nbsp; {<BR>&nbsp; &nbsp; &nbsp; &nbsp; if( 
            g_bAgentOK)<BR>&nbsp; &nbsp; &nbsp; &nbsp; {<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; SYSTEMTIME time;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            agentStop();<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            agentShow();<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            agentPlay(L"Wave");<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            GetLocalTime(&amp;time);<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 
            根据时间不同提示不同信息<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( g_nMainLang 
            == LANG_ENGLISH)<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // 提示英文信息<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( time.wHour &lt; 
            19)<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; agentSpeak(MES_GOODBYE);<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; else<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            agentSpeak(MES_GOODNIGHT);<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            }<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; // 提示中文信息<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; if( time.wHour &lt; 19)<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; agentSpeak(MES_GOODBYE_CH);<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            agentSpeak(MES_GOODNIGHT_CH);<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            }<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; agentHide();<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; // 等待若干时间<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; Sleep(MAX_QUIT_TIME);<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            }<BR>&nbsp; }<BR>&nbsp; 当然以上介绍的只是一种较为简单的方法,仅在于描述这种原理。<BR><BR>&nbsp; 
            &nbsp; (三) 实现自动朗读英文<BR>&nbsp; 
            实现自动朗读实际上是响应剪贴板消息的过程,当复制选种的文本信息时,系统自动发送WM_DRAWCLIPBOARD<BR>消息给所有剪贴板监视队列中的窗口,相应的窗口只要读取当前剪贴板内的信息进行朗读即可,具体实现如下:<BR><BR>&nbsp; 
            安装剪贴板监视:<BR>&nbsp; void InstallClipSpy()<BR>&nbsp; {<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; g_hNextWnd = 
            SetClipboardViewer(g_hMainWnd);<BR>&nbsp; }<BR>&nbsp; <BR>&nbsp; 
            主窗口的回调函数中相应剪贴板消息:<BR>&nbsp; LRESULT CALLBACK WndProc(HWND hWnd, UINT 
            message, WPARAM wParam, LPARAM lParam)<BR>&nbsp; {<BR>&nbsp; &nbsp; 
            // 剪贴板窗口队列发生变化<BR>&nbsp; &nbsp; case WM_CHANGECBCHAIN:<BR>&nbsp; 
            &nbsp; hwndRemove = (HWND)wParam; // handle of window being removed 
            <BR>&nbsp; &nbsp; hwndNext = (HWND) lParam; <BR>&nbsp; &nbsp; if( 
            hwndRemove == g_hNextWnd)<BR>&nbsp; &nbsp; {<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; g_hNextWnd = hwndNext;<BR>&nbsp; &nbsp; }<BR>&nbsp; &nbsp; 
            if( g_hNextWnd)<BR>&nbsp; &nbsp; {<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            SendMessage(hwndNext, WM_CHANGECBCHAIN, wParam, lParam);<BR>&nbsp; 
            &nbsp; }<BR>&nbsp; &nbsp; // 剪贴数据发生变化<BR>&nbsp; &nbsp; case 
            WM_DRAWCLIPBOARD:<BR>&nbsp; // 是否自动阅读<BR>&nbsp; if( 
            g_bEnableRead)<BR>&nbsp; {<BR>&nbsp; &nbsp; &nbsp; &nbsp; // 
            阅读剪贴板信息<BR>&nbsp; &nbsp; &nbsp; &nbsp; ReadClipText();<BR>&nbsp; 
            }<BR>&nbsp; if( g_hNextWnd)<BR>&nbsp; {<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; SendMessage(g_hNextWnd,WM_DRAWCLIPBOARD,wParam, 
            lParam);<BR>&nbsp; }<BR>&nbsp; 获取剪贴板信息并且朗读:<BR>&nbsp; void 
            ReadClipText()<BR>&nbsp; {<BR>&nbsp; &nbsp; &nbsp; &nbsp; if( 
            g_bAgentOK)<BR>&nbsp; &nbsp; &nbsp; &nbsp; { <BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; // 只有文本文件才朗读<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; if( IsClipboardFormatAvailable(CF_TEXT))<BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; if (OpenClipboard(g_hMainWnd)) <BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LPWSTR pwsz;<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UINT 
            cch;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; HGLOBAL hglb;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; LPSTR lpstr;<BR><BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hglb = 
            GetClipboardData(CF_TEXT);<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; lpstr = 
            (LPSTR)GlobalLock(hglb);<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; cch = lstrlen(lpstr);<BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( cch &gt; 
            0)<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            {<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; pwsz = new WCHAR[cch + 1];<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            MultiByteToWideChar(CP_ACP, 0, lpstr, -1, pwsz, cch);<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            pwsz[cch] = '\0';<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; agentSaveState();<BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            agentPlay(L"Read");<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; agentSpeak(pwsz);<BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            agentPlay(L"ReadReturn");<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; agentRestoreState();<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            delete pwsz;<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; }<BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; GlobalUnlock(hglb);<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CloseClipboard();<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; &nbsp; }<BR>&nbsp; &nbsp; &nbsp; &nbsp; }<BR>&nbsp; 
            }<BR>&nbsp; 最后还须在程序退出时将当前窗口句柄从剪贴板监视队列移走:<BR>&nbsp; void 
            RemoveClipSpy()<BR>&nbsp; {<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            ChangeClipboardChain(g_hMainWnd, g_hNextWnd);<BR>&nbsp; 
            }<BR><BR>&nbsp; &nbsp; (四) 与外部程序的接口<BR>&nbsp; &nbsp; 
            应用程序和AgentShell之间传递数据主要通过WM_COPYDATA消息实现,由于传递的数据类型各<BR>有不同,所以需要定义一个数据结构来描述:<BR>&nbsp; 
            &nbsp; struct AgentActionSTRUCT<BR>&nbsp; &nbsp; {<BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; WORD nAction;<BR>&nbsp; &nbsp; &nbsp; &nbsp; DWORD 
            nD1;<BR>&nbsp; &nbsp; &nbsp; &nbsp; DWORD nD2;<BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; WCHAR sData[MAX_DATA_LEN];<BR>&nbsp; &nbsp; 
            };<BR>&nbsp; &nbsp; 
            nAction用来表示Agent应该执行的操作,如显示、表演等。nD1,nD2,sData用来记录传递的数据。<BR>传递消息必须获取AgentShell主窗口的句柄,实现如下:<BR>&nbsp; 
            &nbsp; HWND GetAgentMainWnd()<BR>&nbsp; &nbsp; {<BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; return FindWindow(AGENT_CLASS_NAME, NULL);<BR>&nbsp; 
            &nbsp; }<BR>&nbsp; &nbsp; 由于Agent采用了UNICODE, 
            必须将ANSI字符转化为UNICODE字符:<BR>&nbsp; &nbsp; BOOL SendMesToAgent(WORD 
            nAction, DWORD nD1, DWORD nD2, LPCSTR sData)<BR>&nbsp; &nbsp; 
            {<BR>&nbsp; &nbsp; &nbsp; &nbsp; UINT nSize;<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; HWND hWnd = GetAgentMainWnd();<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            if( hWnd)<BR>&nbsp; &nbsp; &nbsp; &nbsp; {<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; action.nAction = nAction;<BR>&nbsp; &nbsp; &nbsp; &nbsp; 
            action.nD1 = (DWORD)nD1;<BR>&nbsp; &nbsp; &nbsp; &nbsp; action.nD2 = 
            (DWORD)nD2;<BR>&nbsp; &nbsp; &nbsp; &nbsp; // 
            将ANSI符转换为UNICODE的字符<BR>&nbsp; &nbsp; &nbsp; &nbsp; nSize = 
            MultiByteToWideChar(CP_ACP, 0, sData, lstrlen(sData) + 1, <BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; action.sData, MAX_DATA_LEN);<BR>&nbsp; &nbsp; 
            &nbsp; &nbsp; action.sData[nSize] = '\0';<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; //<BR>&nbsp; &nbsp; &nbsp; &nbsp; COPYDATASTRUCT 
            cds;<BR>&nbsp; &nbsp; &nbsp; &nbsp; cds.dwData = (DWORD)0;<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; cds.cbData = (DWORD)sizeof(action);<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; cds.lpData = (VOID *)&amp;action;<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; // 通过WM_COPYDATA消息与AgentShell交换数据<BR>&nbsp; 
            &nbsp; &nbsp; &nbsp; SendMessage(hWnd, WM_COPYDATA, (WPARAM)NULL, 
            (LPARAM)&amp;cds);<BR>&nbsp; &nbsp; &nbsp; &nbsp; return 
            TRUE;<BR>&nbsp; &nbsp; &nbsp; &nbsp; }<BR>&nbsp; &nbsp; &nbsp; 
            &nbsp; return FALSE; <BR>&nbsp; &nbsp; }<BR>&nbsp; &nbsp; 
            目前AgentShell提供的函数主要有:<BR>&nbsp; &nbsp; // 启动角色外壳程序(AgentShell) 
            bRun是否执行<BR>&nbsp; &nbsp; BOOL agentAPIRun(BOOL bRun = 
            TRUE);<BR>&nbsp; &nbsp; // 退出角色外壳程序(AgentShell)<BR>&nbsp; &nbsp; 
            BOOL agentAPIExit();<BR>&nbsp; &nbsp; // 创建一个新角色(sPath角色数据文件路径, 
            nLang主语言, nSubLang子语言)<BR>&nbsp; &nbsp; BOOL agentAPICreate(LPCSTR 
            sPath, UINT nLang, UINT nSubLang);<BR>&nbsp; &nbsp; // 
            设置角色名字(sName角色名字)<BR>&nbsp; &nbsp; BOOL agentAPISetName(LPCSTR 
            sName);<BR>&nbsp; &nbsp; // 将角色卸载<BR>&nbsp; &nbsp; BOOL 
            agentAPIUnload();<BR>&nbsp; &nbsp; // 显示角色<BR>&nbsp; &nbsp; BOOL 
            agentAPIShow();<BR>&nbsp; &nbsp; // 隐藏角色<BR>&nbsp; &nbsp; BOOL 
            agentAPIHide();<BR>&nbsp; &nbsp; // 显示或隐藏角色<BR>&nbsp; &nbsp; BOOL 
            agentAPIShowORHide();<BR>&nbsp; &nbsp; // 停止角色表演<BR>&nbsp; &nbsp; 
            BOOL agentAPIStop();<BR>&nbsp; &nbsp; // 角色表演(sAction动作名称)<BR>&nbsp; 
            &nbsp; BOOL agentAPIPlay(LPCSTR sAction);<BR>&nbsp; &nbsp; // 
            角色讲话(sText句子)<BR>&nbsp; &nbsp; BOOL agentAPISpeak(LPCSTR 
            sText);<BR>&nbsp; &nbsp; // 角色鞠躬(x,y 指方向)<BR>&nbsp; &nbsp; BOOL 
            agentAPIGesAt(WORD x, WORD y);<BR>&nbsp; &nbsp; // 
            移动角色到指定的位置(x,y移动的坐标)<BR>&nbsp; &nbsp; BOOL agentAPIMoveTo(WORD x, 
            WORD y);<BR>&nbsp; &nbsp; // 保存当前角色显示状态<BR>&nbsp; &nbsp; BOOL 
            agentAPISaveState();<BR>&nbsp; &nbsp; // 恢复角色的状态<BR>&nbsp; &nbsp; 
            BOOL agentAPIRestoreState();<BR>&nbsp; &nbsp; // 允许自动阅读<BR>&nbsp; 
            &nbsp; BOOL agentAPIEnableAutoRead();<BR>&nbsp; &nbsp; // 
            禁止自动阅读<BR>&nbsp; &nbsp; BOOL agentAPIDisableAutoRead();<BR>&nbsp; 
            &nbsp; 注意传递给AgentShell的数据长度不要超过1K(实际上一般不会大于1K)。<BR>&nbsp; &nbsp; 2) 
            使用接口<BR>&nbsp; &nbsp; 
            有了以上介绍的接口函数,对Agent的控制变的很简单,以下是一个简单的问候示例:<BR>&nbsp; &nbsp; // 
            启动AgentShell<BR>&nbsp; &nbsp; if( agentAPIRun(TRUE))<BR>&nbsp; 
            &nbsp; {<BR>&nbsp; &nbsp; &nbsp; // 保存当前Agent的状态<BR>&nbsp; &nbsp; 
            &nbsp; agentAPISaveState();<BR>&nbsp; &nbsp; &nbsp; // 
            开始表演<BR>&nbsp; &nbsp; &nbsp; agentAPIPlay(_T("Greet"));<BR>&nbsp; 
            &nbsp; &nbsp; // 讲话<BR>&nbsp; &nbsp; &nbsp; agentAPISpeak(_T("hello, 
            my friend."));<BR>&nbsp; &nbsp; &nbsp; // 表演结束<BR>&nbsp; &nbsp; 
            &nbsp; agentAPIPlay(_T("GreetReturn"));<BR>&nbsp; &nbsp; &nbsp; // 
            恢复原来状态<BR>&nbsp; &nbsp; &nbsp; agentAPIRestoreState(); <BR>&nbsp; 
            &nbsp; &nbsp; // 退出<BR>&nbsp; &nbsp; &nbsp; 
            agentAPIExit();<BR>&nbsp; &nbsp; }<BR><BR>&nbsp; &nbsp; 
            AgentShell在笔者的免费软件"我的助手"中得到很好的利用,当然目前其仅涉及了Agent的一小部分内容,还有如语音识辨等,未做处理,还有待一步改进。以上程序在Visual 
            C++ 
        6.0编译通过,源代码可到助手之家(http://www.helperHome.com)下载。<BR><BR><BR></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR>
<TABLE align=center bgColor=#006699 border=0 cellPadding=0 cellSpacing=0 
width=770>
  <TBODY>
  <TR bgColor=#006699>
    <TD align=middle bgColor=#006699 id=white><FONT 
    color=#ffffff>对该文的评论</FONT></TD>
    <TD align=middle>
      <SCRIPT src="CSDN_文档中心_Microsoft Agent技术应用.files/readnum.htm"></SCRIPT>
    </TD></TR></TBODY></TABLE><BR>
<DIV align=center>
<TABLE align=center bgColor=#cccccc border=0 cellPadding=2 cellSpacing=1 
width=770>
  <TBODY>
  <TR>
    <TH bgColor=#006699 id=white><FONT 
color=#ffffff>我要评论</FONT></TH></TR></TBODY></TABLE></DIV>
<DIV align=center>
<TABLE border=0 width=770>
  <TBODY>
  <TR>
    <TD>你没有登陆,无法发表评论。 请先<A 
      href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=310">登陆</A> 
      <A 
href="http://www.csdn.net/expert/zc.asp">我要注册</A><BR></TD></TR></TBODY></TABLE></DIV><BR>
<HR noShade SIZE=1 width=770>

<TABLE border=0 cellPadding=0 cellSpacing=0 width=500>
  <TBODY>
  <TR align=middle>
    <TD height=10 vAlign=bottom><A 
      href="http://www.csdn.net/intro/intro.asp?id=2">网站简介</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=5">广告服务</A> - <A 
      href="http://www.csdn.net/map/map.shtm">网站地图</A> - <A 
      href="http://www.csdn.net/help/help.asp">帮助信息</A> - <A 
      href="http://www.csdn.net/intro/intro.asp?id=2">联系方式</A> - <A 
      href="http://www.csdn.net/english">English</A> </TD>
    <TD align=middle rowSpan=3><A 
      href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"><IMG 
      border=0 height=48 src="CSDN_文档中心_Microsoft Agent技术应用.files/biaoshi.gif" 
      width=40></A></TD></TR>
  <TR align=middle>
    <TD vAlign=top>百联美达美公司 版权所有 京ICP证020026号</TD></TR>
  <TR align=middle>
    <TD vAlign=top><FONT face=Verdana>Copyright &copy; CSDN.net, Inc. All rights 
      reserved</FONT></TD></TR>
  <TR>
    <TD height=15></TD>
    <TD></TD></TR></TBODY></TABLE></DIV>
<DIV></DIV><!--内容结束//--><!--结束//--></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -