﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-UI.net</title><link>http://www.cnblogs.com/yellowyu/</link><description>专注于.net，专注于WinForm</description><language>zh-cn</language><lastBuildDate>Mon, 13 Oct 2008 04:31:39 GMT</lastBuildDate><pubDate>Mon, 13 Oct 2008 04:31:39 GMT</pubDate><ttl>60</ttl><item><title>Winform:关于钩子的基础知识</title><link>http://www.cnblogs.com/yellowyu/archive/2008/09/16/1291814.html</link><dc:creator>yellowyu</dc:creator><author>yellowyu</author><pubDate>Tue, 16 Sep 2008 08:41:00 GMT</pubDate><guid>http://www.cnblogs.com/yellowyu/archive/2008/09/16/1291814.html</guid><wfw:comment>http://www.cnblogs.com/yellowyu/comments/1291814.html</wfw:comment><comments>http://www.cnblogs.com/yellowyu/archive/2008/09/16/1291814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yellowyu/comments/commentRss/1291814.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yellowyu/services/trackbacks/1291814.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">基本概念</span> <br />
<span style="font-family: 宋体;">钩子</span>(Hook)<span style="font-family: 宋体;">，是</span>Windows<span style="font-family: 宋体;">消息处理机制的一个平台</span>,<span style="font-family: 宋体;">应用程序可以在上面设置子程以监视指定窗口的某种消息，而且所监视的窗口可以是其他进程所创建的。当消息到达后，在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理</span>window<span style="font-family: 宋体;">消息或特定事件。</span> <br />
<span style="font-family: 宋体;">钩子实际上是一个处理消息的程序段，通过系统调用，把它挂入系统。每当特定的消息发出，在没有到达目的窗口前，钩子程序就先捕获该消息，亦即钩子函数先得到控制权。这时钩子函数即可以加工处理（改变）该消息，也可以不作处理而继续传递该消息，还可以强制结束消息的传递。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">在</span><a href="http://blog.csdn.net/hejinjiang/archive/2008/03/19/2197066.aspx">http://blog.csdn.net/hejinjiang/archive/2008/03/19/2197066.aspx</a><span style="font-family: 宋体;">有对勾子作了非常详细的介绍</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">尽管在</span> .NET <span style="font-family: 宋体;">框架中不支持全局挂钩</span></p>
<p>MSDN<span style="font-family: 宋体;">：</span></p>
<p><span style="font-family: 宋体;">您无法在</span> Microsoft .NET <span style="font-family: 宋体;">框架中实现全局挂钩。若要安装全局挂钩，挂钩必须有一个本机动态链接库</span> (DLL) <span style="font-family: 宋体;">导出以便将其本身插入到另一个需要调入一个有效而且一致的函数的进程中。这需要一个</span> DLL <span style="font-family: 宋体;">导出，而</span> .NET <span style="font-family: 宋体;">框架不支持这一点。托管代码没有让函数指针具有统一的值这一概念，因为这些函数是动态构建的代理。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">但我们通过</span>API<span style="font-family: 宋体;">函数的调用，还是可以照样实现十年前很热门的技术</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">勾子到底能干嘛呢？</span></p>
<p><span style="font-family: 宋体;">提示</span>: <span style="font-family: 宋体;">如果要设置系统级钩子</span>, <span style="font-family: 宋体;">钩子函数必须在</span> DLL <span style="font-family: 宋体;">中</span>. </p>
<div align="center">  <hr align="center" size="2" width="100%" />
</div>
<p>SetWindowsHookEx(</p>
<p>&nbsp;idHook: Integer;<span>&nbsp;&nbsp; {</span><span style="font-family: 宋体;">钩子类型</span>}</p>
<p>&nbsp;lpfn: TFNHookProc; {<span style="font-family: 宋体;">函数指针</span>}</p>
<p>&nbsp;hmod: HINST;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><span style="font-family: 宋体;">包含钩子函数的模块</span>(EXE<span style="font-family: 宋体;">、</span>DLL)<span style="font-family: 宋体;">句柄</span>; <span style="font-family: 宋体;">一般是</span> HInstance; <span style="font-family: 宋体;">如果是当前线程这里可以是</span> 0}</p>
<p>&nbsp;dwThreadId: DWORD&nbsp;{<span style="font-family: 宋体;">关联的线程</span>; <span style="font-family: 宋体;">可用</span> GetCurrentThreadId <span style="font-family: 宋体;">获取当前线程</span>; 0 <span style="font-family: 宋体;">表示是系统级钩子</span>}</p>
<p>): HHOOK;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span><span style="font-family: 宋体;">返回钩子的句柄</span>; 0 <span style="font-family: 宋体;">表示失败</span>}</p>
<p>&nbsp;</p>
<p>//<span style="font-family: 宋体;">钩子类型</span> idHook <span style="font-family: 宋体;">选项</span>:</p>
<p>WH_MSGFILTER<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = -1; {</span><span style="font-family: 宋体;">线程级</span>; <span style="font-family: 宋体;">截获用户与控件交互的消息</span>}</p>
<p>WH_JOURNALRECORD<span>&nbsp;&nbsp; = 0;&nbsp;{</span><span style="font-family: 宋体;">系统级</span>; <span style="font-family: 宋体;">记录所有消息队列从消息队列送出的输入消息</span>, <span style="font-family: 宋体;">在消息从队列中清除时发生</span>; <span style="font-family: 宋体;">可用于宏记录</span>}</p>
<p>WH_JOURNALPLAYBACK = 1;&nbsp;{<span style="font-family: 宋体;">系统级</span>; <span style="font-family: 宋体;">回放由</span> WH_JOURNALRECORD <span style="font-family: 宋体;">记录的消息</span>, <span style="font-family: 宋体;">也就是将这些消息重新送入消息队列</span>}</p>
<p>WH_KEYBOARD<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 2;&nbsp;{</span><span style="font-family: 宋体;">系统级或线程级</span>; <span style="font-family: 宋体;">截获键盘消息</span>}</p>
<p>WH_GETMESSAGE<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 3;&nbsp;{</span><span style="font-family: 宋体;">系统级或线程级</span>; <span style="font-family: 宋体;">截获从消息队列送出的消息</span>}</p>
<p>WH_CALLWNDPROC<span>&nbsp;&nbsp;&nbsp;&nbsp; = 4;&nbsp;{</span><span style="font-family: 宋体;">系统级或线程级</span>; <span style="font-family: 宋体;">截获发送到目标窗口的消息</span>, <span style="font-family: 宋体;">在</span> SendMessage <span style="font-family: 宋体;">调用时发生</span>}</p>
<p>WH_CBT<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 5;&nbsp;{</span><span style="font-family: 宋体;">系统级或线程级</span>; <span style="font-family: 宋体;">截获系统基本消息</span>, <span style="font-family: 宋体;">譬如</span>: <span style="font-family: 宋体;">窗口的创建、激活、关闭、最大最小化、移动等等</span>}</p>
<p>WH_SYSMSGFILTER<span>&nbsp;&nbsp;&nbsp; = 6;&nbsp;{</span><span style="font-family: 宋体;">系统级</span>; <span style="font-family: 宋体;">截获系统范围内用户与控件交互的消息</span>}</p>
<p>WH_MOUSE<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 7;&nbsp;{</span><span style="font-family: 宋体;">系统级或线程级</span>; <span style="font-family: 宋体;">截获鼠标消息</span>}</p>
<p>WH_HARDWARE<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 8;&nbsp;{</span><span style="font-family: 宋体;">系统级或线程级</span>; <span style="font-family: 宋体;">截获非标准硬件</span>(<span style="font-family: 宋体;">非鼠标、键盘</span>)<span style="font-family: 宋体;">的消息</span>}</p>
<p>WH_DEBUG<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 9;&nbsp;{</span><span style="font-family: 宋体;">系统级或线程级</span>; <span style="font-family: 宋体;">在其他钩子调用前调用</span>, <span style="font-family: 宋体;">用于调试钩子</span>}</p>
<p>WH_SHELL<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 10; {</span><span style="font-family: 宋体;">系统级或线程级</span>; <span style="font-family: 宋体;">截获发向外壳应用程序的消息</span>}</p>
<p>WH_FOREGROUNDIDLE&nbsp;= 11; {<span style="font-family: 宋体;">系统级或线程级</span>; <span style="font-family: 宋体;">在程序前台线程空闲时调用</span>}</p>
<p>WH_CALLWNDPROCRET&nbsp;= 12; {<span style="font-family: 宋体;">系统级或线程级</span>; <span style="font-family: 宋体;">截获目标窗口处理完毕的消息</span>, <span style="font-family: 宋体;">在</span> SendMessage <span style="font-family: 宋体;">调用后发生</span>}</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">从这个结构体与其枚举参数，这是仁者见仁的事情，我们同事一直都在做用钩子控制别人软件，如</span>QQ<span style="font-family: 宋体;">的事情，嘿嘿，其实也即相当于木马了，比如某某监听健盘而获取你密码的软件。而我们经常用的</span>ctrl+alt+z<span style="font-family: 宋体;">调出</span>QQ<span style="font-family: 宋体;">，也可以通过做一个全局的钩子来应用（热健的下面再介绍）</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">这里介绍了一篇勾住</span>MOUSE<span style="font-family: 宋体;">的方法</span></p>
<p><a href="http://support.microsoft.com/kb/318804/">http://support.microsoft.com/kb/318804/</a></p>
<p><span style="font-family: 宋体;">而这里也介绍了一篇控制</span>KEYBOARD<span style="font-family: 宋体;">的方法</span></p>
<p>http://www.cnblogs.com/zagelover/articles/1137331.html</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">而其最主要的就是下面这么几个</span>API<span style="font-family: 宋体;">函数，而委托作为函数指针也在这里有个比较完美的体现吧，其实就充当回调函数的指针。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;//Declare wrapper managed MouseHookStruct class.</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [StructLayout(LayoutKind.Sequential)]</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class MouseHookStruct</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public POINT pt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int hwnd;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int wHitTestCode;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int dwExtraInfo;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>//<span style="font-family: 宋体;">声明键盘钩子的封送结构类型</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [StructLayout(LayoutKind.Sequential)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class KeyboardHookStruct<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int vkCode; //<span style="font-family: 宋体;">表示一个在</span>1<span style="font-family: 宋体;">到</span>254<span style="font-family: 宋体;">间的虚似键盘码</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int scanCode; //<span style="font-family: 宋体;">表示硬件扫描码</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int flags;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int time;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int dwExtraInfo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体;">装置钩子的函数</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体;">卸下钩子的函数</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static extern bool UnhookWindowsHookEx(int idHook);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<span style="font-family: 宋体;">下一个钩挂的函数</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [DllImport("user32")]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static extern int ToAscii(int uVirtKey, int uScanCode, byte[] lpbKeyState, byte[] lpwTransKey, int fuState);</p>
<p><span style="font-family: 宋体;">注：</span></p>
<p>ToAscii Function</p>
<div align="center">  <hr align="center" size="1" width="100%" />
</div>
<p>The ToAscii function translates the specified virtual-key code and keyboard state to the corresponding character or characters. The function translates the code using the input language and physical keyboard layout identified by the keyboard layout handle. </p>
<p>To specify a handle to the keyboard layout to use to translate the specified code, use the ToAsciiEx function.</p>
<p>Return Value</p>
<p>If the specified key is a dead key, the return value is negative. Otherwise, it is one of the following values. </p>
<table border="0" cellpadding="0">
    <tr>
        <td style="padding: 1.5pt; background: #eeeeee none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top">
        <p>Value</p>
        </td>
        <td style="padding: 1.5pt; background: #eeeeee none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top">
        <p>Meaning</p>
        </td>
    </tr>
    <tr>
        <td style="padding: 1.5pt; background: #eeeeee none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top">
        <p>0</p>
        </td>
        <td style="padding: 1.5pt; background: #eeeeee none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top">
        <p>The specified virtual key has no   translation for the current state of the keyboard.</p>
        </td>
    </tr>
    <tr>
        <td style="padding: 1.5pt; background: #eeeeee none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top">
        <p>1</p>
        </td>
        <td style="padding: 1.5pt; background: #eeeeee none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top">
        <p>One character was copied to the buffer.</p>
        </td>
    </tr>
    <tr>
        <td style="padding: 1.5pt; background: #eeeeee none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top">
        <p>2</p>
        </td>
        <td style="padding: 1.5pt; background: #eeeeee none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" valign="top">
        <p>Two characters were copied to the buffer.   This usually happens when a dead-key character (accent or diacritic) stored   in the keyboard layout cannot be composed with the specified virtual key to   form a single character.</p>
        </td>
    </tr>
</table>
<p><span style="font-family: 宋体;">通过这个函数，有时也可以实现某些热健功能</span>,<span style="font-family: 宋体;">特别是返回值为</span>1<span style="font-family: 宋体;">时</span>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p><span style="font-family: 宋体;">到这里也顺便复习下</span>KEYPRESS<span style="font-family: 宋体;">：</span></p>
<p><span style="font-family: 宋体;">在控件有焦点的情况下按下键时发生</span></p>
<p><span style="font-family: 宋体;">键事件按下列顺序发生：</span> </p>
<p><a href="ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/CPref17/html/E_System_Windows_Forms_Control_KeyDown.htm">KeyDown</a> </p>
<p>KeyPress </p>
<p><a href="ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/CPref17/html/E_System_Windows_Forms_Control_KeyUp.htm">KeyUp</a> </p>
<p><span style="font-family: 宋体;">非字符键不会引发</span> KeyPress <span style="font-family: 宋体;">事件；但非字符键却可以引发</span> KeyDown <span style="font-family: 宋体;">和</span> KeyUp <span style="font-family: 宋体;">事件。</span></p>
<p><span style="font-family: 宋体;">使用</span> <a href="ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/CPref17/html/P_System_Windows_Forms_KeyPressEventArgs_KeyChar.htm">KeyChar</a> <span style="font-family: 宋体;">属性在运行时对键击进行取样，并且使用或修改公共键击的子集。</span></p>
<p><span style="font-family: 宋体;">若要仅在窗体级别处理键盘事件而不允许其他控件接收键盘事件，请将窗体的</span> KeyPress <span style="font-family: 宋体;">事件处理方法中的</span> <a href="ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/CPref17/html/P_System_Windows_Forms_KeyPressEventArgs_Handled.htm">KeyPressEventArgs.Handled</a> <span style="font-family: 宋体;">属性设置为</span> true<span style="font-family: 宋体;">。</span></p>
<p>&nbsp;&nbsp; 说明 &nbsp; <br />
&nbsp;  &nbsp; <br />
&nbsp; 具有焦点的对象接收该事件。一个窗体仅在它没有可视和有效的控件或 &nbsp; KeyPreview &nbsp; 属性被设置为 &nbsp; True &nbsp; 时才能接收该事件。一个 &nbsp; KeyPress &nbsp; 事件可以引用任何可打印的键盘字符，一个来自标准字母表的字符或少数几个特殊字符之一的字符与 &nbsp; CTRL &nbsp; 键的组合，以及 &nbsp; ENTER &nbsp; 或 &nbsp; BACKSPACE &nbsp; 键。KeyPress &nbsp; 事件过程在截取 &nbsp; TextBox &nbsp; 或 &nbsp; ComboBox &nbsp; 控件所输入的击键时是非常有用的。它可立即测试击键的有效性或在字符输入时对其进行格式处理。改变 &nbsp; keyascii &nbsp; 参数的值会改变所显示的字符。 &nbsp; <br />
&nbsp;  &nbsp; <br />
&nbsp; 可使用下列表达式将 &nbsp; keyascii &nbsp; 参数转变为一个字符： &nbsp; <br />
&nbsp;  &nbsp; <br />
&nbsp; Chr(KeyAscii) &nbsp; <br />
&nbsp;  &nbsp; <br />
&nbsp; 然后执行字符串操作，并将该字符反译成一个控件可通过该表达式解释的 &nbsp; ANSI &nbsp; 数字： &nbsp; <br />
&nbsp;  &nbsp; <br />
&nbsp; KeyAscii &nbsp; = &nbsp; Asc(char) &nbsp; <br />
&nbsp;  &nbsp; <br />
&nbsp; 应当使用 &nbsp; KeyDown &nbsp; 和 &nbsp; KeyUP &nbsp; 事件过程来处理任何不被 &nbsp; KeyPress &nbsp; 识别的击键，诸如：功能键、编辑键、定位键以及任何这些键和键盘换档键的组合等。与 &nbsp; KeyDown &nbsp; 和 &nbsp; KeyUp &nbsp; 事件不同的是，KeyPress &nbsp; 不显示键盘的物理状态，而只是传递一个字符。 &nbsp; <br />
&nbsp;  &nbsp; <br />
&nbsp; KeyPress &nbsp; 将每个字符的大、小写形式作为不同的键代码解释，即作为两种不同的字符。而 &nbsp; KeyDown &nbsp; 和 &nbsp; KeyUp &nbsp; 用两种参数解释每个字符的大写形式和小写形式：keycode &nbsp; — &nbsp; 显示物理的键（将 &nbsp; A &nbsp; 和 &nbsp; a &nbsp; 作为同一个键返回）和 &nbsp; shift &nbsp; —指示 &nbsp; shift &nbsp; + &nbsp; key &nbsp; 键的状态而且返回 &nbsp; A &nbsp; 或 &nbsp; a &nbsp; 其中之一。 &nbsp; <br />
&nbsp;  &nbsp; <br />
&nbsp; 如果 &nbsp; KeyPreview &nbsp; 属性被设置为 &nbsp; True，窗体将先于该窗体上的控件接收此事件。可用 &nbsp; KeyPreview &nbsp; 属性来创建全局键盘处理例程。 &nbsp; <br />
&nbsp;  &nbsp; <br />
</p>
<p> &nbsp; 注意...CTRL+@ &nbsp; 的键盘组合的 &nbsp; ANSI &nbsp; 编号是 &nbsp; 0。因为 &nbsp; Visual &nbsp; Basic &nbsp; 将一个零值的 &nbsp; keyascii &nbsp; 识别为一个长度为零的字符串 &nbsp; ("")，在应用程序中应避免使用 &nbsp; CTRL+@ &nbsp; 的组合。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">在这里下面的委托将充当函数指针用</span></p>
<p>public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">主要的代码在以上的三个链接里已有明确的说明了，这里就只做总结备注，其实钩子的应用很强大，有些软件跟</span>MSN<span style="font-family: 宋体;">，</span>QQ<span style="font-family: 宋体;">通讯，不走协议的，就是通过</span>HOOK<span style="font-family: 宋体;">控制其软件，再通过窗口句柄做一些相应的应用，而这些在</span>C++<span style="font-family: 宋体;">里应用的相当广泛。。。。十年前的技术了。。。。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/yellowyu/aggbug/1291814.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42960/" target="_blank">[新闻]Facebook创始人:信息共享或存摩尔定律</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>WinForm:关于滚动条的基础知识</title><link>http://www.cnblogs.com/yellowyu/archive/2008/09/14/1290897.html</link><dc:creator>yellowyu</dc:creator><author>yellowyu</author><pubDate>Sun, 14 Sep 2008 14:43:00 GMT</pubDate><guid>http://www.cnblogs.com/yellowyu/archive/2008/09/14/1290897.html</guid><wfw:comment>http://www.cnblogs.com/yellowyu/comments/1290897.html</wfw:comment><comments>http://www.cnblogs.com/yellowyu/archive/2008/09/14/1290897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yellowyu/comments/commentRss/1290897.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yellowyu/services/trackbacks/1290897.html</trackback:ping><description><![CDATA[摘要: 以下是windows 程序設计里一段代码，简单的说明设置SCORLL，主要是几个API，二百多行代码，抄写了好久好久，不忍没掉，记录下来。。。。C#对滚动条是做了好多工作，我们无论在那个控件里都可以简单通过属性调用，但如果该控件到了自定义时，就比较麻烦了而在此也记录点滚动条的基础知识，总结备用吧。。。。。。 LRESULT CALLBACK WndProc(HWND hwnd,UINT messa&nbsp;&nbsp;<a href='http://www.cnblogs.com/yellowyu/archive/2008/09/14/1290897.html'>阅读全文</a><img src ="http://www.cnblogs.com/yellowyu/aggbug/1290897.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42959/" target="_blank">[新闻]微软承认Vista用户账户控制功能有问题</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>WinForm：怎么创建一个Form的</title><link>http://www.cnblogs.com/yellowyu/archive/2008/09/14/1290744.html</link><dc:creator>yellowyu</dc:creator><author>yellowyu</author><pubDate>Sun, 14 Sep 2008 02:54:00 GMT</pubDate><guid>http://www.cnblogs.com/yellowyu/archive/2008/09/14/1290744.html</guid><wfw:comment>http://www.cnblogs.com/yellowyu/comments/1290744.html</wfw:comment><comments>http://www.cnblogs.com/yellowyu/archive/2008/09/14/1290744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yellowyu/comments/commentRss/1290744.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yellowyu/services/trackbacks/1290744.html</trackback:ping><description><![CDATA[摘要: 又是新生入学，想起去年毕业后也是差不多这个时候开始学习WinForm 从刚开始的拖拉控件照抄DEMO，到后来的学习别人的源码，到后来的参与项目，到后来修改别人的BUG，到后来指导新生开始学习WinForm在这个标签里，我也记录一下自已得到的一些C、C++的知识吧，或者C相比于C#来说，更能让我们明白创建一个WINDOWS程序&#160;先来一个经典的例子：创建一个窗体（代码源自于windows程序&nbsp;&nbsp;<a href='http://www.cnblogs.com/yellowyu/archive/2008/09/14/1290744.html'>阅读全文</a><img src ="http://www.cnblogs.com/yellowyu/aggbug/1290744.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42959/" target="_blank">[新闻]微软承认Vista用户账户控制功能有问题</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>记念一下，偶的First PM</title><link>http://www.cnblogs.com/yellowyu/archive/2008/09/08/1287041.html</link><dc:creator>yellowyu</dc:creator><author>yellowyu</author><pubDate>Mon, 08 Sep 2008 12:02:00 GMT</pubDate><guid>http://www.cnblogs.com/yellowyu/archive/2008/09/08/1287041.html</guid><wfw:comment>http://www.cnblogs.com/yellowyu/comments/1287041.html</wfw:comment><comments>http://www.cnblogs.com/yellowyu/archive/2008/09/08/1287041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yellowyu/comments/commentRss/1287041.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yellowyu/services/trackbacks/1287041.html</trackback:ping><description><![CDATA[<p>只是一所普通的大学的专科毕业－集美大学</p>
<p>&nbsp;</p>
<p>也只是在毕业时得到院长的青睐和照顾，在其推荐下来到上海一所研究所里写代码而认识了他<br />
</p>
<p>&nbsp;</p>
<p>也只是在他的指导下，开始了我的WinForm开发之路<br />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在园子里一直听到的，都是很高级的软件工程，设计模式，WEB2.0,WPF，WCF等等</p>
<p>&nbsp;</p>
<p>可他的指导却不是等等这些，而且也感觉，他并不需要非要这些，才能算得上一个好的CODER<br />
</p>
<p>&nbsp;</p>
<p>或者他并没特别为某一种模式而去写代码，但他写的代码里面，或者他指导写的代码里面，就有着某一种模式</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>他是老的WIN32 CODER，也是行业里所描述的那种C++高手<br />
</p>
<p>&nbsp;</p>
<p>他并未教我C#，但，他教会了我写代码，或者说是，让我知道代码该怎么写<br />
</p>
<p>&nbsp;</p>
<p>而且更多的还有为人处世做事情等等<br />
</p>
<p><br />
</p>
<p>&nbsp;</p>
<p>打DOTA时，FIRST BLOOD是很重要的，<br />
</p>
<p>&nbsp;</p>
<p>他走后，才感觉，第一次就这么给了他，挺安慰的。。。。。</p>
<p>&nbsp;</p>
<p>记念一下，偶的FPM</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>其实很多东西都说不清楚</p>
<p>&nbsp; <br />
</p>
<p>很多东西想说的时候又说不出<br />
</p>
<p>&nbsp;</p>
<p>很多时候不曾注意，走之后才感觉他是对的：&#8220;态度决定一切&#8221;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>加油吧！YELLOWYU！BLESS<br />
</p>
<p> <br />
</p><img src ="http://www.cnblogs.com/yellowyu/aggbug/1287041.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42958/" target="_blank">[新闻]资本寒冬侵袭中国视频网站 营销春天或不远</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>WinForm:IM聊天用的Richtextbox</title><link>http://www.cnblogs.com/yellowyu/archive/2008/09/06/1285772.html</link><dc:creator>yellowyu</dc:creator><author>yellowyu</author><pubDate>Sat, 06 Sep 2008 12:20:00 GMT</pubDate><guid>http://www.cnblogs.com/yellowyu/archive/2008/09/06/1285772.html</guid><wfw:comment>http://www.cnblogs.com/yellowyu/comments/1285772.html</wfw:comment><comments>http://www.cnblogs.com/yellowyu/archive/2008/09/06/1285772.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/yellowyu/comments/commentRss/1285772.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yellowyu/services/trackbacks/1285772.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">我们经常使用一些文本控件，</span>RichTextbox<span style="font-family: 宋体;">即是其中最最为经常使用的一种，而我们谁注意过，我们在用</span>IM<span style="font-family: 宋体;">聊天时，无论是</span>MSN,QQ,SKYPE<span style="font-family: 宋体;">他们的文本显示，都显得那么灵活，舒服，而这并不只是</span>RichTextbox<span style="font-family: 宋体;">几个属性即能做到的</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">以下即是今天刚完成的</span>Richtextbox<span style="font-family: 宋体;">的效果</span></p>
<p>&nbsp;</p>
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/yellowyu/YYR.jpg" />
<p>&nbsp;</p>
<p><span style="font-size: 12pt; font-family: 宋体;">或许你一直在用，而你不曾注意过，可当你做的时候，才发现，这并不是一两个属性即完成的。。。。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 12pt; font-family: 宋体;">难点在那呢！</span></p>
<p><span style="font-size: 12pt; font-family: Arial;">1</span><span style="font-size: 12pt; font-family: 宋体;">：字体背景颜色，并且自定义大小</span></p>
<p><span style="font-size: 12pt; font-family: Arial;">2</span><span style="font-size: 12pt; font-family: 宋体;">：插入链接，不以</span><span style="font-size: 12pt; font-family: Arial;"><a href="http://www/"><span style="color: windowtext;">http://www</span></a></span><span style="font-size: 12pt; font-family: 宋体;">开头的哦</span></p>
<p><span style="font-size: 12pt; font-family: Arial;">3</span><span style="font-size: 12pt; font-family: 宋体;">：插入图片</span></p>
<p><span style="font-size: 12pt; font-family: Arial;">4</span><span style="font-size: 12pt; font-family: 宋体;">：取消链接</span></p>
<p><span style="font-size: 12pt; font-family: Arial;">5</span><span style="font-size: 12pt; font-family: 宋体;">：与左边框的间距，让别人清楚那些是聊天内容，那些是呢称</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 12pt; font-family: 宋体;">而这里面最主要的一点即是，涉及到</span><span style="font-size: 12pt; font-family: Arial;">RTF</span><span style="font-size: 12pt; font-family: 宋体;">的内容，正如袁永福先生在其博客里所说到：&#8220;</span><span style="font-family: 宋体;">它是一种很古老的技术，却一直到现在还在广泛的使用，而且估计还能用上很长一段时期。其实我们在学习不断出现的新技术的时候，也可以注意那些古老的但经过时间考验的技术。&#8221;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">摘自：</span><a href="http://www.cnblogs.com/xdesigner/archive/2007/10/22/932737.html"><span style="color: windowtext;">http://www.cnblogs.com/xdesigner/archive/2007/10/22/932737.html</span></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">这里不想过多的提及</span>RTF,<span style="font-family: 宋体;">在袁先生的博文里有很详细的描述，而两百多页的官方文档确实让人不敢启及，有谁需要的，可留下</span>EMAIL<span style="font-family: 宋体;">，或者到微软</span>MSDN<span style="font-family: 宋体;">下载，</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">在这里给出一个</span>DEMO<span style="font-family: 宋体;">，其实以上</span>80%<span style="font-family: 宋体;">的代码都来自于此例子，嘿嘿</span></p>
<p><a href="http://www.codeproject.com/KB/edit/csexrichtextbox.aspx"><span style="color: windowtext;">http://www.codeproject.com/KB/edit/csexrichtextbox.aspx</span></a></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">作者很热心地开源了一个支持以上难点，</span>1,3<span style="font-family: 宋体;">的问题所在，里面介绍了插入文本与插入图片，也指出了需要改进的地方</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">而插入链接，则是在另一份文章里面有介绍</span><a href="http://www.codeproject.com/KB/edit/RichTextBoxLinks.aspx"><span style="color: windowtext;">http://www.codeproject.com/KB/edit/RichTextBoxLinks.aspx</span></a></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">作者里原先是不支持插入中文链接，只需将其</span>RTF<span style="font-family: 宋体;">的表头改下就可以了</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">this.SelectedRtf = @"{"rtf1"ansi"ansicpg936"deff0"deflang1033"deflangfe2052 " + text + @""v #" + hyperlink + @""v0}";</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">其设置链接最主要的一点还是</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">private void SetSelectionStyle(UInt32 mask, UInt32 effect)</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">{</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">CHARFORMAT2_STRUCT cf = new CHARFORMAT2_STRUCT();</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">cf.cbSize = (UInt32)Marshal.SizeOf(cf);</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">cf.dwMask = mask;</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">cf.dwEffects = effect;</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">IntPtr wpar = new IntPtr(SCF_SELECTION);</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">IntPtr lpar = Marshal.AllocCoTaskMem( Marshal.SizeOf( cf ) );</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">Marshal.StructureToPtr(cf, lpar, false);</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">IntPtr res = SendMessage(Handle, EM_SETCHARFORMAT, wpar, lpar);</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">Marshal.FreeCoTaskMem(lpar);</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">}</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">主要还是SETCHARFORMAT这个消息设置，老的MFC coder可能会比较熟，这也说明，其实不管C#，C++底层其实并不相差太多，都是WINDOWS，嘿嘿</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">而取消链接，其实这里面最主要的一点是定位，则是</span>CSDN<span style="font-family: 宋体;">另一朋友（好久以前不经意提醒过偶，现忘了他的地址了，改天发现再贴上来）</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">则是通过</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">rtbox_MessageHistory.SelectionStart = rtbox_MessageHistory.GetCharIndexFromPosition(rtbox_MessageHistory.PointToClient(Control.MousePosition));</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">rtbox_MessageHistory.Select(rtbox_MessageHistory.SelectionStart - 2, 4);</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">if (e.LinkText.Contains(strCancel))</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">{</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">rtbox_MessageHistory.SetSelectionLink(false);</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">rtbox_MessageHistory.AppendText("</span><span style="font-size: 9pt; font-family: 新宋体;">您已经取消了和远程好友的语音请求。"r"n");</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">}</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">这种方式来取消掉</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">而与左边框的间距，是比较简单的一点</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">//</span><span style="font-size: 9pt; font-family: 新宋体;">设置与左边距的间距</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">this.Select(position, _rtf.Length - 1);</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">this.SelectionIndent = intIndent;</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">通过SelectionIndent这个属性设置，而MSDN也给也了其详细的介绍</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">通过以上这些，也完成了以上窗体控件的操作，此时如</span>MSN<span style="font-family: 宋体;">，</span>QQ<span style="font-family: 宋体;">，</span>SKYPE<span style="font-family: 宋体;">那样效果的聊天控件再研究下下应该就都可以做了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">这里只是做一个比较完整的控件的介绍，资料大部分是网上学习，</span>COPY<span style="font-family: 宋体;">得来的，也只是简单的封装以上的类，如有需要，就留下</span>EMAIL<span style="font-family: 宋体;">吧，不过，其实只要看了那两个</span>DEMO<span style="font-family: 宋体;">，应该就都能做了。这里尊重作者，就不乱贴了。。。。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">上网找资料时，看到的都是问得多，答得少，就把常见的主要的问题都解决一下，嘿嘿，加油，继续我的</span>VortexIM</p>
<p>&nbsp;</p>
<p>这里并不涉及SOCKET，个人觉得，IM通信编程难点还是在服务器上，我们采用的是以c++编写的完成端口模型，而客户端则是在用户体验上 <br />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/yellowyu/aggbug/1285772.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42957/" target="_blank">[新闻]金融风暴波及全球创业板 中国概念股难独善其身</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>winForm：面对未捕获的异常时。。。。。</title><link>http://www.cnblogs.com/yellowyu/archive/2008/09/04/1284003.html</link><dc:creator>yellowyu</dc:creator><author>yellowyu</author><pubDate>Thu, 04 Sep 2008 06:35:00 GMT</pubDate><guid>http://www.cnblogs.com/yellowyu/archive/2008/09/04/1284003.html</guid><wfw:comment>http://www.cnblogs.com/yellowyu/comments/1284003.html</wfw:comment><comments>http://www.cnblogs.com/yellowyu/archive/2008/09/04/1284003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yellowyu/comments/commentRss/1284003.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yellowyu/services/trackbacks/1284003.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:&quot;Times New Roman&quot;">还记得某牛人说过的，代码越多，存在的</span><span lang="EN-US">BUG</span><span style="font-family:宋体;mso-ascii-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:&quot;Times New Roman&quot;">就可能越多，面对</span><span lang="EN-US">BUG</span><span style="font-family:宋体;mso-ascii-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:
&quot;Times New Roman&quot;">，我们只能通过我们的细心，经验去避开，去解决，但面对一些未曾料到的</span><span lang="EN-US">BUG</span><span style="font-family:宋体;mso-ascii-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:
&quot;Times New Roman&quot;">而抛出异常时，我们未能将其捕获时，软件经常无理由地弹出一个警告框而退出，甚至于久违的蓝屏，我们真的无能为力了呀！</span></p>
<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:&quot;Times New Roman&quot;">或许我们能做点什么。。。。。。。</span></p>
<p class="MsoNormal"><span style="font-family:宋体;mso-ascii-font-family:&quot;Times New Roman&quot;;
mso-hansi-font-family:&quot;Times New Roman&quot;">据</span><span lang="EN-US">msdn</span><span style="font-family:宋体;mso-ascii-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:
&quot;Times New Roman&quot;">记载</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal"><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black">The following code example sets event handlers
for exceptions that occur on Windows Forms threads and exceptions that occur on
other threads. <o:p></o:p></span></span></p>
<p class="MsoNormal"><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black"><o:p>&#160;</o:p></span></span></p>
<p class="MsoNormal"><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black">It sets<a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.application.setunhandledexceptionmode.aspx"><span style="color:purple;text-decoration:none;text-underline:none">SetUnhandledExceptionMode</span></a></span></span><span class="apple-converted-space"><span lang="EN-US" style="font-size:12.0pt;
mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:&quot;Times New Roman&quot;;
color:black">&#160;</span></span><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black">so that all exceptions are handled by the
application, regardless of the settings in the application's user configuration
file. <o:p></o:p></span></span></p>
<p class="MsoNormal"><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black"><o:p>&#160;</o:p></span></span></p>
<p class="MsoNormal"><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black">It uses the</span></span><span class="apple-converted-space"><span lang="EN-US" style="font-size:12.0pt;
mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:&quot;Times New Roman&quot;;
color:black">&#160;</span></span><span class="selflink"><strong><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black">ThreadException</span></strong></span><span class="apple-converted-space"><span lang="EN-US" style="font-size:12.0pt;
mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:&quot;Times New Roman&quot;;
color:black">&#160;</span></span><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black">event to handle UI thread exceptions, and the</span></span><span class="apple-converted-space"><span lang="EN-US" style="font-size:12.0pt;
mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:&quot;Times New Roman&quot;;
color:black">&#160;</span></span><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black"><a href="http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx"><span style="color:purple;text-decoration:none;text-underline:none">UnhandledException</span></a></span></span><span class="apple-converted-space"><span lang="EN-US" style="font-size:12.0pt;
mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:&quot;Times New Roman&quot;;
color:black">&#160;</span></span><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black">event to handle non-UI thread exceptions. Since<a href="http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx"><span style="color:purple;text-decoration:none;text-underline:none">UnhandledException</span></a></span></span><span class="apple-converted-space"><span lang="EN-US" style="font-size:12.0pt;
mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:&quot;Times New Roman&quot;;
color:black">&#160;</span></span><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black">cannot prevent an application from terminating,
the example simply logs the error in the application event log before
termination.</span></span></p>
<p class="MsoNormal"><span ><span style="font-size:12.0pt;
mso-bidi-font-size:8.5pt;font-family:宋体;mso-ascii-font-family:Arial;mso-hansi-font-family:
Arial;color:black">像</span></span><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;
mso-bidi-font-family:&quot;Times New Roman&quot;;color:black">GOOGLE</span></span><span ><span style="font-size:12.0pt;mso-bidi-font-size:8.5pt;
font-family:宋体;mso-ascii-font-family:Arial;mso-hansi-font-family:Arial;
color:black">的</span></span><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black">crome</span></span><span ><span style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial;color:black">一样，一打开即是崩溃的信息。。。。。。但我们知道是那错了，或者像</span></span><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:
8.5pt;font-family:Arial;mso-bidi-font-family:&quot;Times New Roman&quot;;color:black">WEB</span></span><span ><span style="font-size:12.0pt;mso-bidi-font-size:8.5pt;
font-family:宋体;mso-ascii-font-family:Arial;mso-hansi-font-family:Arial;
color:black">迅雷一下，自动重启一下，而这些在</span></span><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;
mso-bidi-font-family:&quot;Times New Roman&quot;;color:black">Winform</span></span><span ><span style="font-size:12.0pt;mso-bidi-font-size:8.5pt;
font-family:宋体;mso-ascii-font-family:Arial;mso-hansi-font-family:Arial;
color:black">中，即是能过上面所描述的而捕获</span></span><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;
mso-bidi-font-family:&quot;Times New Roman&quot;;color:black"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span ><span lang="EN-US" style="font-size:12.0pt;mso-bidi-font-size:8.5pt;font-family:Arial;mso-bidi-font-family:
&quot;Times New Roman&quot;;color:black"><o:p>&#160;</o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:blue">public</span>
UnhandledExceptionDlg()<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:green">//
Add the event handler for handling UI thread exceptions to the event:<o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:teal">Application</span>.ThreadException
+= <span style="color:blue">new</span> <span style="color:teal">ThreadExceptionEventHandler</span>(ThreadExceptionFunction);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:green">//
Set the unhandled exception mode to force all Windows Forms errors to go
through our handler:<o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:teal">Application</span>.SetUnhandledExceptionMode(<span style="color:teal">UnhandledExceptionMode</span>.CatchException);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:green">//
Add the event handler for handling non-UI thread exceptions to the event:<o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:teal">AppDomain</span>.CurrentDomain.UnhandledException
+= <span style="color:blue">new</span> <span style="color:teal">UnhandledExceptionEventHandler</span>(UnhandledExceptionFunction);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;summary><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> Handle the UI exceptions by showing a dialog box<o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;/summary><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;param
name="sender">&lt;/param><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;param
name="e">&lt;/param><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:blue">private</span>
<span style="color:blue">void</span> ThreadExceptionFunction(<span style="color:teal">Object</span> sender, <span style="color:teal">ThreadExceptionEventArgs</span>
e)<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160; </span><span style="mso-spacerun:yes">&#160;&#160;&#160;</span>{<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:green">//
Suppress the Dialog in Debug mode:<o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;color:blue;mso-font-kerning:0pt;
mso-no-proof:yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>#if</span><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;
mso-font-kerning:0pt;mso-no-proof:yes"> !DEBUG<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
</span>ShowUnhandledExceptionDlg(e.Exception);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;color:blue;mso-font-kerning:0pt;
mso-no-proof:yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>#endif<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;summary><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> Handle the UI exceptions by showing a dialog box<o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;/summary><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;param
name="sender"></span><span style="color:green">Sender Object</span><span style="color:gray">&lt;/param><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;param
name="args"></span><span style="color:green">Passing arguments:
original exception etc.</span><span style="color:gray">&lt;/param><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:blue">private</span>
<span style="color:blue">void</span> UnhandledExceptionFunction(<span style="color:teal">Object</span> sender, <span style="color:teal">UnhandledExceptionEventArgs</span>
args)<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160; </span><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="color:green">// Suppress
the Dialog in Debug mode:<o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;color:blue;mso-font-kerning:0pt;
mso-no-proof:yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>#if</span><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;
mso-font-kerning:0pt;mso-no-proof:yes"> !DEBUG<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
</span>ShowUnhandledExceptionDlg((<span style="color:teal">Exception</span>)args.ExceptionObject);<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;color:blue;mso-font-kerning:0pt;
mso-no-proof:yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>#endif<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;summary><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> Raise Exception Dialog box for both UI and non-UI
Unhandled Exceptions<o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;/summary><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:gray">///</span><span style="color:green"> </span><span style="color:gray">&lt;param
name="e"></span><span style="color:green">Catched exception</span><span style="color:gray">&lt;/param><o:p></o:p></span></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:blue">private</span>
<span style="color:blue">void</span> ShowUnhandledExceptionDlg(<span style="color:teal">Exception</span> e)<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:teal">Exception</span>
unhandledException = e;<o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal" align="left" style="text-align:left;mso-layout-grid-align:
none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:
新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:
yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="color:blue">if</span>(unhandledException
== <span style="color:blue">null</span>)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;
mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:yes"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>unhandledException = <span style="color:blue">new</span> <span style="color:teal">Exception</span>(<span style="color:maroon">"Unknown unhandled Exception was occurred!"</span>);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;
mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:yes"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;
mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:yes"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:
&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:yes">我想作者的话已经很明确清楚了。。。。。。。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;
mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:yes"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal"><img src="http://www.cnblogs.com/images/cnblogs_com/yellowyu/ww.jpg" alt="" /><font  face="Arial"><br />
</font></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial">然后返回给我们的信息</span><span lang="EN-US" style="font-size:12.0pt;font-family:Arial;mso-bidi-font-family:&quot;Times New Roman&quot;">,</span><span style="font-size:12.0pt;font-family:宋体;mso-ascii-font-family:Arial;mso-hansi-font-family:
Arial">通过什么方式传都可以，此时再把相关资源释放掉，退出系统</span><span lang="EN-US" style="font-size:
12.0pt;font-family:Arial;mso-bidi-font-family:&quot;Times New Roman&quot;"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:12.0pt;font-family:Arial;
mso-bidi-font-family:&quot;Times New Roman&quot;"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:12.0pt;font-family:Arial;
mso-bidi-font-family:&quot;Times New Roman&quot;"><o:p>&#160;</o:p></span></p>
<pre><span class="code-keyword"><span lang="CS" style="mso-ansi-language:CS">private</span></span><span lang="CS" style="mso-ansi-language:CS"> DialogResult ShowThreadExceptionDialog(Exception ex) <o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;</span>{<o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span class="code-keyword">string</span> errorMessage= <o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="code-string">"Unhandled Exception:\n\n"</span> +<o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>ex.Message + <span class="code-string">"\n\n"</span> + <o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>ex.GetType() + <o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="code-string">"\n\nStack Trace:\n"</span> + <o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>ex.StackTrace;<o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><o:p>&#160;</o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span class="code-keyword">return</span> MessageBox.Show(errorMessage, <o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span class="code-string">"Application Error"</span>, <o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>MessageBoxButtons.AbortRetryIgnore, <o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>MessageBoxIcon.Stop);<o:p></o:p></span></pre>
<pre><span lang="CS" style="mso-ansi-language:CS"><span style="mso-spacerun:yes">&#160;&#160;&#160; </span>}<o:p></o:p></span></pre>
<p class="MsoNormal"><span lang="EN-US" style="font-size:12.0pt;font-family:Arial;
mso-bidi-font-family:&quot;Times New Roman&quot;"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:12.0pt;font-family:Arial;
mso-bidi-font-family:&quot;Times New Roman&quot;"><o:p>&#160;</o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;font-family:宋体;mso-ascii-font-family:
Arial;mso-hansi-font-family:Arial">对我们来讲，或许这里面最重要的信息就是</span><span class="code-string"><span lang="CS" style="mso-ansi-language:CS">Stack Trace<span style="mso-spacerun:yes">&#160; </span></span></span><span class="code-string"><span style="font-family:宋体;mso-ascii-font-family:&quot;Times New Roman&quot;;mso-hansi-font-family:
&quot;Times New Roman&quot;;mso-ansi-language:CS">嘿嘿！接着就是重启了。。。。</span></span><span class="code-string"><span lang="CS" style="mso-ansi-language:CS"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="mso-layout-grid-align:none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;
color:green;mso-font-kerning:0pt;mso-no-proof:yes">// User wants to restart the
App:<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-layout-grid-align:none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;
color:blue;mso-font-kerning:0pt;mso-no-proof:yes">if</span><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;
mso-font-kerning:0pt;mso-no-proof:yes">(ar.RestartApp)<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-layout-grid-align:none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;
mso-font-kerning:0pt;mso-no-proof:yes">{<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-layout-grid-align:none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;
color:teal;mso-font-kerning:0pt;mso-no-proof:yes">Console</span><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;
mso-font-kerning:0pt;mso-no-proof:yes">.WriteLine(<span style="color:maroon">"The
App will be restarted..."</span>);<o:p></o:p></span></p>
<p class="MsoNormal" style="mso-layout-grid-align:none;text-autospace:none"><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;mso-hansi-font-family:&quot;Times New Roman&quot;;
mso-font-kerning:0pt;mso-no-proof:yes">System.Diagnostics.<span style="color:teal">Process</span>.Start(System.Windows.Forms.<span style="color:teal">Application</span>.ExecutablePath);<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:9.0pt;font-family:新宋体;
mso-hansi-font-family:&quot;Times New Roman&quot;;mso-font-kerning:0pt;mso-no-proof:yes">}</span><span lang="EN-US" style="font-size:12.0pt;font-family:Arial;mso-bidi-font-family:&quot;Times New Roman&quot;"><o:p></o:p></span></p>
<p class="MsoNormal"><font  face="新宋体" size="3"><span  style="font-size: 12px;"><br />
</span></font></p>
<p>补充点。</p>
<p><br />
</p>
<p style="margin-left: 21pt;"><strong>System.Windows.Forms.Application类 </strong></p>
<p style="margin-left: 21pt;">提供 static 方法和属性以管理应用程序，例如启动和停止应用程序、处理 Windows 消息的方法和获取应用程序信息的属性。 </p>
<p style="margin-left: 21pt;">&#160;</p>
<p style="margin-left: 21pt;"><strong>System.Windows.Forms.Application.ThreadException 事件 </strong></p>
<p style="margin-left: 21pt;">在发生未捕获线程异常时发生。 </p>
<p style="margin-left: 21pt;">&#160;</p>
<p style="margin-left: 21pt;"><strong>System.Windows.Forms.Application.SetUnhandledExceptionMode()方法 </strong></p>
<p style="margin-left: 21pt;">指示应用程序如何响应未处理的异常。 </p>
<ul style="margin-left: 42pt;">
    <li>
    <div>SetUnhandledExceptionMode(UnhandledExceptionMode) </div>
    <p>指示应用程序如何响应未处理的异常。 </p>
    </li>
    <li>
    <div>SetUnhandledExceptionMode(UnhandledExceptionMode, Boolean) </div>
    <p>指示应用程序如何响应未处理的异常，同时可选择应用特定于线程的行为。 </p>
    </li>
</ul>
<p>&#160;</p>
<p style="margin-left: 21pt;"><strong>System.Windows.Forms.UnhandledExceptionMode枚举 </strong></p>
<p style="margin-left: 21pt;">定义 Windows 窗体应用程序应在何处发送未处理的异常。 </p>
<p style="margin-left: 21pt;">public enum UnhandledExceptionMode </p>
<p style="margin-left: 21pt;">{ </p>
<p style="margin-left: 21pt;">Automatic,&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//将所有异常都传送到 ThreadException 处理程序，除非应用程序的配置文件指定了其他位置。 </p>
<p style="margin-left: 21pt;">ThrowException,&#160;&#160;&#160;&#160;//从不将异常传送到 ThreadException 处理程序。忽略应用程序配置文件。 </p>
<p style="margin-left: 21pt;">CatchException&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;//始终将异常传送到 ThreadException 处理程序。忽略应用程序配置文件。 </p>
<p>}&#160;</p>
<p>&#160;</p><img src ="http://www.cnblogs.com/yellowyu/aggbug/1284003.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42956/" target="_blank">[新闻]携程范敏：CEO从接发传真做起</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>winform:竖的tab页</title><link>http://www.cnblogs.com/yellowyu/archive/2008/09/04/1283482.html</link><dc:creator>yellowyu</dc:creator><author>yellowyu</author><pubDate>Wed, 03 Sep 2008 16:34:00 GMT</pubDate><guid>http://www.cnblogs.com/yellowyu/archive/2008/09/04/1283482.html</guid><wfw:comment>http://www.cnblogs.com/yellowyu/comments/1283482.html</wfw:comment><comments>http://www.cnblogs.com/yellowyu/archive/2008/09/04/1283482.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/yellowyu/comments/commentRss/1283482.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yellowyu/services/trackbacks/1283482.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体;">今日，公司一</span>MM coder<span style="font-family: 宋体;">问我&#8220;竖的</span>tab<span style="font-family: 宋体;">页怎么做呀，就像</span>VS<span style="font-family: 宋体;">旁边的那个一样&#8221;</span></p>
<p>&nbsp;</p>
<img alt="" src="http://images.cnblogs.com/cnblogs_com/yellowyu/f1.jpg" />
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">。。。。。。。。。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">原以为是很</span>EASY<span style="font-family: 宋体;">的问题试了一下，原来并不是一两个属性设置可用，还记得以前在</span>MSDN<span style="font-family: 宋体;">上看过一遍有关系到的</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">。。。。。。。。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">找了找，还是找到了，嘿嘿</span></p>
<p><span style="font-family: 宋体;">直接把网址发给他，里面代码是</span>vb.net<span style="font-family: 宋体;">的</span></p>
<p><a href="http://blogs.msdn.com/winformsue/archive/2006/03/14/551564.aspx">http://blogs.msdn.com/winformsue/archive/2006/03/14/551564.aspx</a></p>
<p>&nbsp;</p>
<p>MM<span style="font-family: 宋体;">回了一句，看不懂，不明白是啥意思，要不，你帮我做吧！。。。。。。我又不是做界面的</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">其实挺不爽人家说偶是做界面的，好像偶做的就是很普通的一样，好像写模块的就很强的样子，不爽中，还是答应做了</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体;">切。。。。。偶也写一个&#8220;模块出来&#8221;</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体; color: blue;">namespace</span><span style="font-size: 9pt; font-family: 新宋体;"> TopWindow</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">{</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">class</span> <span style="color: teal;">UpLightTabControl</span> : System.Windows.Forms.<span style="color: teal;">TabControl</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> UpLightTabControl()</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : <span style="color: blue;">base</span>()</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">this</span>.Alignment = <span style="color: teal;">TabAlignment</span>.Left;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">this</span>.DrawMode = <span style="color: teal;">TabDrawMode</span>.OwnerDrawFixed;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">this</span>.SizeMode = <span style="color: teal;">TabSizeMode</span>.FillToRight;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">this</span>.ItemSize = <span style="color: blue;">new</span> <span style="color: teal;">Size</span>(96, 25);</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">protected</span> <span style="color: blue;">override</span> <span style="color: blue;">void</span> OnDrawItem(<span style="color: teal;">DrawItemEventArgs</span> e)</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal;">Graphics</span> g = e.Graphics;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal;">Brush</span> _TextBrush;</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// Get the item from the collection.</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal;">TabPage</span> _TabPage = <span style="color: blue;">this</span>.TabPages[e.Index];</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// Get the real bounds for the tab rectangle.</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal;">Rectangle</span> _TabBounds = <span style="color: blue;">this</span>.GetTabRect(e.Index);</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> ((e.State == <span style="color: teal;">DrawItemState</span>.Selected))</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// Draw a different background color, and don't paint a focus rectangle.</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _TextBrush = <span style="color: blue;">new</span> <span style="color: teal;">SolidBrush</span>(<span style="color: teal;">Color</span>.Red);</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.FillRectangle(<span style="color: teal;">Brushes</span>.Gray, e.Bounds);</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">else</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _TextBrush = <span style="color: blue;">new</span> System.Drawing.<span style="color: teal;">SolidBrush</span>(e.ForeColor);</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.DrawBackground();</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// Use our own font. Because we CAN.</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal;">Font</span> _TabFont = <span style="color: blue;">new</span> <span style="color: teal;">Font</span>(<span style="color: maroon;">"Arial"</span>, 10, <span style="color: teal;">FontStyle</span>.Bold, <span style="color: teal;">GraphicsUnit</span>.Pixel);</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// Draw string. Center the text.</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal;">StringFormat</span> _StringFlags = <span style="color: blue;">new</span> <span style="color: teal;">StringFormat</span>();</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _StringFlags.Alignment = <span style="color: teal;">StringAlignment</span>.Center;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _StringFlags.LineAlignment = <span style="color: teal;">StringAlignment</span>.Center;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; g.DrawString(_TabPage.Text, _TabFont, _TextBrush, _TabBounds, <span style="color: blue;">new</span> <span style="color: teal;">StringFormat</span>(_StringFlags));</span></p>
<p align="left">&nbsp;</p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">base</span>.OnDrawItem(e);</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">}</span></p>
<p>&nbsp;</p>
<p>下面是原作者的话，我想他说得很清楚了。</p>
<p>&nbsp;</p>
<ol>
    <li>On TabControl, set the following properties:</li>
    <ol>
        <li><strong>.Alignment</strong>=Right</li>
        <li><strong>.SizeMode</strong>=Fixed (Must be set to change <strong>ItemSize.Width</strong>, below)</li>
        <li><strong>.DrawMode</strong>=OwnerDrawFixed</li>
    </ol>
    <li>Set the <strong>ItemSize</strong> property to&nbsp;the preferred width and height of your tabs. Since we're owner-drawing, we need the tabs to be a fixed width and height so we have a well-defined area in which to draw the tab labels. <br />
    <br />
    Here's one of the tricky bits, though: Width and height do not flip even though you are now right-aligned. In other words, you have to change the <strong>Width</strong> property to change the height (y axis) of the tabs, and change the <strong>Height</strong> property to change the width (x axis) of the tabs.</li>
    <li>Handle <strong>DrawItem()</strong> and define code to render the text the way you want it. Here's a sampling:</li>
</ol>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>只是，为什么总感觉好像好多人把像我这样做UI界面工作的人，看得很轻呢。。。。。</p>
<p>并且，我一C++的同事就直接说：&#8221;别想我去碰那东西。。。。没前途的。。。。。&#8216;</p>
<p>&nbsp;</p>
<p>而我。。。</p>
<p>继续坚持着。。。。。<br />
</p>
<p>加油。。。。。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p> <br />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p> <br />
</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/yellowyu/aggbug/1283482.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42956/" target="_blank">[新闻]携程范敏：CEO从接发传真做起</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>Winform :判断是否为顶层窗口</title><link>http://www.cnblogs.com/yellowyu/archive/2008/09/03/1282990.html</link><dc:creator>yellowyu</dc:creator><author>yellowyu</author><pubDate>Wed, 03 Sep 2008 07:15:00 GMT</pubDate><guid>http://www.cnblogs.com/yellowyu/archive/2008/09/03/1282990.html</guid><wfw:comment>http://www.cnblogs.com/yellowyu/comments/1282990.html</wfw:comment><comments>http://www.cnblogs.com/yellowyu/archive/2008/09/03/1282990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yellowyu/comments/commentRss/1282990.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yellowyu/services/trackbacks/1282990.html</trackback:ping><description><![CDATA[<p><span style="font-size: 9pt; font-family: 新宋体;">今天遇到一个需求，就像MSN提示信息一样，如果窗口未当前，则需闪烁提醒用户</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">好久没动笔了，写一写记下来吧，嘿嘿</span></p>
<img alt="" src="http://images.cnblogs.com/cnblogs_com/yellowyu/gg2.jpg" />
<p><span style="font-size: 9pt; font-family: 新宋体;">引用：http://www.codeproject.com/KB/dialog/Is_My_Application_on_Top_.aspx</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">以上图是从copeproject copy下来的，从此图可以看出一个流程吧，但是作者用的是一个</span><span style="font-size: 9pt; font-family: 新宋体;">GetTopWindow</span><span style="font-size: 9pt; font-family: 新宋体;">的函数，感觉并不正确，尽管做出来的效果是跟讲的一样，但是。。。。有兴趣的朋友可以看一下，以下是他判断是否当前窗口为最顶层的函数，VB。NET代码</span></p>
<p>&nbsp;</p>
<pre><span style="font-size: 9pt; font-family: 新宋体;">Private</span><span style="font-size: 9pt; font-family: 新宋体;"> Function IsOnTop(ByVal hwnd As Integer) As Boolean</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; Dim i As Integer = GetTopWindow(0)&nbsp;&nbsp;&nbsp; 'Initialize</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; Dim x As Integer = 1</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; Dim s As String</span></pre>
<pre>&nbsp;</pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; ' Enumeration</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; Do&nbsp;&nbsp;&nbsp; </span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = GetNextWindow(i, 2)&nbsp;' Find next window in Z-order</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;If i = hwnd Then</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Do</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If i = 0 Then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' Never find any window match the input handle</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return False</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</span></pre>
<pre>&nbsp;</pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If IsWindowVisible(i) = True Then</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = Space(256)</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If GetWindowText(i, s, 255) &lt;&gt; 0 Then</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' Very important to prevent confusing</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' of BalloonTips and ContextMenuStrips</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x += 1</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; Loop</span></pre>
<pre>&nbsp;</pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; ' x is Z-order number</span></pre>
<pre>&nbsp;</pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; If x = 1 Then</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return True</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; Else</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return False</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp; End If</span></pre>
<pre><span style="font-size: 9pt; font-family: 新宋体;">End</span><span style="font-size: 9pt; font-family: 新宋体;"> Function</span></pre>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">但通过console打印出自已当前处于最顶层窗口句柄时，也打印出</span><span style="font-size: 9pt; font-family: 新宋体;">GetTopWindow</span><span style="font-size: 9pt; font-family: 新宋体;">获得的句柄，再用SPY++查看，并不一致，那里出错呢，对这函数的理解出错了么？</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">幸好忽闪过一个函数：</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">[DllImport("user32.dll")]</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;private static extern IntPtr GetForegroundWindow();</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">再与当前自已处于顶层的窗口句柄比较了一下，是一致的，就直接采用了</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">查了一下MSDN</span></p>
<p style="margin-bottom: 3.75pt;" align="left"><span style="font-size: 9pt; font-family: 新宋体;">GetForegroundWindow Function</span></p>
<div align="center"><span style="font-size: 9pt; font-family: 新宋体;">  <hr align="center" size="1" width="100%" />
</span></div>
<p style="margin: 6pt 0cm 12pt; text-align: left; line-height: 18pt;" align="left"><span style="font-size: 9pt; font-family: 新宋体;">The GetForegroundWindow function returns a handle to the foreground window (the window with which the user is currently working). The system assigns a slightly higher priority to the thread that creates the foreground window than it does to other threads. </span></p>
<p style="margin: 6pt 0cm 12pt; text-align: left; line-height: 18pt;" align="left">&nbsp;</p>
<p style="margin-bottom: 3.75pt;" align="left"><span style="font-size: 9pt; font-family: 新宋体;">GetTopWindow Function</span></p>
<div align="center"><span style="font-size: 9pt; font-family: 新宋体;">  <hr align="center" size="1" width="100%" />
</span></div>
<p style="margin: 6pt 0cm 12pt; text-align: left; line-height: 18pt;" align="left"><span style="font-size: 9pt; font-family: 新宋体;">The GetTopWindow function examines the Z order of the child windows associated with the specified parent window and retrieves a handle to the child window at the top of the Z order. </span></p>
<p style="margin: 6pt 0cm 12pt; text-align: left; line-height: 18pt;" align="left"><span style="font-size: 9pt; font-family: 新宋体;">自已英语很菜，但这gettopwindow的意思是获取子窗口的顶层窗口的句柄,但网上别人说：传0进去是获得WINDOWS当前顶层窗口？</span></p>
<p style="margin: 6pt 0cm 12pt; text-align: left; line-height: 18pt;" align="left">&nbsp;</p>
<p style="margin: 6pt 0cm 12pt; text-align: left; line-height: 18pt;" align="left"><span style="font-size: 9pt; font-family: 新宋体;">而闪烁则是通过flashwindow函数，这大多C++ coder都清楚的，嘿嘿，就能跟MSN一样，当用户并未操作当前消息窗口时能提示</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">顺便写写这个例中过程中曾用过的几个API</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">[<span style="color: teal;">DllImport</span>(<span style="color: maroon;">"user32"</span>, EntryPoint = <span style="color: maroon;">"GetTopWindow"</span>, CharSet = <span style="color: teal;">CharSet</span>.Ansi, SetLastError = <span style="color: blue;">true</span>, ExactSpelling = <span style="color: blue;">true</span>)]</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体; color: blue;">public</span><span style="font-size: 9pt; font-family: 新宋体;"> <span style="color: blue;">static</span> <span style="color: blue;">extern</span> <span style="color: blue;">int</span> GetTopWindow(<span style="color: blue;">int</span> hwnd);</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">[<span style="color: teal;">DllImport</span>(<span style="color: maroon;">"user32"</span>, EntryPoint = <span style="color: maroon;">"GetWindow"</span>, CharSet = <span style="color: teal;">CharSet</span>.Ansi, SetLastError = <span style="color: blue;">true</span>, ExactSpelling = <span style="color: blue;">true</span>)]</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体; color: blue;">public</span><span style="font-size: 9pt; font-family: 新宋体;"> <span style="color: blue;">static</span> <span style="color: blue;">extern</span> <span style="color: blue;">int</span> GetNextWindow(<span style="color: blue;">int</span> hwnd, <span style="color: blue;">int</span> wFlag);</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">[<span style="color: teal;">DllImport</span>(<span style="color: maroon;">"user32"</span>, EntryPoint = <span style="color: maroon;">"IsWindowVisible"</span>, CharSet = <span style="color: teal;">CharSet</span>.Ansi, SetLastError = <span style="color: blue;">true</span>, ExactSpelling = <span style="color: blue;">true</span>)]</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体; color: blue;">public</span><span style="font-size: 9pt; font-family: 新宋体;"> <span style="color: blue;">static</span> <span style="color: blue;">extern</span> <span style="color: blue;">bool</span> IsWindowVisible(<span style="color: blue;">int</span> hwnd);</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">[<span style="color: teal;">DllImport</span>(<span style="color: maroon;">"user32"</span>, EntryPoint = <span style="color: maroon;">"GetWindowTextA"</span>, CharSet = <span style="color: teal;">CharSet</span>.Ansi, SetLastError = <span style="color: blue;">true</span>, ExactSpelling = <span style="color: blue;">true</span>)]</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体; color: blue;">public</span><span style="font-size: 9pt; font-family: 新宋体;"> <span style="color: blue;">static</span> <span style="color: blue;">extern</span> <span style="color: blue;">int</span> GetWindowText(<span style="color: blue;">int</span> hwnd, <span style="color: blue;">string</span> lpString, <span style="color: blue;">int</span> cch);</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">[<span style="color: teal;">DllImport</span>(<span style="color: maroon;">"user32.dll"</span>)]</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体; color: blue;">private</span><span style="font-size: 9pt; font-family: 新宋体;"> <span style="color: blue;">static</span> <span style="color: blue;">extern</span> <span style="color: teal;">IntPtr</span> GetForegroundWindow();</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">也记一下一篇文章，很好的介结了WINDOWS窗口机制，改天好好验证一下每个函数</span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;"><a href="http://blog.csdn.net/chenshaoying/archive/2008/04/24/2324304.aspx">http://blog.csdn.net/chenshaoying/archive/2008/04/24/2324304.aspx</a></span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">其实上面主要涉及到的，还是一个Z轴的问题，老的WIN32 coder是很熟啦，通过Z轴，能做出一些很漂亮的效果哦，最明显的就是一个OUTLOOK的控件，codeproject上有好几个介绍的，一个是作者自已写的，好长好长的代码呀，另一个，则是作者通过设置Z轴达到的效果，很好很强大</span></p>
<p>&nbsp;</p>
<img alt="" src="http://images.cnblogs.com/cnblogs_com/yellowyu/gg1.jpg" />
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">以下是其设置Z轴的一段代码</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">void</span> ButtonClick(<span style="color: blue;">object</span> sender, System.<span style="color: teal;">EventArgs</span> e)</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// Get the clicked button...</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal;">Button</span> clickedButton = (<span style="color: teal;">Button</span>)sender;&nbsp;&nbsp;&nbsp; </span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// ... and it's tabindex</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">int</span> clickedButtonTabIndex = clickedButton.TabIndex;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// Send each button to top or bottom as appropriate</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">foreach</span> (<span style="color: teal;">Control</span> ctl <span style="color: blue;">in</span> panel1.Controls)</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (ctl <span style="color: blue;">is</span> <span style="color: teal;">Button</span>)</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal;">Button</span> btn = (<span style="color: teal;">Button</span>)ctl;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (btn.TabIndex &gt; clickedButtonTabIndex)</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (btn.Dock != <span style="color: teal;">DockStyle</span>.Bottom)</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btn.Dock = <span style="color: teal;">DockStyle</span>.Bottom;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// This is vital to preserve the correct order</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btn.BringToFront();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">else</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (btn.Dock != <span style="color: teal;">DockStyle</span>.Top)</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btn.Dock = <span style="color: teal;">DockStyle</span>.Top;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// This is vital to preserve the correct order</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btn.BringToFront();</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: green;">// Determine which button was clicked.</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">switch</span> (clickedButton.Text)</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">case</span> <span style="color: maroon;">"Cars"</span>:</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CreateCarList();</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">break</span>;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">case</span> <span style="color: maroon;">"Outlook Shortcuts"</span>:</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CreateOutlookList();</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">break</span>;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">case</span> <span style="color: maroon;">"Zip Files"</span>:</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CreateZipList();</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">break</span>;</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listView1.BringToFront();&nbsp;<span style="color: green;">// Without this, the buttons will hide the items.</span></span></p>
<p align="left"><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 9pt; font-family: 新宋体;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">很简单地设置一个Z轴就达到OUTLook效果了，给自已标志一下，加油</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 9pt; font-family: 新宋体;">别告诉我那种VS效果是怎么做出来的哦，那要说的话可以写好长好长的一篇文章了，CODEPROJECT上就有一个开源的控件做，嘿嘿，很佩服作者的精神，坚持下去。。。。。。。。。</span></p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/yellowyu/aggbug/1282990.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42955/" target="_blank">[新闻]2008年10月13日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>补充画圆画线</title><link>http://www.cnblogs.com/yellowyu/archive/2008/07/06/1236776.html</link><dc:creator>yellowyu</dc:creator><author>yellowyu</author><pubDate>Sat, 05 Jul 2008 16:18:00 GMT</pubDate><guid>http://www.cnblogs.com/yellowyu/archive/2008/07/06/1236776.html</guid><wfw:comment>http://www.cnblogs.com/yellowyu/comments/1236776.html</wfw:comment><comments>http://www.cnblogs.com/yellowyu/archive/2008/07/06/1236776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/yellowyu/comments/commentRss/1236776.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/yellowyu/services/trackbacks/1236776.html</trackback:ping><description><![CDATA[这是一个很简单的画图工具的例子<br />
直接上图吧:<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/yellowyu/paint.JPG" /><br />
这里定义了线,矩形,椭圆等五种类型的外观,还有PEN,刷子,很简单的一个画图工具,希望能提起大家的兴趣<br />
&nbsp; private void Form1_Load(object sender,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.EventArgs e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the full size of the form<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取得窗口的完整大小<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fullSize = SystemInformation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .PrimaryMonitorMaximizedWindowSize;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //其实也即时初始化一副BMP图<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a bitmap using full size<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bitmap = new Bitmap(fullSize.Width,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fullSize.Height);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a Graphics object from Bitmap<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //并由于创建一份GRAPHICS<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curGraphics = Graphics.FromImage(bitmap);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Set background color as form's color<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curGraphics.Clear(this.BackColor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a new pen and brush as <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // default pen and brush<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curPen = new Pen(Color.Black);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curBrush = new SolidBrush(Color.Black);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
在DOWN的时候,即取得开始的位置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void Form1_MouseDown(object sender,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.Windows.Forms.MouseEventArgs e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Store the starting point of <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the rectangle and set the drag mode<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // to true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; curX = e.X;<br />