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

上一篇我们谈到了无声无息地“抛锚”(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_ALL0x00000003

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

FLASHW_CAPTION0x00000001

闪烁窗口标题。

FLASHW_STOP0

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

FLASHW_TIMER0x00000004

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

FLASHW_TIMERNOFG0x0000000C

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

FLASHW_TRAY0x00000002

闪烁窗口的任务栏按钮。

3、把错误“弹出来”

既有美妙的风景,也会有称不上景只有风的地方。

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

相关文章:

你感兴趣的文章:

标签云: