mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 11:08:02 -06:00
Windows: Allow Application key to open context menu on drive letters list.
This commit is contained in:
@@ -5961,6 +5961,166 @@ static BOOL CheckMountList (HWND hwndDlg, BOOL bForceTaskBarUpdate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DisplayDriveListContextMenu (HWND hwndDlg, LPARAM lParam)
|
||||||
|
{
|
||||||
|
/* Drive list context menu */
|
||||||
|
DWORD mPos;
|
||||||
|
int menuItem;
|
||||||
|
HMENU popup = CreatePopupMenu ();
|
||||||
|
HWND hList = GetDlgItem (hwndDlg, IDC_DRIVELIST);
|
||||||
|
|
||||||
|
SetFocus (hList);
|
||||||
|
|
||||||
|
switch (LOWORD (GetSelectedLong (hList)))
|
||||||
|
{
|
||||||
|
case TC_MLIST_ITEM_FREE:
|
||||||
|
|
||||||
|
// No mounted volume at this drive letter
|
||||||
|
|
||||||
|
AppendMenuW (popup, MF_STRING, IDM_MOUNT_VOLUME, GetString ("IDM_MOUNT_VOLUME"));
|
||||||
|
AppendMenu (popup, MF_SEPARATOR, 0, "");
|
||||||
|
AppendMenuW (popup, MF_STRING, IDPM_SELECT_FILE_AND_MOUNT, GetString ("SELECT_FILE_AND_MOUNT"));
|
||||||
|
AppendMenuW (popup, MF_STRING, IDPM_SELECT_DEVICE_AND_MOUNT, GetString ("SELECT_DEVICE_AND_MOUNT"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TC_MLIST_ITEM_NONSYS_VOL:
|
||||||
|
|
||||||
|
// There's a mounted non-system volume at this drive letter
|
||||||
|
|
||||||
|
AppendMenuW (popup, MF_STRING, IDM_UNMOUNT_VOLUME, GetString ("DISMOUNT"));
|
||||||
|
AppendMenuW (popup, MF_STRING, IDPM_OPEN_VOLUME, GetString ("OPEN"));
|
||||||
|
AppendMenu (popup, MF_SEPARATOR, 0, "");
|
||||||
|
AppendMenuW (popup, MF_STRING, IDPM_CHECK_FILESYS, GetString ("IDPM_CHECK_FILESYS"));
|
||||||
|
AppendMenuW (popup, MF_STRING, IDPM_REPAIR_FILESYS, GetString ("IDPM_REPAIR_FILESYS"));
|
||||||
|
AppendMenu (popup, MF_SEPARATOR, 0, "");
|
||||||
|
AppendMenuW (popup, MF_STRING, IDPM_ADD_TO_FAVORITES, GetString ("IDPM_ADD_TO_FAVORITES"));
|
||||||
|
AppendMenuW (popup, MF_STRING, IDPM_ADD_TO_SYSTEM_FAVORITES, GetString ("IDPM_ADD_TO_SYSTEM_FAVORITES"));
|
||||||
|
AppendMenu (popup, MF_SEPARATOR, 0, "");
|
||||||
|
AppendMenuW (popup, MF_STRING, IDM_DECRYPT_NONSYS_VOL, GetString ("IDM_DECRYPT_NONSYS_VOL"));
|
||||||
|
AppendMenu (popup, MF_SEPARATOR, 0, "");
|
||||||
|
AppendMenuW (popup, MF_STRING, IDM_VOLUME_PROPERTIES, GetString ("IDPM_PROPERTIES"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TC_MLIST_ITEM_SYS_PARTITION:
|
||||||
|
case TC_MLIST_ITEM_SYS_DRIVE:
|
||||||
|
|
||||||
|
// System partition/drive
|
||||||
|
|
||||||
|
PopulateSysEncContextMenu (popup, FALSE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lParam)
|
||||||
|
{
|
||||||
|
mPos=GetMessagePos();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
POINT pt = {0};
|
||||||
|
if (ListView_GetItemPosition (hList, nSelectedDriveIndex, &pt))
|
||||||
|
{
|
||||||
|
pt.x += 2 + ::GetSystemMetrics(SM_CXICON);
|
||||||
|
pt.y += 2;
|
||||||
|
ClientToScreen (hList, &pt);
|
||||||
|
mPos = MAKELONG (pt.x, pt.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
menuItem = TrackPopupMenu (popup,
|
||||||
|
TPM_RETURNCMD | TPM_LEFTBUTTON,
|
||||||
|
GET_X_LPARAM(mPos),
|
||||||
|
GET_Y_LPARAM(mPos),
|
||||||
|
0,
|
||||||
|
hwndDlg,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
DestroyMenu (popup);
|
||||||
|
|
||||||
|
switch (menuItem)
|
||||||
|
{
|
||||||
|
case IDPM_SELECT_FILE_AND_MOUNT:
|
||||||
|
if (SelectContainer (hwndDlg))
|
||||||
|
MountSelectedVolume (hwndDlg, FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDPM_SELECT_DEVICE_AND_MOUNT:
|
||||||
|
if (SelectPartition (hwndDlg))
|
||||||
|
MountSelectedVolume (hwndDlg, FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDPM_CHECK_FILESYS:
|
||||||
|
case IDPM_REPAIR_FILESYS:
|
||||||
|
{
|
||||||
|
LPARAM lLetter = GetSelectedLong (hList);
|
||||||
|
|
||||||
|
if (LOWORD (lLetter) != 0xffff)
|
||||||
|
CheckFilesystem (hwndDlg, (char) HIWORD (lLetter) - 'A', menuItem == IDPM_REPAIR_FILESYS);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDM_UNMOUNT_VOLUME:
|
||||||
|
if (CheckMountList (hwndDlg, FALSE))
|
||||||
|
Dismount (hwndDlg, -2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDM_DECRYPT_NONSYS_VOL:
|
||||||
|
if (CheckMountList (hwndDlg, FALSE))
|
||||||
|
DecryptNonSysDevice (hwndDlg, FALSE, TRUE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDPM_OPEN_VOLUME:
|
||||||
|
{
|
||||||
|
LPARAM state;
|
||||||
|
if (lParam)
|
||||||
|
nSelectedDriveIndex = ((LPNMITEMACTIVATE)lParam)->iItem;
|
||||||
|
else
|
||||||
|
nSelectedDriveIndex = ListView_GetSelectionMark (hList);
|
||||||
|
state = GetItemLong (hList, nSelectedDriveIndex );
|
||||||
|
|
||||||
|
WaitCursor ();
|
||||||
|
OpenVolumeExplorerWindow (HIWORD(state) - 'A');
|
||||||
|
NormalCursor ();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDM_VOLUME_PROPERTIES:
|
||||||
|
DialogBoxParamW (hInst,
|
||||||
|
MAKEINTRESOURCEW (IDD_VOLUME_PROPERTIES), hwndDlg,
|
||||||
|
(DLGPROC) VolumePropertiesDlgProc, (LPARAM) FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDM_MOUNT_VOLUME:
|
||||||
|
if (!VolumeSelected(hwndDlg))
|
||||||
|
{
|
||||||
|
Warning ("NO_VOLUME_SELECTED", hwndDlg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mountOptions = defaultMountOptions;
|
||||||
|
bPrebootPasswordDlgMode = FALSE;
|
||||||
|
|
||||||
|
if (CheckMountList (hwndDlg, FALSE))
|
||||||
|
_beginthread(mountThreadFunction, 0, hwndDlg);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case IDPM_ADD_TO_FAVORITES:
|
||||||
|
case IDPM_ADD_TO_SYSTEM_FAVORITES:
|
||||||
|
{
|
||||||
|
LPARAM selectedDrive = GetSelectedLong (hList);
|
||||||
|
|
||||||
|
if (LOWORD (selectedDrive) == TC_MLIST_ITEM_NONSYS_VOL)
|
||||||
|
AddMountedVolumeToFavorites (hwndDlg, HIWORD (selectedDrive) - 'A', menuItem == IDPM_ADD_TO_SYSTEM_FAVORITES);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
SendMessage (MainDlg, WM_COMMAND, menuItem, NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Except in response to the WM_INITDIALOG and WM_ENDSESSION messages, the dialog box procedure
|
/* Except in response to the WM_INITDIALOG and WM_ENDSESSION messages, the dialog box procedure
|
||||||
should return nonzero if it processes a message, and zero if it does not. */
|
should return nonzero if it processes a message, and zero if it does not. */
|
||||||
BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
@@ -5968,7 +6128,6 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
|
|||||||
static UINT taskBarCreatedMsg;
|
static UINT taskBarCreatedMsg;
|
||||||
WORD lw = LOWORD (wParam);
|
WORD lw = LOWORD (wParam);
|
||||||
WORD hw = HIWORD (wParam);
|
WORD hw = HIWORD (wParam);
|
||||||
DWORD mPos;
|
|
||||||
|
|
||||||
switch (uMsg)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
@@ -6363,6 +6522,26 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
|
|||||||
case WM_MOUSEWHEEL:
|
case WM_MOUSEWHEEL:
|
||||||
return HandleDriveListMouseWheelEvent (uMsg, wParam, lParam, FALSE);
|
return HandleDriveListMouseWheelEvent (uMsg, wParam, lParam, FALSE);
|
||||||
|
|
||||||
|
case WM_CONTEXTMENU:
|
||||||
|
{
|
||||||
|
HWND hList = GetDlgItem (hwndDlg, IDC_DRIVELIST);
|
||||||
|
// only handle if it is coming from keyboard and if the drive
|
||||||
|
// list has focus. The other cases are handled elsewhere
|
||||||
|
if ( (-1 == GET_X_LPARAM(lParam))
|
||||||
|
&& (-1 == GET_Y_LPARAM(lParam))
|
||||||
|
&& (GetFocus () == hList)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
INT item = ListView_GetSelectionMark (hList);
|
||||||
|
if (item >= 0)
|
||||||
|
{
|
||||||
|
nSelectedDriveIndex = item;
|
||||||
|
DisplayDriveListContextMenu (hwndDlg, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_WINDOWPOSCHANGING:
|
case WM_WINDOWPOSCHANGING:
|
||||||
if (MainWindowHidden)
|
if (MainWindowHidden)
|
||||||
{
|
{
|
||||||
@@ -6917,142 +7096,8 @@ BOOL CALLBACK MainDialogProc (HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPa
|
|||||||
RMB drag-and-drop operations as well. */
|
RMB drag-and-drop operations as well. */
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Drive list context menu */
|
DisplayDriveListContextMenu (hwndDlg, lParam);
|
||||||
|
|
||||||
int menuItem;
|
|
||||||
HMENU popup = CreatePopupMenu ();
|
|
||||||
|
|
||||||
SetFocus (GetDlgItem (hwndDlg, IDC_DRIVELIST));
|
|
||||||
|
|
||||||
switch (LOWORD (GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST))))
|
|
||||||
{
|
|
||||||
case TC_MLIST_ITEM_FREE:
|
|
||||||
|
|
||||||
// No mounted volume at this drive letter
|
|
||||||
|
|
||||||
AppendMenuW (popup, MF_STRING, IDM_MOUNT_VOLUME, GetString ("IDM_MOUNT_VOLUME"));
|
|
||||||
AppendMenu (popup, MF_SEPARATOR, 0, "");
|
|
||||||
AppendMenuW (popup, MF_STRING, IDPM_SELECT_FILE_AND_MOUNT, GetString ("SELECT_FILE_AND_MOUNT"));
|
|
||||||
AppendMenuW (popup, MF_STRING, IDPM_SELECT_DEVICE_AND_MOUNT, GetString ("SELECT_DEVICE_AND_MOUNT"));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TC_MLIST_ITEM_NONSYS_VOL:
|
|
||||||
|
|
||||||
// There's a mounted non-system volume at this drive letter
|
|
||||||
|
|
||||||
AppendMenuW (popup, MF_STRING, IDM_UNMOUNT_VOLUME, GetString ("DISMOUNT"));
|
|
||||||
AppendMenuW (popup, MF_STRING, IDPM_OPEN_VOLUME, GetString ("OPEN"));
|
|
||||||
AppendMenu (popup, MF_SEPARATOR, 0, "");
|
|
||||||
AppendMenuW (popup, MF_STRING, IDPM_CHECK_FILESYS, GetString ("IDPM_CHECK_FILESYS"));
|
|
||||||
AppendMenuW (popup, MF_STRING, IDPM_REPAIR_FILESYS, GetString ("IDPM_REPAIR_FILESYS"));
|
|
||||||
AppendMenu (popup, MF_SEPARATOR, 0, "");
|
|
||||||
AppendMenuW (popup, MF_STRING, IDPM_ADD_TO_FAVORITES, GetString ("IDPM_ADD_TO_FAVORITES"));
|
|
||||||
AppendMenuW (popup, MF_STRING, IDPM_ADD_TO_SYSTEM_FAVORITES, GetString ("IDPM_ADD_TO_SYSTEM_FAVORITES"));
|
|
||||||
AppendMenu (popup, MF_SEPARATOR, 0, "");
|
|
||||||
AppendMenuW (popup, MF_STRING, IDM_DECRYPT_NONSYS_VOL, GetString ("IDM_DECRYPT_NONSYS_VOL"));
|
|
||||||
AppendMenu (popup, MF_SEPARATOR, 0, "");
|
|
||||||
AppendMenuW (popup, MF_STRING, IDM_VOLUME_PROPERTIES, GetString ("IDPM_PROPERTIES"));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TC_MLIST_ITEM_SYS_PARTITION:
|
|
||||||
case TC_MLIST_ITEM_SYS_DRIVE:
|
|
||||||
|
|
||||||
// System partition/drive
|
|
||||||
|
|
||||||
PopulateSysEncContextMenu (popup, FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mPos=GetMessagePos();
|
|
||||||
|
|
||||||
menuItem = TrackPopupMenu (popup,
|
|
||||||
TPM_RETURNCMD | TPM_LEFTBUTTON,
|
|
||||||
GET_X_LPARAM(mPos),
|
|
||||||
GET_Y_LPARAM(mPos),
|
|
||||||
0,
|
|
||||||
hwndDlg,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
DestroyMenu (popup);
|
|
||||||
|
|
||||||
switch (menuItem)
|
|
||||||
{
|
|
||||||
case IDPM_SELECT_FILE_AND_MOUNT:
|
|
||||||
if (SelectContainer (hwndDlg))
|
|
||||||
MountSelectedVolume (hwndDlg, FALSE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDPM_SELECT_DEVICE_AND_MOUNT:
|
|
||||||
if (SelectPartition (hwndDlg))
|
|
||||||
MountSelectedVolume (hwndDlg, FALSE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDPM_CHECK_FILESYS:
|
|
||||||
case IDPM_REPAIR_FILESYS:
|
|
||||||
{
|
|
||||||
LPARAM lLetter = GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST));
|
|
||||||
|
|
||||||
if (LOWORD (lLetter) != 0xffff)
|
|
||||||
CheckFilesystem (hwndDlg, (char) HIWORD (lLetter) - 'A', menuItem == IDPM_REPAIR_FILESYS);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDM_UNMOUNT_VOLUME:
|
|
||||||
if (CheckMountList (hwndDlg, FALSE))
|
|
||||||
Dismount (hwndDlg, -2);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDM_DECRYPT_NONSYS_VOL:
|
|
||||||
if (CheckMountList (hwndDlg, FALSE))
|
|
||||||
DecryptNonSysDevice (hwndDlg, FALSE, TRUE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDPM_OPEN_VOLUME:
|
|
||||||
{
|
|
||||||
LPARAM state = GetItemLong(GetDlgItem (hwndDlg, IDC_DRIVELIST), ((LPNMITEMACTIVATE)lParam)->iItem );
|
|
||||||
nSelectedDriveIndex = ((LPNMITEMACTIVATE)lParam)->iItem;
|
|
||||||
|
|
||||||
WaitCursor ();
|
|
||||||
OpenVolumeExplorerWindow (HIWORD(state) - 'A');
|
|
||||||
NormalCursor ();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDM_VOLUME_PROPERTIES:
|
|
||||||
DialogBoxParamW (hInst,
|
|
||||||
MAKEINTRESOURCEW (IDD_VOLUME_PROPERTIES), hwndDlg,
|
|
||||||
(DLGPROC) VolumePropertiesDlgProc, (LPARAM) FALSE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDM_MOUNT_VOLUME:
|
|
||||||
if (!VolumeSelected(hwndDlg))
|
|
||||||
{
|
|
||||||
Warning ("NO_VOLUME_SELECTED", hwndDlg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
mountOptions = defaultMountOptions;
|
|
||||||
bPrebootPasswordDlgMode = FALSE;
|
|
||||||
|
|
||||||
if (CheckMountList (hwndDlg, FALSE))
|
|
||||||
_beginthread(mountThreadFunction, 0, hwndDlg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IDPM_ADD_TO_FAVORITES:
|
|
||||||
case IDPM_ADD_TO_SYSTEM_FAVORITES:
|
|
||||||
{
|
|
||||||
LPARAM selectedDrive = GetSelectedLong (GetDlgItem (hwndDlg, IDC_DRIVELIST));
|
|
||||||
|
|
||||||
if (LOWORD (selectedDrive) == TC_MLIST_ITEM_NONSYS_VOL)
|
|
||||||
AddMountedVolumeToFavorites (hwndDlg, HIWORD (selectedDrive) - 'A', menuItem == IDPM_ADD_TO_SYSTEM_FAVORITES);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
SendMessage (MainDlg, WM_COMMAND, menuItem, NULL);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user