ReactOS  0.4.15-dev-985-gd905dd5
msgbox.c
Go to the documentation of this file.
1 /*
2  * SHLWAPI message box functions
3  *
4  * Copyright 2004 Jon Griffiths
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include "config.h"
22 #include "wine/port.h"
23 
24 #include <stdarg.h>
25 #include <string.h>
26 
27 #include "windef.h"
28 #include "winbase.h"
29 #include "winuser.h"
30 #include "winreg.h"
31 #include "shlwapi.h"
32 #include "wine/unicode.h"
33 #include "wine/debug.h"
34 #include "resource.h"
35 
36 
38 
39 extern HINSTANCE shlwapi_hInstance; /* in shlwapi_main.c */
40 
41 static const WCHAR szDontShowKey[] = { 'S','o','f','t','w','a','r','e','\\',
42  'M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\',
43  'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
44  'E','x','p','l','o','r','e','r','\\','D','o','n','t','S','h','o','w',
45  'M','e','T','h','i','s','D','i','a','l','o','g','A','g','a','i','n','\0'
46 };
47 
50 
51 /* Data held by each general message boxes */
52 typedef struct tagDLGDATAEX
53 {
54  DLGPROC dlgProc; /* User supplied DlgProc */
55  LPARAM lParam; /* User supplied LPARAM for dlgProc */
56  LPCWSTR lpszId; /* Name of reg key holding whether to skip */
57 } DLGDATAEX;
58 
59 /* Dialogue procedure for general message boxes */
61 {
63 
64  TRACE("(%p,%u,%ld,%ld) data %p\n", hDlg, uMsg, wParam, lParam, d);
65 
66  switch (uMsg)
67  {
68  case WM_INITDIALOG:
69  {
70  /* FIXME: Not sure where native stores its lParam */
72  d = (DLGDATAEX *)lParam;
73  TRACE("WM_INITDIALOG: %p, %s,%p,%p\n", hDlg, debugstr_w(d->lpszId),
74  d->dlgProc, (void*)d->lParam);
75  if (d->dlgProc)
76  return d->dlgProc(hDlg, uMsg, wParam, d->lParam);
77  return TRUE;
78  }
79 
80  case WM_COMMAND:
81  switch (LOWORD(wParam))
82  {
83  case IDYES:
85  /* Fall through ... */
86  case IDNO:
87  if (LOWORD(wParam) == IDNO)
89  /* Fall through ... */
90  case IDOK:
91  case IDCANCEL:
92 
93  TRACE("WM_COMMAND: id=%s data=%p\n",
94  LOWORD(wParam) == IDOK ? "IDOK" : "IDCANCEL", d);
95 
97  {
98  DWORD dwZero = 0;
99 
100  /* The user clicked 'don't show again', so set the key */
101  SHRegSetUSValueW(szDontShowKey, d->lpszId, REG_DWORD, &dwZero,
102  sizeof(dwZero), SHREGSET_DEFAULT);
103  }
104  if (!d->dlgProc || !d->dlgProc(hDlg, uMsg, wParam, lParam))
105  EndDialog(hDlg, wParam);
106  return TRUE;
107  }
108  break;
109 
110  default:
111  break;
112  }
113 
114  if (d && d->dlgProc)
115  return d->dlgProc(hDlg, uMsg, wParam, lParam);
116  return FALSE;
117 }
118 
119 /*************************************************************************
120  * @ [SHLWAPI.291]
121  *
122  * Pop up a 'Don't show this message again' dialogue box.
123  *
124  * PARAMS
125  * hWnd [I] Window to be the dialogues' parent
126  * hInst [I] Instance of the module holding the dialogue resource
127  * lpszName [I] Resource Id of the dialogue resource
128  * dlgProc [I] Dialog procedure, or NULL for default handling
129  * lParam [I] LPARAM to pass to dlgProc
130  * iRet [I] Value to return if dialogue is not shown
131  * lpszId [I] Name of registry subkey which determines whether to show the dialog
132  *
133  * RETURNS
134  * Success: The value returned from the dialogue procedure.
135  * Failure: iRet, if the dialogue resource could not be loaded or the dialogue
136  * should not be shown.
137  *
138  * NOTES
139  * Both lpszName and lpszId must be less than MAX_PATH in length.
140  */
142  DLGPROC dlgProc, LPARAM lParam, INT_PTR iRet,
143  LPCSTR lpszId)
144 {
145  WCHAR szNameBuff[MAX_PATH], szIdBuff[MAX_PATH];
146  LPCWSTR szName = szNameBuff;
147 
148  if (IS_INTRESOURCE(lpszName))
149  szName = (LPCWSTR)lpszName; /* Resource Id or NULL */
150  else
151  MultiByteToWideChar(CP_ACP, 0, lpszName, -1, szNameBuff, MAX_PATH);
152 
153  MultiByteToWideChar(CP_ACP, 0, lpszId, -1, szIdBuff, MAX_PATH);
154 
155  return SHMessageBoxCheckExW(hWnd, hInst, szName, dlgProc, lParam, iRet, szIdBuff);
156 }
157 
158 /*************************************************************************
159  * @ [SHLWAPI.292]
160  *
161  * Unicode version of SHMessageBoxCheckExW.
162  */
164  DLGPROC dlgProc, LPARAM lParam, INT_PTR iRet, LPCWSTR lpszId)
165 {
166  DLGDATAEX d;
167 
169  return iRet;
170 
171  d.dlgProc = dlgProc;
172  d.lParam = lParam;
173  d.lpszId = lpszId;
174  return DialogBoxParamW(hInst, lpszName, hWnd, SHDlgProcEx, (LPARAM)&d);
175 }
176 
177 /* Data held by each shlwapi message box */
178 typedef struct tagDLGDATA
179 {
180  LPCWSTR lpszTitle; /* User supplied message title */
181  LPCWSTR lpszText; /* User supplied message text */
182  DWORD dwType; /* Message box type */
183 } DLGDATA;
184 
185 /* Dialogue procedure for shlwapi message boxes */
187 {
188  TRACE("(%p,%u,%ld,%ld)\n", hDlg, uMsg, wParam, lParam);
189 
190  switch (uMsg)
191  {
192  case WM_INITDIALOG:
193  {
194  DLGDATA *d = (DLGDATA *)lParam;
195  TRACE("WM_INITDIALOG: %p, %s,%s,%d\n", hDlg, debugstr_w(d->lpszTitle),
196  debugstr_w(d->lpszText), d->dwType);
197 
198  SetWindowTextW(hDlg, d->lpszTitle);
199  SetWindowTextW(GetDlgItem(hDlg, IDS_ERR_USER_MSG), d->lpszText);
200 
201  /* Set buttons according to dwType */
202  switch (d->dwType)
203  {
204  case 0:
206  /* FIXME: Move OK button to position of the Cancel button (cosmetic) */
207  case 1:
210  break;
211  default:
214  break;
215  }
216  return TRUE;
217  }
218  default:
219  break;
220  }
221  return FALSE;
222 }
223 
224 /*************************************************************************
225  * @ [SHLWAPI.185]
226  *
227  * Pop up a 'Don't show this message again' dialogue box.
228  *
229  * PARAMS
230  * hWnd [I] Window to be the dialogues' parent
231  * lpszText [I] Text of the message to show
232  * lpszTitle [I] Title of the dialogue box
233  * dwType [I] Type of dialogue buttons (See below)
234  * iRet [I] Value to return if dialogue is not shown
235  * lpszId [I] Name of registry subkey which determines whether to show the dialog
236  *
237  * RETURNS
238  * Success: The value returned from the dialogue procedure (e.g. IDOK).
239  * Failure: iRet, if the default dialogue resource could not be loaded or the
240  * dialogue should not be shown.
241  *
242  * NOTES
243  * - Both lpszTitle and lpszId must be less than MAX_PATH in length.
244  * - Possible values for dwType are:
245  *| Value Buttons
246  *| ----- -------
247  *| 0 OK
248  *| 1 OK/Cancel
249  *| 2 Yes/No
250  */
252  DWORD dwType, INT_PTR iRet, LPCSTR lpszId)
253 {
254  WCHAR szTitleBuff[MAX_PATH], szIdBuff[MAX_PATH];
255  WCHAR *szTextBuff = NULL;
256  int iLen;
257  INT_PTR iRetVal;
258 
259  if (lpszTitle)
260  MultiByteToWideChar(CP_ACP, 0, lpszTitle, -1, szTitleBuff, MAX_PATH);
261 
262  if (lpszText)
263  {
264  iLen = MultiByteToWideChar(CP_ACP, 0, lpszText, -1, NULL, 0);
265  szTextBuff = HeapAlloc(GetProcessHeap(), 0, iLen * sizeof(WCHAR));
266  MultiByteToWideChar(CP_ACP, 0, lpszText, -1, szTextBuff, iLen);
267  }
268 
269  MultiByteToWideChar(CP_ACP, 0, lpszId, -1, szIdBuff, MAX_PATH);
270 
271  iRetVal = SHMessageBoxCheckW(hWnd, szTextBuff, lpszTitle ? szTitleBuff : NULL,
272  dwType, iRet, szIdBuff);
273  HeapFree(GetProcessHeap(), 0, szTextBuff);
274  return iRetVal;
275 }
276 
277 /*************************************************************************
278  * @ [SHLWAPI.191]
279  *
280  * Unicode version of SHMessageBoxCheckA.
281  */
283  DWORD dwType, INT_PTR iRet, LPCWSTR lpszId)
284 {
285  DLGDATA d;
286 
287  d.lpszTitle = lpszTitle;
288  d.lpszText = lpszText;
289  d.dwType = dwType;
290 
292  SHDlgProc, (LPARAM)&d, iRet, lpszId);
293 }
#define IDOK
Definition: winuser.h:824
LONG WINAPI SHRegSetUSValueW(LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwType, LPVOID pvData, DWORD cbData, DWORD dwFlags)
Definition: reg.c:673
INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
#define IDYES
Definition: winuser.h:829
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
LPCWSTR lpszTitle
Definition: msgbox.c:180
#define TRUE
Definition: types.h:120
#define SW_HIDE
Definition: winuser.h:762
#define CP_ACP
Definition: compat.h:109
static INT_PTR CALLBACK SHDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: msgbox.c:186
BOOL WINAPI SHRegGetBoolUSValueW(LPCWSTR pszSubKey, LPCWSTR pszValue, BOOL fIgnoreHKCU, BOOL fDefault)
Definition: reg.c:770
#define CALLBACK
Definition: compat.h:35
HWND hWnd
Definition: settings.c:17
HINSTANCE shlwapi_hInstance
Definition: shlwapi_main.c:33
BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR)
UINT_PTR WPARAM
Definition: windef.h:207
#define GetWindowLongPtrW
Definition: winuser.h:4804
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
int32_t INT_PTR
Definition: typedefs.h:64
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
WPARAM wParam
Definition: combotst.c:138
#define FALSE
Definition: types.h:117
#define debugstr_w
Definition: kernel32.h:32
#define MAKELONG(a, b)
Definition: typedefs.h:249
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
#define BM_GETCHECK
Definition: winuser.h:1900
INT_PTR WINAPI SHMessageBoxCheckExA(HWND hWnd, HINSTANCE hInst, LPCSTR lpszName, DLGPROC dlgProc, LPARAM lParam, INT_PTR iRet, LPCSTR lpszId)
Definition: msgbox.c:141
const char * LPCSTR
Definition: xmlstorage.h:183
WINE_DEFAULT_DEBUG_CHANNEL(shell)
INT_PTR WINAPI SHMessageBoxCheckA(HWND hWnd, LPCSTR lpszText, LPCSTR lpszTitle, DWORD dwType, INT_PTR iRet, LPCSTR lpszId)
Definition: msgbox.c:251
#define TRACE(s)
Definition: solgame.cpp:4
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
#define GetProcessHeap()
Definition: compat.h:484
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
#define d
Definition: ke_i.h:81
DLGPROC dlgProc
Definition: msgbox.c:54
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LPARAM lParam
Definition: msgbox.c:55
#define MAX_PATH
Definition: compat.h:34
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
LPCWSTR lpszId
Definition: msgbox.c:56
DWORD dwType
Definition: msgbox.c:182
static const WCHAR L[]
Definition: oid.c:1250
struct tagDLGDATAEX DLGDATAEX
#define DWLP_USER
Definition: winuser.h:866
#define WM_COMMAND
Definition: winuser.h:1722
INT_PTR(CALLBACK * DLGPROC)(HWND, UINT, WPARAM, LPARAM)
Definition: winuser.h:2871
HINSTANCE hInst
Definition: dxdiag.c:13
#define IDS_ERR_USER_MSG
Definition: resource.h:41
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define IDC_ERR_DONT_SHOW
Definition: resource.h:42
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
unsigned int UINT
Definition: ndis.h:50
#define MultiByteToWideChar
Definition: compat.h:110
static const WCHAR szName[]
Definition: msipriv.h:1194
static const WCHAR szDontShowKey[]
Definition: msgbox.c:41
#define HIWORD(l)
Definition: typedefs.h:247
#define IDD_ERR_DIALOG
Definition: resource.h:40
#define SetWindowLongPtrW
Definition: winuser.h:5321
#define IDNO
Definition: winuser.h:830
struct tagDLGDATA DLGDATA
#define IDCANCEL
Definition: winuser.h:825
LPCWSTR lpszText
Definition: msgbox.c:181
INT_PTR WINAPI SHMessageBoxCheckW(HWND, LPCWSTR, LPCWSTR, DWORD, INT_PTR, LPCWSTR)
Definition: msgbox.c:282
#define REG_DWORD
Definition: sdbapi.c:596
#define WM_INITDIALOG
Definition: winuser.h:1721
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
#define HeapFree(x, y, z)
Definition: compat.h:483
static INT_PTR CALLBACK SHDlgProcEx(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: msgbox.c:60
INT_PTR WINAPI SHMessageBoxCheckExW(HWND, HINSTANCE, LPCWSTR, DLGPROC, LPARAM, INT_PTR, LPCWSTR)
Definition: msgbox.c:163
#define SHREGSET_DEFAULT
Definition: shlwapi.h:315