[MSGINA] Remember the previous choice in the shutdown dialog. Brought to you by Ricardo Hanke. CORE-8992

svn path=/trunk/; revision=65936
This commit is contained in:
Amine Khaldi 2015-01-02 11:20:35 +00:00
parent 19116d3a60
commit a9971a2a04

View file

@ -10,11 +10,96 @@
#include <powrprof.h> #include <powrprof.h>
#include <strsafe.h> #include <strsafe.h>
#include <wingdi.h> #include <wingdi.h>
#include <winreg.h>
#include <stdlib.h> #include <stdlib.h>
int g_shutdownCode = 0; int g_shutdownCode = 0;
BOOL g_logoffHideState = FALSE; BOOL g_logoffHideState = FALSE;
int LoadShutdownSelState(void)
{
HKEY hKey;
DWORD dwValue, dwTemp, dwSize;
/* default to shutdown */
dwValue = 1;
if (RegOpenKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
{
return dwValue;
}
dwSize = sizeof(dwTemp);
if (RegQueryValueExW(hKey, L"Shutdown Setting", NULL, NULL, (LPBYTE)&dwTemp, &dwSize) == ERROR_SUCCESS)
{
switch(dwTemp)
{
case 0x01: /* Log off */
dwValue = 0;
break;
case 0x02: /* Shut down */
dwValue = 1;
break;
case 0x04: /* Reboot */
dwValue = 2;
break;
case 0x10: /* Sleep */
dwValue = 3;
break;
case 0x40: /* Hibernate */
dwValue = 4;
break;
}
}
RegCloseKey(hKey);
return dwValue;
}
VOID SaveShutdownSelState(int ShutdownCode)
{
HKEY hKey;
DWORD dwValue = 0;
if (RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL, &hKey, NULL) != ERROR_SUCCESS)
{
return;
}
switch(ShutdownCode)
{
case 0: /* Log off */
dwValue = 0x01;
break;
case 1: /* Shut down */
dwValue = 0x02;
break;
case 2: /* Reboot */
dwValue = 0x04;
break;
case 3: /* Sleep */
dwValue = 0x10;
break;
case 4: /* Hibernate */
dwValue = 0x40;
break;
}
RegSetValueExW(hKey, L"Shutdown Setting", 0, REG_DWORD, (const BYTE*)&dwValue, sizeof(dwValue));
RegCloseKey(hKey);
}
VOID UpdateShutdownShellDesc(HWND hwnd) VOID UpdateShutdownShellDesc(HWND hwnd)
{ {
WCHAR tmpBuffer[256]; WCHAR tmpBuffer[256];
@ -109,6 +194,7 @@ BOOL CALLBACK ExitWindowsDialogShellProc(HWND hwnd, UINT Message, WPARAM wParam,
case WM_INITDIALOG: case WM_INITDIALOG:
{ {
int defSelect = 0; int defSelect = 0;
int tmpSelect, lastState;
WCHAR userBuffer[256]; WCHAR userBuffer[256];
DWORD userBufferSize = _countof(userBuffer); DWORD userBufferSize = _countof(userBuffer);
WCHAR tmpBuffer[256]; WCHAR tmpBuffer[256];
@ -125,35 +211,57 @@ BOOL CALLBACK ExitWindowsDialogShellProc(HWND hwnd, UINT Message, WPARAM wParam,
/* Clears the content before it's used */ /* Clears the content before it's used */
SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_RESETCONTENT, 0, 0); SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_RESETCONTENT, 0, 0);
lastState = LoadShutdownSelState();
if(!g_logoffHideState) if(!g_logoffHideState)
{ {
/* Log off */ /* Log off */
LoadStringW(hDllInstance, IDS_SHUTDOWN_LOGOFF, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR)); LoadStringW(hDllInstance, IDS_SHUTDOWN_LOGOFF, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR));
GetUserNameW(userBuffer, &userBufferSize); GetUserNameW(userBuffer, &userBufferSize);
StringCchPrintfW(tmpBuffer2, 512, tmpBuffer, userBuffer); StringCchPrintfW(tmpBuffer2, 512, tmpBuffer, userBuffer);
SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer2); tmpSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer2);
if (lastState == 0)
{
defSelect = tmpSelect;
}
} }
/* Shut down - DEFAULT */ /* Shut down - DEFAULT */
LoadStringW(hDllInstance, IDS_SHUTDOWN_SHUTDOWN, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR)); LoadStringW(hDllInstance, IDS_SHUTDOWN_SHUTDOWN, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR));
defSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); tmpSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer);
if (lastState == 1)
{
defSelect = tmpSelect;
}
/* Restart */ /* Restart */
LoadStringW(hDllInstance, IDS_SHUTDOWN_RESTART, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR)); LoadStringW(hDllInstance, IDS_SHUTDOWN_RESTART, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR));
SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); tmpSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer);
if (lastState == 2)
{
defSelect = tmpSelect;
}
/* Sleep */ /* Sleep */
if (IsPwrSuspendAllowed()) if (IsPwrSuspendAllowed())
{ {
LoadStringW(hDllInstance, IDS_SHUTDOWN_SLEEP, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR)); LoadStringW(hDllInstance, IDS_SHUTDOWN_SLEEP, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR));
SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); tmpSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer);
if (lastState == 3)
{
defSelect = tmpSelect;
}
} }
/* Hibernate */ /* Hibernate */
if (IsPwrHibernateAllowed()) if (IsPwrHibernateAllowed())
{ {
LoadStringW(hDllInstance, IDS_SHUTDOWN_HIBERNATE, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR)); LoadStringW(hDllInstance, IDS_SHUTDOWN_HIBERNATE, tmpBuffer, sizeof(tmpBuffer)/sizeof(WCHAR));
SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer); tmpSelect = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_ADDSTRING, 0, (LPARAM)tmpBuffer);
if (lastState == 4)
{
defSelect = tmpSelect;
}
} }
/* Sets the default shut down selection */ /* Sets the default shut down selection */
@ -192,6 +300,7 @@ BOOL CALLBACK ExitWindowsDialogShellProc(HWND hwnd, UINT Message, WPARAM wParam,
{ {
case IDOK: case IDOK:
g_shutdownCode = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); g_shutdownCode = SendDlgItemMessageW(hwnd, IDC_SHUTDOWN_LIST, CB_GETCURSEL, (WPARAM)0, (LPARAM)0);
SaveShutdownSelState(g_shutdownCode);
EndDialog(hwnd, IDOK); EndDialog(hwnd, IDOK);
break; break;
case IDCANCEL: case IDCANCEL: