mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2025-11-11 11:08:02 -06:00
Windows: Solve various issues in HotKeys assignment dialog by ensuring that keys are detected only when the assignment edit has the focus and also by taking a key into account only once even if it remains pressed contently (this solves issue http://sourceforge.net/p/veracrypt/discussion/technical/thread/6597c91a)
This commit is contained in:
@@ -30,6 +30,7 @@ static TCHOTKEY tmpHotkeys [NBR_HOTKEYS];
|
|||||||
|
|
||||||
static int nSelectedHotkeyId;
|
static int nSelectedHotkeyId;
|
||||||
static UINT currentVKeyCode;
|
static UINT currentVKeyCode;
|
||||||
|
static BYTE vkeysDown[256];
|
||||||
|
|
||||||
|
|
||||||
static void ScanAndProcessKey (UINT *vKeyCode, wchar_t *keyName)
|
static void ScanAndProcessKey (UINT *vKeyCode, wchar_t *keyName)
|
||||||
@@ -41,9 +42,15 @@ static void ScanAndProcessKey (UINT *vKeyCode, wchar_t *keyName)
|
|||||||
{
|
{
|
||||||
if (GetAsyncKeyState (vKey) < 0)
|
if (GetAsyncKeyState (vKey) < 0)
|
||||||
{
|
{
|
||||||
if (GetKeyName (vKey, keyName)) // If the key is allowed and its name has been resolved
|
if (!vkeysDown [vKey])
|
||||||
*vKeyCode = vKey;
|
{
|
||||||
|
vkeysDown [vKey] = 1;
|
||||||
|
if (GetKeyName (vKey, keyName)) // If the key is allowed and its name has been resolved
|
||||||
|
*vKeyCode = vKey;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
vkeysDown [vKey] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,6 +69,56 @@ BOOL GetKeyName (UINT vKey, wchar_t *keyName)
|
|||||||
{
|
{
|
||||||
// OEM-specific
|
// OEM-specific
|
||||||
StringCbPrintfW (keyName, MAX_KEY_COMB_NAME_LEN, L"OEM-%d", vKey);
|
StringCbPrintfW (keyName, MAX_KEY_COMB_NAME_LEN, L"OEM-%d", vKey);
|
||||||
|
|
||||||
|
// mapping taken from:
|
||||||
|
// http://www.hotkeynet.com/ref/keynames.html
|
||||||
|
// https://mojoware.googlecode.com/svn-history/r3/trunk/mojo_engine/cKeyboard.cpp
|
||||||
|
// http://www.screenio.com/gui_screenio/gs_htmlhelp_subweb/download/SIMKEYS.cob
|
||||||
|
//
|
||||||
|
// These values seem to come from Nokia/Ericsson mobile device keys
|
||||||
|
|
||||||
|
switch (vKey)
|
||||||
|
{
|
||||||
|
case 0xE9: // OEMReset = 0xE9
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMReset)");
|
||||||
|
break;
|
||||||
|
case 0xEA: // OEMJump = 0xEA
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMJump)");
|
||||||
|
break;
|
||||||
|
case 0xEB: // OEMPA1 = 0xEB
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMPA1)");
|
||||||
|
break;
|
||||||
|
case 0xEC: // OEMPA2 = 0xEC
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMPA2)");
|
||||||
|
break;
|
||||||
|
case 0xED: // OEMPA3 = 0xED
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMPA3)");
|
||||||
|
break;
|
||||||
|
case 0xEE: // OEMWSCtrl = 0xEE
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMWSCtrl)");
|
||||||
|
break;
|
||||||
|
case 0xEF: // OEMCUSel = 0xEF
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMCUSel)");
|
||||||
|
break;
|
||||||
|
case 0xF0: // OEMATTN = 0xF0
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMATTN)");
|
||||||
|
break;
|
||||||
|
case 0xF1: // OEMFinish = 0xF1
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMFinish)");
|
||||||
|
break;
|
||||||
|
case 0xF2: // OEMCopy = 0xF2
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMCopy)");
|
||||||
|
break;
|
||||||
|
case 0xF3: // OEMAuto = 0xF3
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMAuto)");
|
||||||
|
break;
|
||||||
|
case 0xF4: // OEMENLW = 0xF4
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMENLW)");
|
||||||
|
break;
|
||||||
|
case 0xF5: // OEMBackTab = 0xF5
|
||||||
|
StringCbCatW (keyName, MAX_KEY_COMB_NAME_LEN, L" (OEMBackTab)");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (vKey >= VK_F1 && vKey <= VK_F24)
|
else if (vKey >= VK_F1 && vKey <= VK_F24)
|
||||||
{
|
{
|
||||||
@@ -296,6 +353,7 @@ BOOL CALLBACK HotkeysDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar
|
|||||||
nSelectedHotkeyId = -1;
|
nSelectedHotkeyId = -1;
|
||||||
currentVKeyCode = 0;
|
currentVKeyCode = 0;
|
||||||
memcpy (tmpHotkeys, Hotkeys, sizeof(tmpHotkeys));
|
memcpy (tmpHotkeys, Hotkeys, sizeof(tmpHotkeys));
|
||||||
|
memset (vkeysDown, 0, sizeof(vkeysDown));
|
||||||
|
|
||||||
SendMessageW (hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0,
|
SendMessageW (hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0,
|
||||||
LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_LABELTIP
|
LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_LABELTIP
|
||||||
@@ -337,7 +395,7 @@ BOOL CALLBACK HotkeysDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar
|
|||||||
|
|
||||||
case WM_TIMER:
|
case WM_TIMER:
|
||||||
{
|
{
|
||||||
if (nSelectedHotkeyId > -1)
|
if ((nSelectedHotkeyId > -1) && (GetFocus () == GetDlgItem (hwndDlg, IDC_HOTKEY_KEY)))
|
||||||
{
|
{
|
||||||
wchar_t keyName [MAX_KEY_COMB_NAME_LEN];
|
wchar_t keyName [MAX_KEY_COMB_NAME_LEN];
|
||||||
UINT tmpVKeyCode;
|
UINT tmpVKeyCode;
|
||||||
@@ -352,6 +410,10 @@ BOOL CALLBACK HotkeysDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar
|
|||||||
SetWindowTextW (GetDlgItem (hwndDlg, IDC_HOTKEY_KEY), keyName);
|
SetWindowTextW (GetDlgItem (hwndDlg, IDC_HOTKEY_KEY), keyName);
|
||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_HOTKEY_ASSIGN), TRUE);
|
EnableWindow (GetDlgItem (hwndDlg, IDC_HOTKEY_ASSIGN), TRUE);
|
||||||
}
|
}
|
||||||
|
else if ((currentVKeyCode != 0) && GetKeyName (currentVKeyCode, keyName))
|
||||||
|
{
|
||||||
|
SetWindowTextW (GetDlgItem (hwndDlg, IDC_HOTKEY_KEY), keyName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@@ -365,6 +427,8 @@ BOOL CALLBACK HotkeysDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar
|
|||||||
LVITEM item;
|
LVITEM item;
|
||||||
memset(&item,0,sizeof(item));
|
memset(&item,0,sizeof(item));
|
||||||
nSelectedHotkeyId = ((LPNMLISTVIEW) lParam)->iItem;
|
nSelectedHotkeyId = ((LPNMLISTVIEW) lParam)->iItem;
|
||||||
|
currentVKeyCode = 0;
|
||||||
|
memset (vkeysDown, 0, sizeof(vkeysDown));
|
||||||
SetWindowTextW (GetDlgItem (hwndDlg, IDC_HOTKEY_KEY), GetString ("PRESS_A_KEY_TO_ASSIGN"));
|
SetWindowTextW (GetDlgItem (hwndDlg, IDC_HOTKEY_KEY), GetString ("PRESS_A_KEY_TO_ASSIGN"));
|
||||||
|
|
||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_HOTKEY_REMOVE), (tmpHotkeys[nSelectedHotkeyId].vKeyCode > 0));
|
EnableWindow (GetDlgItem (hwndDlg, IDC_HOTKEY_REMOVE), (tmpHotkeys[nSelectedHotkeyId].vKeyCode > 0));
|
||||||
@@ -446,6 +510,8 @@ BOOL CALLBACK HotkeysDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar
|
|||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_HOTKEY_REMOVE), FALSE);
|
EnableWindow (GetDlgItem (hwndDlg, IDC_HOTKEY_REMOVE), FALSE);
|
||||||
nSelectedHotkeyId = -1;
|
nSelectedHotkeyId = -1;
|
||||||
bKeyScanOn = FALSE;
|
bKeyScanOn = FALSE;
|
||||||
|
currentVKeyCode = 0;
|
||||||
|
memset (vkeysDown, 0, sizeof(vkeysDown));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DisplayHotkeyList(hwndDlg);
|
DisplayHotkeyList(hwndDlg);
|
||||||
@@ -463,6 +529,8 @@ BOOL CALLBACK HotkeysDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar
|
|||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_HOTKEY_REMOVE), FALSE);
|
EnableWindow (GetDlgItem (hwndDlg, IDC_HOTKEY_REMOVE), FALSE);
|
||||||
nSelectedHotkeyId = -1;
|
nSelectedHotkeyId = -1;
|
||||||
bKeyScanOn = FALSE;
|
bKeyScanOn = FALSE;
|
||||||
|
currentVKeyCode = 0;
|
||||||
|
memset (vkeysDown, 0, sizeof(vkeysDown));
|
||||||
DisplayHotkeyList(hwndDlg);
|
DisplayHotkeyList(hwndDlg);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
@@ -482,6 +550,8 @@ BOOL CALLBACK HotkeysDlgProc (HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lPar
|
|||||||
EnableWindow (GetDlgItem (hwndDlg, IDC_HOTKEY_REMOVE), FALSE);
|
EnableWindow (GetDlgItem (hwndDlg, IDC_HOTKEY_REMOVE), FALSE);
|
||||||
nSelectedHotkeyId = -1;
|
nSelectedHotkeyId = -1;
|
||||||
bKeyScanOn = FALSE;
|
bKeyScanOn = FALSE;
|
||||||
|
currentVKeyCode = 0;
|
||||||
|
memset (vkeysDown, 0, sizeof(vkeysDown));
|
||||||
DisplayHotkeyList(hwndDlg);
|
DisplayHotkeyList(hwndDlg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user