Reverse ra thì dài dòng, nên em nói nôm na vầy thôi.
Wscript.Shell COM object được implement trong System32 (hay SysWOW64) wshom.ocx.
Method Popup được MS coder code nôm na như sau:
Function prototype:
virtual long __stdcall CWshShell:

opup(unsigned short *, struct tagVARIANT *, struct tagVARIANT *, struct tagVARIANT *, int *)
1. CreateThread với ThreadProc là 1 hàm ngắn, chỉ gọi MessageBoxW
2.Thực hiện Wait với timeout chỉ định = các hàm API sau: MsgWaitForMultipleObjects và parse message loop với PeekMessage, TranslateMessage, DispatchMessage
3. Trong trường hợp user click OK, Wait proc return, call GetExitCodeThread và CloseHandle cho thread vừa tạo.
4. User không click OK, msgbox vẫn còn display, gọi hàm EnumThreadWindows với hThread là handle của thread vừa tạo, trong EnumProc gọi PostMessage cho hWnd của thread đó, tức hWnd của MessageBoxW,
với uMsg = WM_QUIT, wParam = 0xABCDEFBB, lParam = 0
5. Xong, window của MessageBoxW đã mất, gọi WaitForSingleObject(hThread, INFINITE) cho ThreadProc ở trên thoát, thread thoát, gọi CloseHandle(hThread)
Xong method Popup.
Do phải sinh thread cho MessageBox, nên time schedule cho thread không còn chính xác khi user thực hiện các tác vụ khác, đẩy thread đó xuống không còn ưu tiên chiếm CPU time.
Nên các bạn thấy nó không đúng thời gian timeout là vậy.