前天突然在windbg上uf USER32!MessageBoxW,发现了MessageBoxTimeoutW这个API,看着名字大家马上就知道什么回事了。
为什么对这个有如此敏感呢,是因为有一次面试经历,问了这个问题,怎么实现具有超时功能的MessageBox,我那时的回答是:在一个线程中弹对话框,然后等待此线程(现在想想很汗),MessageBoxTimeoutW的原型需要反汇编,windows.h头文件并没有定义。
#include "stdafx.h" #include <Windows.h> #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { /* int istart = ::GetTickCount(); ::MessageBox(NULL, _T("1"), _T("2"), MB_OK); int iend = ::GetTickCount(); printf("iend - istart = %d/n", iend - istart);*/ HMODULE hMod = ::LoadLibrary(_T("user32.dll")); if (hMod) { typedef int (WINAPI * PMessageBoxExW)( __in_opt HWND hWnd, __in_opt LPCWSTR lpText, __in_opt LPCWSTR lpCaption, __in UINT uType, __in WORD wLanguageId, __in UINT uTimeout); PMessageBoxExW pFun = (PMessageBoxExW)::GetProcAddress(hMod, "MessageBoxTimeoutW"); int istart = ::GetTickCount(); int dwResult = (*pFun)(NULL, _T("1"), _T("2"), MB_OKCANCEL, 0, 4000); int iend = ::GetTickCount(); printf("iend - istart = %d/n", iend - istart); printf("dwResult:%d", dwResult); ::FreeLibrary(hMod); hMod = NULL; } return 0; }