https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5fedabbf0aefb015841b23...
commit 5fedabbf0aefb015841b2329a8d64d099c3a6c7b Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Thu Aug 16 22:01:52 2018 +0200 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Fri Aug 17 17:12:23 2018 +0200
[ROSTESTS] Add an interactive test for the user32.dll API SoftModalMessageBox(). --- modules/rostests/win32/user32/CMakeLists.txt | 1 + .../win32/user32/softmodalmsgbox/CMakeLists.txt | 5 + .../win32/user32/softmodalmsgbox/resource.h | 2 + .../win32/user32/softmodalmsgbox/softmodalmsgbox.c | 122 +++++++++++++++++++++ .../user32/softmodalmsgbox/softmodalmsgbox.rc | 11 ++ 5 files changed, 141 insertions(+)
diff --git a/modules/rostests/win32/user32/CMakeLists.txt b/modules/rostests/win32/user32/CMakeLists.txt index d1d83974bd..205afbc403 100644 --- a/modules/rostests/win32/user32/CMakeLists.txt +++ b/modules/rostests/win32/user32/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory(biditext) add_subdirectory(paintdesktop) +add_subdirectory(softmodalmsgbox) add_subdirectory(sysicon) add_subdirectory(winstation) diff --git a/modules/rostests/win32/user32/softmodalmsgbox/CMakeLists.txt b/modules/rostests/win32/user32/softmodalmsgbox/CMakeLists.txt new file mode 100644 index 0000000000..310a01e518 --- /dev/null +++ b/modules/rostests/win32/user32/softmodalmsgbox/CMakeLists.txt @@ -0,0 +1,5 @@ + +add_executable(softmodalmsgbox softmodalmsgbox.c softmodalmsgbox.rc) +set_module_type(softmodalmsgbox win32cui UNICODE) +add_importlibs(softmodalmsgbox user32 msvcrt kernel32) +add_rostests_file(TARGET softmodalmsgbox SUBDIR suppl) diff --git a/modules/rostests/win32/user32/softmodalmsgbox/resource.h b/modules/rostests/win32/user32/softmodalmsgbox/resource.h new file mode 100644 index 0000000000..6e6ee36e09 --- /dev/null +++ b/modules/rostests/win32/user32/softmodalmsgbox/resource.h @@ -0,0 +1,2 @@ +#define IDS_RES_CAPTION 101 +#define IDS_RES_MESSAGE 102 diff --git a/modules/rostests/win32/user32/softmodalmsgbox/softmodalmsgbox.c b/modules/rostests/win32/user32/softmodalmsgbox/softmodalmsgbox.c new file mode 100644 index 0000000000..40913e6142 --- /dev/null +++ b/modules/rostests/win32/user32/softmodalmsgbox/softmodalmsgbox.c @@ -0,0 +1,122 @@ +/* + * PROJECT: ReactOS Tests + * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) + * PURPOSE: Tests the undocumented user32.dll API SoftModalMessageBox(). + * COPYRIGHT: Copyright 2018 Hermes Belusca-Maito + */ + +#include <stdio.h> +#include <stdlib.h> +#include <conio.h> + +#include <windef.h> +#include <winbase.h> +#include <winuser.h> + +#include "resource.h" + +/* Adjust according to your platform! -- ReactOS is currently compatible with Windows Server 2003 */ +#undef _WIN32_WINNT +#define _WIN32_WINNT _WIN32_WINNT_WS03 // _WIN32_WINNT_WIN2K // _WIN32_WINNT_WS03 // _WIN32_WINNT_WIN7 + +typedef struct _MSGBOXDATA +{ + MSGBOXPARAMSW mbp; // Size: 0x28 (x86), 0x50 (x64) + HWND hwndOwner; // Will be converted to PWND +#if defined(_WIN32) && (_WIN32_WINNT >= _WIN32_WINNT_WIN7) /* (NTDDI_VERSION >= NTDDI_WIN7) */ + DWORD dwPadding; +#endif + WORD wLanguageId; + INT* pidButton; // Array of button IDs + LPCWSTR* ppszButtonText; // Array of button text strings + DWORD dwButtons; // Number of buttons + UINT uDefButton; // Default button ID + UINT uCancelId; // Button ID corresponding to Cancel action +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) /* (NTDDI_VERSION >= NTDDI_WINXP) */ + DWORD dwTimeout; // Message box timeout +#endif + DWORD dwReserved0; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7) /* (NTDDI_VERSION >= NTDDI_WIN7) */ + DWORD dwReserved[4]; +#endif +} MSGBOXDATA, *PMSGBOXDATA, *LPMSGBOXDATA; + + +#if defined(_WIN64) + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7) /* (NTDDI_VERSION >= NTDDI_WIN7) */ +C_ASSERT(sizeof(MSGBOXDATA) == 0x98); +#elif (_WIN32_WINNT <= _WIN32_WINNT_WS03) /* (NTDDI_VERSION == NTDDI_WS03) */ +C_ASSERT(sizeof(MSGBOXDATA) == 0x88); +#endif + +#else + +#if (_WIN32_WINNT <= _WIN32_WINNT_WIN2K) /* (NTDDI_VERSION <= NTDDI_WIN2KSP4) */ +C_ASSERT(sizeof(MSGBOXDATA) == 0x48); +#elif (_WIN32_WINNT >= _WIN32_WINNT_WIN7) /* (NTDDI_VERSION >= NTDDI_WIN7) */ +C_ASSERT(sizeof(MSGBOXDATA) == 0x60); +#else // (_WIN32_WINNT == _WIN32_WINNT_WINXP || _WIN32_WINNT == _WIN32_WINNT_WS03) /* (NTDDI_VERSION == NTDDI_WS03) */ +C_ASSERT(sizeof(MSGBOXDATA) == 0x4C); +#endif + +#endif + + +typedef int (WINAPI *SOFTMODALMESSAGEBOX)(LPMSGBOXDATA lpMsgBoxData); +// int WINAPI SoftModalMessageBox(IN LPMSGBOXDATA lpMsgBoxData); +SOFTMODALMESSAGEBOX SoftModalMessageBox = NULL; + +// +// Example taken from http://rsdn.org/forum/winapi/3273168.1 +// See also http://www.vbforums.com/showthread.php?840593-Message-Box-with-Four-Buttons +// +int wmain(int argc, WCHAR* argv[]) +{ + MSGBOXDATA data; + int res = 0; + + INT pids[] = + { + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 /*, 2*/ + }; + /* NOTE: Buttons do NOT support resource IDs specifications! */ + LPCWSTR ppText[] = + { + L"Button 1", L"Button 2", L"Button 3", L"Button 4", L"Button 5", L"Button 6", L"Button 7", L"Button 8", L"Button 9", L"Button 10", L"Button 11", L"Button 12", L"Button 13" + }; + + ZeroMemory(&data, sizeof(data)); + data.mbp.cbSize = sizeof(data.mbp); + data.mbp.hwndOwner = FindWindowW(L"Shell_TrayWnd", NULL); + data.mbp.hInstance = GetModuleHandleW(NULL); + data.mbp.lpszText = L"This is a message box made using the undocumented SoftModalMessageBox() API."; + data.mbp.lpszCaption = MAKEINTRESOURCEW(IDS_RES_CAPTION); // L"SoftModalMessageBox"; + data.mbp.lpfnMsgBoxCallback = NULL; // SoftModalMessageBoxCallback; + data.mbp.dwStyle = MB_ICONINFORMATION | MB_RETRYCANCEL; + + data.wLanguageId = 0; + data.pidButton = pids; + data.ppszButtonText = ppText; + data.dwButtons = _countof(pids); + data.uDefButton = 2; + data.uCancelId = 0; +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) /* (NTDDI_VERSION >= NTDDI_WINXP) */ + data.dwTimeout = 3 * 1000; +#endif + + SoftModalMessageBox = (SOFTMODALMESSAGEBOX)GetProcAddress(GetModuleHandleW(L"user32.dll"), "SoftModalMessageBox"); + if (!SoftModalMessageBox) + { + printf("SoftModalMessageBoxW not found in user32.dll\n"); + } + else + { + res = SoftModalMessageBox(&data); + printf("Returned value = %i\n\n", res); + } + + printf("Press any key to quit...\n"); + _getch(); + return 0; +} diff --git a/modules/rostests/win32/user32/softmodalmsgbox/softmodalmsgbox.rc b/modules/rostests/win32/user32/softmodalmsgbox/softmodalmsgbox.rc new file mode 100644 index 0000000000..e04c4eaee9 --- /dev/null +++ b/modules/rostests/win32/user32/softmodalmsgbox/softmodalmsgbox.rc @@ -0,0 +1,11 @@ + +#include <windef.h> +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +STRINGTABLE +BEGIN + IDS_RES_CAPTION "Resource Caption" + IDS_RES_MESSAGE "Resource Message" +END