📄 pkmsgprc.c
字号:
{
TL_WATERMARK tlwm;
HDC hdc;
INT iNumBits;
// Determine if display will support watermark
hdc = GetDC (NULL);
iNumBits = GetDeviceCaps (hdc, BITSPIXEL) *
GetDeviceCaps (hdc, PLANES);
ReleaseDC (NULL, hdc);
if (iNumBits > 8)
{
BITMAP bmp;
// Associate the watermark bitmap with the tree view control.
if (IsNull (s_hbmpWatermark))
{
s_hbmpWatermark = LoadBitmap (
g_hinst, MAKEINTRESOURCE(IDB_KEYSWATERMARK));
}
GetObject (s_hbmpWatermark, sizeof(bmp), &bmp);
tlwm.hbm = s_hbmpWatermark;
tlwm.iAlpha = 0;
tlwm.crBkgrnd = RGB (255,255,255); // white
tlwm.size.cx = bmp.bmWidth;
tlwm.size.cy = bmp.bmHeight;
tlwm.ulFlags = TLWM_KEEPASPECTRATIO |
TLWM_CONSTANTBKGRND |
TLWM_SHRINKONLY;
TreeList_SetWatermarkBmp (ppks->hwndTreeList, &tlwm);
if (ppks->uFlags & PK_MAINWINDOW)
{
tlwm.hbm = NULL;
TreeList_SetWatermarkBmp (ppks->hwndTreeListGroups, &tlwm);
}
}
}
// initialize enabled/disabled states of toolbar buttons
PKSetToolbarButtonStates (ppks);
// initialize the number of mouse wheel scroll lines
sUpdateWheelScrollLines (ppks);
// initialize the token icon
sCheckForTokens (ppks->hwndMain);
return 0;
}
case WM_QUERYENDSESSION :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if (ppks->uFlags & PK_MAINWINDOW)
{
if (s_bKeyHasBeenGenerated)
return FALSE;
}
return TRUE;
case WM_CLOSE :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if (ppks->uFlags & PK_MAINWINDOW)
{
if (PKExistSplitKeyDialog (ppks))
{
PKSplitKeyWarn (hwnd);
break;
}
PKAutoBackup (ppks);
if (s_bKeyHasBeenGenerated)
{
BOOL bMakeBackups;
if (!PKBackupWarn (hwnd, TRUE, &bMakeBackups))
break;
if (bMakeBackups)
{
if (!PKUserBackup (hwnd, ppks->keydbMain))
break;
}
}
PGPclScheduleNextCRLUpdate (g_context, ppks->keydbMain);
PKSetPrivatePrefData (hwnd,
ppks->bGroupsVisible, ppks->iGroupsPercent,
ppks->iToolHeight);
HtmlHelp (hwnd, NULL, HH_CLOSE_ALL, 0);
if (s_hwndOpenSearch)
SendMessage (s_hwndOpenSearch, WM_CLOSE, 0, 0);
PKSendMessageWindowList (PK_M_CLOSEWINDOW, 0, 0);
}
else
{
SendMessage (hwnd, PK_M_CLOSEWINDOW, 0, 0);
}
DestroyWindow (hwnd);
return 0;
case PK_M_CLOSEWINDOW :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if (ppks->uFlags & PK_PDAWINDOW)
{
PGPKeyDBRef keydb;
PGPPDASTRUCT* pPDA;
keydb = PGPPeekKeySetKeyDB (ppks->keysetDisp);
pPDA = sPDAFromWindow (hwnd);
if (PGPKeyDBRefIsValid (keydb))
{
if (IsntNull (pPDA))
{
sSaveKeySetToPdaFile (hwnd, pPDA->hmod,
PGPPeekKeyDBRootKeySet (keydb), TRUE);
}
}
}
else if (ppks->uFlags & PK_SEARCHWINDOW)
{
KillTimer (hwnd, LEDTIMER);
s_hwndOpenSearch = NULL;
}
break;
case WM_ACTIVATE :
if (LOWORD (wParam) == WA_INACTIVE)
g_hwndActive = NULL;
else
{
g_hwndActive = hwnd;
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if (ppks->uFlags & PK_MAINWINDOW)
{
if (ppks->bGroupsFocused)
SetFocus (ppks->hwndTreeListGroups);
else
SetFocus (ppks->hwndTreeList);
}
else
SetFocus (ppks->hwndTreeList);
}
break;
case WM_ENABLE :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if (ppks->uFlags & PK_KEYWINDOW)
PKEnableWindowList ((BOOL)wParam);
PKEnableAllObjectPropertiesWindows (ppks, (BOOL)wParam);
break;
case WM_ENDSESSION :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
// we're not shutting down
if (!wParam)
{
// check if we are the reason
if (s_bKeyHasBeenGenerated)
{
// explain to user
PKMessageBox (hwnd, IDS_CAPTIONINFO,
IDS_CLOSEKEYSFIRST, MB_OK|MB_ICONINFORMATION);
}
break;
}
// otherwise session is ending
PKAutoBackup (ppks);
PGPclScheduleNextCRLUpdate (g_context, ppks->keydbMain);
PKSetPrivatePrefData (hwnd,
ppks->bGroupsVisible, ppks->iGroupsPercent,
ppks->iToolHeight);
// fall through
case WM_DESTROY :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if (ppks->hGM)
{
PGPgmDestroyGroupManager (ppks->hGM);
ppks->hGM = NULL;
}
RevokeDragDrop (ppks->hwndTreeList);
PKReleaseDropTarget (ppks->pDropTarget);
CoLockObjectExternal ((IUnknown*)ppks->pDropTarget, FALSE, TRUE);
DragAcceptFiles (ppks->hwndTreeList, FALSE);
PKDeleteAllObjectPropertiesWindows (ppks);
if (ppks->uFlags & PK_MAINWINDOW)
PGPclKeyListDestroy (ppks->hKL, TRUE);
else
PGPclKeyListDestroy (ppks->hKL, FALSE);
ppks->hKL = NULL;
if (ppks->uFlags & PK_MAINWINDOW)
{
PGPPrefRef prefref;
// this is because we've just saved a bunch of
// prefs concerning columns, windows, etc.
if (IsntPGPError (PGPclPeekClientLibPrefRefs (&prefref, NULL)))
PGPclFlushClientLibPrefs (prefref, NULL);
if (PGPKeyDBRefIsValid (ppks->keydbMain))
PGPFreeKeyDB (ppks->keydbMain);
PKAddRemoveWindowList (hwnd, FALSE, FALSE, FALSE);
PKPostMessageWindowList (WM_DESTROY, 0, 0);
PKDestroyToolbar (ppks->hwndToolBar);
if (IsntNull (s_hbmpWatermark))
DeleteObject (s_hbmpWatermark);
PostQuitMessage(0);
}
else
{
PGPKeyDBRef keydb;
keydb = PGPPeekKeySetKeyDB (ppks->keysetDisp);
if (PGPKeySetRefIsValid (ppks->keysetDisp))
PGPFreeKeySet (ppks->keysetDisp);
if (ppks->uFlags & PK_FILEWINDOW)
{
if (PGPKeyDBRefIsValid (ppks->keydbMain))
PGPFreeKeyDB (ppks->keydbMain);
}
else if (ppks->uFlags & PK_PDAWINDOW)
{
PGPPDASTRUCT* pPDA;
pPDA = sPDAFromWindow (hwnd);
if (IsntNull (pPDA))
pPDA->hwnd = NULL;
if (PGPKeyDBRefIsValid (keydb))
PGPFreeKeyDB (keydb);
}
else
{
if (PGPKeyDBRefIsValid (keydb) &&
(keydb != ppks->keydbMain))
{
PGPFreeKeyDB (keydb);
}
}
PKAddRemoveWindowList (hwnd, FALSE, FALSE, FALSE);
}
if (PGPKeyDBRefIsValid (ppks->keydbAuth))
PGPFreeKeyDB (ppks->keydbAuth);
pkFree (ppks);
ppks = NULL;
break;
case WM_INITMENU :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if ((HMENU)wParam == ppks->hmenuKeyMan)
PKSetMainMenu (ppks);
break;
case WM_SIZE :
{
INT iWidths[3];
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if ((HIWORD(lParam) == 0) || (LOWORD(lParam) == 0))
{
RECT rc;
GetClientRect (hwnd, &rc);
lParam = MAKELPARAM (rc.right, rc.bottom);
}
if (ppks->bGroupsVisible)
{
ppks->iGroupsHeight = HIWORD(lParam) * ppks->iGroupsPercent;
ppks->iGroupsHeight /= 100;
ppks->iKeysHeight =
HIWORD(lParam)-ppks->iToolHeight-s_uStatusBarHeight-
ppks->iGroupsHeight-GRABBARHEIGHT;
SetWindowPos (ppks->hwndTreeList, NULL,
0, 0,
LOWORD(lParam),
ppks->iKeysHeight,
SWP_NOMOVE|SWP_NOZORDER);
SetWindowPos (ppks->hwndTreeListGroups, NULL, 0,
HIWORD(lParam)-ppks->iGroupsHeight-s_uStatusBarHeight,
LOWORD(lParam),
ppks->iGroupsHeight,
SWP_NOZORDER);
}
else
{
ppks->iKeysHeight =
HIWORD(lParam)-ppks->iToolHeight-s_uStatusBarHeight;
SetWindowPos (ppks->hwndTreeList, NULL,
0, 0,
LOWORD(lParam),
ppks->iKeysHeight,
SWP_NOMOVE|SWP_NOZORDER);
}
SendMessage (ppks->klConfig.hwndStatusBar, WM_SIZE, wParam, lParam);
if ((ppks->uFlags & PK_MAINWINDOW) && (g_uNumTokens > 0))
iWidths[0] = ICONWIDTH;
else if (ppks->uFlags & PK_SEARCHWINDOW)
iWidths[0] = ICONWIDTH;
else
iWidths[0] = 0;
iWidths[1] = LOWORD(lParam)-TOTALLEDWIDTH-16;
iWidths[2] = LOWORD(lParam)-16;
SendMessage (ppks->klConfig.hwndStatusBar, SB_SETPARTS, 3,
(LPARAM)iWidths);
if (ppks->hwndSearchControl)
{
SendMessage (ppks->hwndSearchControl, WM_SIZE, wParam,
MAKELPARAM (LOWORD(lParam), ppks->iToolHeight));
InvalidateRect (ppks->hwndSearchControl, NULL, FALSE);
}
if (ppks->hwndToolBar)
{
INT iToolHeight;
iToolHeight = HIWORD(lParam) - s_uStatusBarHeight;
if (iToolHeight > ppks->iToolHeight)
iToolHeight = ppks->iToolHeight;
SetWindowPos (ppks->hwndToolBar, NULL,
0, 0,
LOWORD(lParam),
iToolHeight - TOOLBARYOFFSET,
SWP_NOMOVE|SWP_NOZORDER);
}
return 0;
}
case WM_MOUSEMOVE :
{
RECT rc;
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if (ppks->bGroupsVisible)
{
INT iY, iVSize, iYGrab;
iY = HIWORD(lParam);
if (ppks->bGrabbed)
{
GetClientRect (hwnd, &rc);
iVSize = rc.bottom-rc.top;
if (iVSize <= 0) break;
iY = (iVSize-s_uStatusBarHeight-GRABBARHEIGHT) -iY;
if ((iY > 50) && (iY < (iVSize -50)))
{
ppks->iGroupsPercent = (100 * iY) / iVSize;
ppks->iGroupsHeight = iY;
}
ppks->iKeysHeight =
iVSize-ppks->iToolHeight-s_uStatusBarHeight-
ppks->iGroupsHeight-GRABBARHEIGHT;
SetWindowPos (ppks->hwndTreeList, NULL,
0, 0,
rc.right-rc.left,
ppks->iKeysHeight,
SWP_NOMOVE|SWP_NOZORDER);
SetWindowPos (ppks->hwndTreeListGroups, NULL, 0,
iVSize-ppks->iGroupsHeight-s_uStatusBarHeight,
rc.right-rc.left,
ppks->iGroupsHeight,
SWP_NOZORDER);
}
else
{
iYGrab = ppks->iToolHeight+ppks->iKeysHeight;
if ((iY >= iYGrab-2) &&
(iY <= iYGrab+GRABBARHEIGHT+2))
{
ppks->bGrabEnabled = TRUE;
ppks->hCursorOld =
SetCursor (LoadCursor (NULL, IDC_SIZENS));
SetCapture (hwnd);
}
else
{
if (ppks->bGrabEnabled)
{
ppks->bGrabEnabled = FALSE;
SetCursor (ppks->hCursorOld);
ReleaseCapture ();
}
}
}
}
break;
}
case WM_LBUTTONDOWN :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if (ppks->bGrabEnabled)
ppks->bGrabbed = TRUE;
break;
case WM_LBUTTONUP :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if (ppks->bGrabbed)
ppks->bGrabbed = FALSE;
break;
case WM_SYSCOLORCHANGE :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
PostMessage (ppks->hwndTreeList, WM_SYSCOLORCHANGE, 0, 0);
break;
case WM_SETTINGCHANGE :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
if (wParam == SPI_SETWHEELSCROLLLINES)
sUpdateWheelScrollLines (ppks);
else
PostMessage (ppks->hwndTreeList, WM_SYSCOLORCHANGE, 0, 0);
break;
case WM_DRAWITEM :
if (wParam == IDC_STATUSBAR)
{
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
sDrawStatus ((LPDRAWITEMSTRUCT)lParam, ppks);
return TRUE;
}
break;
case WM_COPYDATA :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
sImportData (ppks, (PCOPYDATASTRUCT)lParam);
return TRUE;
case WM_NOTIFY :
ppks = (PGPKEYSSTRUCT*)GetWindowLong (hwnd, GWL_USERDATA);
{
LPNMHDR pnmh = (LPNMHDR) lParam;
// did it come from the keys treelist ?
if (wParam == IDC_TREELISTKEYS)
{
if (pnmh->code == TLN_SELCHANGED)
PGPgmPerformAction (ppks->hGM, GM_UNSELECTALL);
PGPclKeyListDefaultNotificationProc (ppks->hKL, lParam);
switch (pnmh->code) {
case TLN_CONTEXTMENU :
ppks->bGroupsFocused = FALSE;
ppks->uKeySelectionFlags = ((LPNM_TREELIST)lParam)->flags;
PKContextMenu (ppks, hwnd,
((LPNM_TREELIST)lParam)->ptDrag.x,
((LPNM_TREELIST)lParam)->ptDrag.y);
break;
case TLN_SELCHANGED :
ppks->bGroupsFocused = FALSE;
ppks->uKeySelectionFlags = ((LPNM_TREELIST)lParam)->flags;
PKSetToolbarButtonStates (ppks);
break;
case TLN_LISTITEMCLICKED :
if (PKIsActionEnabled (ppks, KM_CERTIFY))
PKPerformAction (ppks, KM_CERTIFY);
break;
case TLN_ITEMDBLCLICKED :
if (PKIsActionEnabled (ppks, KM_PROPERTIES))
PKPerformAction (ppks, KM_PROPERTIES);
break;
case TLN_KEYDOWN :
switch (((TL_KEYDOWN*)lParam)->wVKey) {
case VK_TAB :
if (ppks->bGroupsVisible)
{
SendMessage (ppks->klConfig.hwndStatusBar,
SB_SETTEXT, STATUS_MSG_PANE, (LPARAM)"");
ppks->bGroupsFocused = !ppks->bGroupsFocused;
if (ppks->bGroupsFocused)
SetFocus (ppks->hwndTreeListGroups);
else
SetFocus (ppks->hwndTreeList);
PKSetToolbarButtonStates (ppks);
}
break;
case VK_DELETE :
SendMessage (hwnd, WM_COMMAND, IDM_DELETEKEY, 0);
break;
}
break;
case TLN_BEGINDRAG :
PKEnableDropTarget (ppks->pDropTarget, FALSE);
PKDragAndDrop (ppks);
PKEnableDropTarget (ppks->pDropTarget,
!ppks->bReadOnly && (ppks->uFlags & PK_KEYWINDOW));
break;
case TLN_HELP :
PostMessage (hwnd, WM_COMMAND, IDM_HELPTOPICS, 0);
break;
default :
break;
}
}
// did it come from the group treelist ?
else if (wParam == IDC_TREELISTGROUP)
{
if (pnmh->code == TLN_SELCHANGED)
PKPerformAction (ppks, KM_UNSELECTALL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -