【WIN32之旅】WINDOWS错误处理与参考(二)

转载请说明原出处,谢谢~ http://blog.csdn.net/seven_1992/article/details/44514731


    上一篇我们谈到了无声无息地“抛锚”(Crash Silently), 并列出了一些在错误处理(Error Handling)中会可能被使用到的函数,那么本篇我们就来介绍几个实用的API函数(Untility Function),让错误不再“无语”(Don't Be Shy)吧。


二、让“错误”会说话

    如何让“错误”会说话呢? 这一篇我们要继续讲述的“错误处理与参考”话题是 --- 如何让“错误会说话(Let It Speek),接下来我们要说到的就是几个“会说话”的函数:


1、让错误对你“咆哮”

    Beep()与MessageBeep()是两个与蜂鸣有关的API函数,它们略有不同,Beep()就像一个寻呼机(BP机),简而单调(Simple Guy),MessageBeep()就像一台手机(Cellphone),多彩华丽(Colorful Guy),下面列出在MSDN上关于这两个函数的原型以及解释:


BOOL WINAPI Beep(
  _In_  DWORD dwFreq,     // 蜂鸣声的频率
  _In_  DWORD dwDuration  // 蜂鸣声持续的时间
);


    该函数的两个输入参数均为DWORD(双字型),其是标准的WINAPI函数(也就是说调用约定为__stdcall),dwFreq参数是发声的频率,单位是赫兹(Hz),取值范围是37Hz~32767Hz(0x25~0x7FFF); dwDuration参数是发声持续的时间,单位是毫秒(Milliseconds); 函数的返回值是BOOL(布尔型),如果执行成功则返回的是非零值,如果失败则返回零值,具体错误信息请使用GetLastError()函数获取。


BOOL WINAPI MessageBeep(
  _In_  UINT uType  // 消息声的类型
);


   该函数的输入参数uType为UINT(无符号整形),表示要发出的消息提示声的类型,的取值是一些系统预定义的值(Default Value),可取类型值具体如下:

   0xFFFFFFFF                                   // 一个简单的蜂鸣声(如果声卡无效,则从蜂鸣器发声)  

    MB_OK                                         // Windows系统的默认提示音

    MB_ICONQUESTION                             // Windows系统的问题提示音

    MB_ICONINFORMATION、MB_ICONASTERISK      // Windows系统的信息提示音

    MB_ICONWARNING、MB_ICONEXCLAMATION       // Windows系统的警告提示音

    MB_ICONERROR、MB_ICONHAND、MB_ICONSTOP   // Windows系统的错误提示音


2、让错误对你亮“红灯”
    FlashWindow()FlashWindowEx()FatalAppExit()是三个能让错误亮“红灯”的API函数,从它们的名字我们就能直观地知道它们的用途,下面就列出MSDN上关于这三个函数的原型和解释:

BOOL WINAPI FlashWindow(
  _In_  HWND hWnd,     // 要闪烁窗口的句柄
  _In_  BOOL bInvert   // 窗口闪烁后是否要恢复原来的状态
);
    根据MSDN的解释,该函数的作用是使窗口闪烁一次,hWnd参数是要闪烁窗口的句柄(Windows Handle),而bInvert参数则是指窗口闪烁结束后的窗口状态(Windows State),当为(True)时,窗口闪烁一次后将会变为“高亮状态”(Highlighted State);而当为(False)时,窗口闪烁一次后将恢复原样(Original State)。

    前面我们了解了FlashWindow()函数,可是问题是这个函数只能闪烁一次(Only One Time),如果我们想让一个窗口连续闪烁多次(More Times),甚至闪烁无限多次直到用户激活该窗口(Activates The Window),那该怎么办呢? 一种方式是我们可以设置一个定时器(Timer),当满足一定的条件后再销毁定时器(Destroy Timer),从而实现窗口连续地闪烁。但如果过我们不使用定时器了呢,难道就没有办法使窗口多次闪烁了吗。答案并非如此,微软已经为我们考虑到了这一点,当我们需要更为复杂的窗口闪动效果(Window Effect)的时候,还可以使用它的扩展函数(Extention Function)来实现(在WINDOWS系统API函数中,有挺多函数都有其类似的扩展函数,这些函数通常都使用Ex后缀命名),这就是接下来要说到的FlashWindowEx()函数。

BOOL WINAPI FlashWindowEx(
  _In_  PFLASHWINFO pfwi  // 存储窗口闪烁信息的结构体指针
);

PFLASHWINTO 是一个存储窗口闪烁信息的结构体(Structure),关于该结构如下所示:
typedef struct {
  UINT  cbSize;      // 该结构体的大小(cb即表示以字节为单位)
  HWND  hwnd;        // 要闪烁窗口的句柄(该窗口可以是已打开或是处于最小化状态)
  DWORD dwFlags;     // 标志窗口的闪烁效果(可以是一个或多个的组合)
  UINT  uCount;      // 窗口闪烁的次数
  DWORD dwTimeout;   // 窗口闪烁的速率(单位为毫秒)
} FLASHWINFO, *PFLASHWINFO;

关于上面所提到的dwFlags参数的可选标志如下:
含义
FLASHW_ALL
0x00000003

同时闪烁窗口标题和任务栏按钮(这相当于设置了 FLASHW_CAPTION | FLASHW_TRAY flags)。

FLASHW_CAPTION
0x00000001

闪烁窗口标题。

FLASHW_STOP
0

停止闪烁窗口(系统存储了该窗口的原始状态)。

FLASHW_TIMER
0x00000004

不断地闪烁窗口,直到 FLASHW_STOP 标志被设置。

FLASHW_TIMERNOFG
0x0000000C

不断闪烁窗口,直到窗口被激活成为顶层窗口。

FLASHW_TRAY
0x00000002

闪烁窗口的任务栏按钮。


3、把错误“弹出来”
    上面我们已经知道了如何让错误亮红灯”,接下来要介绍的就是在WINDOWS中的另一个相关函数(Relevent Function),这个函数就是能让错误弹出来”(Error Pop-up)的FatalAppExit()函数,该函数的作用是弹出一个消息提示框(Message Box),当点击关闭后同时退出应用程序(Exit Application),下面列出MSDN上关于该函数的原型和解释:

void WINAPI FatalAppExit(
  _In_  UINT uAction,          // 该参数必须为零
  _In_  LPCTSTR lpMessageText  // 以NULL结尾的消息字符串指针
);

MSDN上对该函数做了附加说明:一个应用程序只有当它不能够以其它任何方式终止时才调用该函数(因为该函数会导致程序终止退出)。

 

上一篇,《WINDOWS错误处理与参考(一)》...
下一篇,我将继续补充《WINDOWS错误处理与参考(三)》...

欢迎评论和转载,转载请注明文章出处,我对此表示最真诚的敬意!

你可能感兴趣的:(WINDOWS)