ptproc.c
来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 1,577 行 · 第 1/3 页
C
1,577 行
/*__________________________________________________________________________
Copyright (C) 2002 PGP Corporation
All rights reserved.
$Id: PTproc.c,v 1.96 2002/11/12 18:59:33 pbj Exp $
__________________________________________________________________________*/
#include "precomp.h"
#include "PThotkey.h"
#include "PTnet.h"
#include "PTdisk.h"
#include "PTupdate.h"
#include "pgpWin32IPC.h"
#include "pgpwd.h"
#include <commctrl.h>
#include "pgpUtilities.h"
#include "pgpClientPrefs.h"
#include "pgpNetPrefs.h"
#include "pgpBuild.h"
#include "pgpThreads.h"
#define BITMAP_HEIGHT 16
#define BITMAP_WIDTH 16
#define HEADER_HEIGHT 20
#define HEADER_WIDTH 133
#define HEADER_OFFSET 4
#define DISKHEADER_HEIGHT 30
#define DISKHEADER_WIDTH 109
#define DISKHEADER_OFFSET 4
#define ID_PGPHEADERBITMAP 50001
#define ID_PGPDISKHEADERBITMAP 50002
BOOL PopupTaskbarMenu(HWND hwndTarget, BOOL InPGPOperation);
BOOL PGPdiskExists=FALSE;
BOOL PGPtoolsExists=FALSE;
BOOL PGPkeysExists=FALSE;
HIMAGELIST hIml=NULL;
HIMAGELIST hImlHeader=NULL;
HIMAGELIST hImlDiskHeader=NULL;
static PGPHotKeys s_HotKeys;
static HMENU s_hMenu = NULL;
static HFONT s_hFontMenu = NULL;
static UINT s_uMenuHeight = 0;
static UINT s_uBitmapPos = 0;
static BOOL s_bTaskBarAtTop = FALSE;
static BOOL s_bDrawDividerLine = FALSE;
static PGPBoolean s_bIconEnabled = TRUE;
static BOOL s_bHighColorDisplay = FALSE;
typedef struct
{
char szString[20];
UINT uIcon;
} PGPMENUINFO, *PPGPMENUINFO;
PGPMENUINFO miDisk,miTools,miKeys;
INT
PTMessageBox (
HWND hwnd,
INT iCaption,
INT iText,
UINT uStyle)
{
CHAR szCaption[64];
CHAR szText[384];
LoadString (g_hinst, iCaption, szCaption, sizeof(szCaption));
LoadString (g_hinst, iText, szText, sizeof(szText));
return (MessageBox (hwnd, szText, szCaption, uStyle));
}
BOOL CheckForExistanceOfEXE(char *szEXEname)
{
char szEXEPath[MAX_PATH];
FILE *ftest;
PGPscPGPpath(szEXEPath);
strcat(szEXEPath,szEXEname);
ftest=fopen(szEXEPath,"rb");
if(ftest!=NULL)
{
fclose(ftest);
return TRUE;
}
return FALSE;
}
BOOL CheckIfOKToClose(HWND hwnd)
{
INT ids;
if (PGPclIsComponentInstalled(kPGPclOutlookExpressPlugin))
ids = IDS_CHECKIFOKTOCLOSEOE;
else
ids = IDS_CHECKIFOKTOCLOSE;
if (PTMessageBox(hwnd, IDS_CAPTION, ids,
MB_OKCANCEL|MB_ICONEXCLAMATION) == IDOK)
return TRUE;
else
return FALSE;
}
static void sGetMenuFont (void)
{
NONCLIENTMETRICS ncmetrics;
ncmetrics.cbSize = sizeof (ncmetrics);
SystemParametersInfo (SPI_GETNONCLIENTMETRICS, 0, &ncmetrics, 0);
s_uMenuHeight = abs (ncmetrics.lfMenuFont.lfHeight) + 8;
s_uBitmapPos = (s_uMenuHeight - BITMAP_HEIGHT) >> 1;
s_hFontMenu = CreateFontIndirect (&ncmetrics.lfMenuFont);
}
// ________________________
//
// append the hotkey keystroke combo to the menu item
static VOID
sSetPurgeMenuItemState (
HMENU hMenu)
{
MENUITEMINFO mii;
UINT iState = MFS_DISABLED;
PGPUInt32 uLocal, uGlobal, uLocalOther;
if (PGPsc)
{
if (IsntPGPError (PGPCountCachedPassphrases (
PGPsc, &uLocal, &uGlobal, &uLocalOther)))
{
if ((uLocal + uGlobal + uLocalOther) > 0)
iState = MFS_ENABLED;
}
}
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_STATE;
mii.fType = MFT_STRING;
mii.fState = iState;
SetMenuItemInfo (hMenu, ID_PURGECACHES, FALSE, &mii);
}
// ________________________
//
// append the hotkey keystroke combo to the menu item
static VOID
sSetHotKeyText (
HMENU hMenu,
INT id,
PGPUInt32 hotkey)
{
CHAR sz1[128];
CHAR sz2[16];
MENUITEMINFO mii;
ULONG uKey;
PGPUInt32 uTotal = 0;
PGPUInt32 uLocal, uGlobal, uLocalOther;
if (!(hotkey & kPGPHotKeyEnabled))
return;
// we can't handle non-ASCII hotkeys (which shouldn't exist anyway),
// so just in case we abort
if (hotkey & 0x0000FF00)
return;
// if this is the "purge caches" menu item, then enable/disable on basis
// of cache state
// check if passphrases are cached and update tray icon accordingly
if (PGPsc)
{
if (IsntPGPError (PGPCountCachedPassphrases (
PGPsc, &uLocal, &uGlobal, &uLocalOther)))
{
uTotal = uLocal + uGlobal + uLocalOther;
}
}
mii.cbSize = sizeof(mii);
mii.fMask = MIIM_TYPE;
mii.fType = MFT_STRING;
mii.dwTypeData = sz1;
mii.cch = sizeof(sz1)/2;
// get required size of buffer
if (GetMenuItemInfo (hMenu, id, FALSE, &mii))
{
lstrcat (sz1, "\t");
if (hotkey & kPGPHotKeyCtrlModifier)
{
LoadString (g_hinst, IDS_HOTKEYCONTROL, sz2, sizeof(sz2));
lstrcat (sz1, sz2);
}
if (hotkey & kPGPHotKeyShiftModifier)
{
LoadString (g_hinst, IDS_HOTKEYSHIFT, sz2, sizeof(sz2));
lstrcat (sz1, sz2);
}
if (hotkey & kPGPHotKeyAltModifier)
{
LoadString (g_hinst, IDS_HOTKEYALT, sz2, sizeof(sz2));
lstrcat (sz1, sz2);
}
uKey = hotkey & 0x0000FFFF;
uKey = MapVirtualKey (uKey, 0);
uKey <<= 16;
GetKeyNameText (uKey, sz2, sizeof(sz2));
lstrcat (sz1, sz2);
SetMenuItemInfo (hMenu, id, FALSE, &mii);
}
}
// ________________________
//
// Get icon and tooltip text based on passphrase cache status
static HICON
sGetIconAndText (
HWND hwnd,
LPSTR psz,
UINT uLen)
{
PGPUInt32 uTotal = 0;
PGPUInt32 uLocal, uGlobal, uLocalOther;
// check if passphrases are cached and update tray icon accordingly
if (PGPsc)
{
if (IsntPGPError (PGPCountCachedPassphrases (
PGPsc, &uLocal, &uGlobal, &uLocalOther)))
{
uTotal = uLocal + uGlobal + uLocalOther;
}
}
if (uTotal == 0)
{
LoadString (g_hinst, IDS_SZAPP, psz, uLen);
return g_hIconTrayDefault;
}
else
{
LoadString (g_hinst, IDS_SZAPPCACHED, psz, uLen);
return g_hIconTrayCached;
}
}
//_________________________________________
//
// update system tray icon
static BOOL
sUpdateTrayIconAndText (
HWND hwnd,
BOOL bForceAddIcon)
{
BOOL result;
NOTIFYICONDATA nid;
CHAR sz[128];
static BOOL bIconIsVisible = FALSE;
memset (&nid, 0x00, sizeof(NOTIFYICONDATA));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hwnd;
nid.uID = TASKBAR_TRAY_ID;
nid.uFlags = NIF_ICON | NIF_TIP;
if (s_bIconEnabled)
{
nid.hIcon = sGetIconAndText (hwnd, sz, sizeof(sz));
lstrcpy (nid.szTip, sz);
if (bIconIsVisible && !bForceAddIcon)
result = Shell_NotifyIcon (NIM_MODIFY, &nid);
else
{
nid.uCallbackMessage = WM_TASKAREA_MESSAGE;
nid.uFlags |= NIF_MESSAGE;
result = Shell_NotifyIcon (NIM_ADD, &nid);
if (result)
bIconIsVisible = TRUE;
}
}
else
{
if (bIconIsVisible)
{
result = Shell_NotifyIcon (NIM_DELETE, &nid);
bIconIsVisible = FALSE;
}
}
return result;
}
void PGPtrayCreateImageLists(
HIMAGELIST *hIml,
HIMAGELIST *hImlHeader,
HIMAGELIST *hImlDiskHeader)
{
int iNumBits;
HDC hDC;
HBITMAP hBmp;
// ImageList Init
hDC = GetDC (NULL); // DC for desktop
iNumBits = GetDeviceCaps (hDC, BITSPIXEL) * GetDeviceCaps (hDC, PLANES);
ReleaseDC (NULL, hDC);
if (iNumBits <= 8) {
s_bHighColorDisplay = FALSE;
*hIml = ImageList_Create (
BITMAP_WIDTH, BITMAP_HEIGHT,
ILC_COLOR|ILC_MASK, NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hinst, MAKEINTRESOURCE (IDB_EXEBITMAP4BIT));
ImageList_AddMasked (*hIml, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
*hImlHeader = ImageList_Create (
HEADER_WIDTH, HEADER_HEIGHT,
ILC_COLOR|ILC_MASK, 1, 0);
hBmp = LoadBitmap (g_hinst, MAKEINTRESOURCE (IDB_HEADER4));
ImageList_AddMasked (*hImlHeader, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
*hImlDiskHeader = ImageList_Create (
DISKHEADER_WIDTH, DISKHEADER_HEIGHT,
ILC_COLOR|ILC_MASK, 1, 0);
hBmp = LoadBitmap (g_hinst, MAKEINTRESOURCE (IDB_DISKHEADER4));
ImageList_AddMasked (*hImlDiskHeader, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
}
else {
s_bHighColorDisplay = TRUE;
*hIml = ImageList_Create (
BITMAP_WIDTH, BITMAP_HEIGHT,
ILC_COLOR24|ILC_MASK, NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hinst, MAKEINTRESOURCE (IDB_EXEBITMAP24BIT));
ImageList_AddMasked (*hIml, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
*hImlHeader = ImageList_Create (
HEADER_WIDTH, HEADER_HEIGHT,
ILC_COLOR24|ILC_MASK, NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hinst, MAKEINTRESOURCE (IDB_HEADER24));
ImageList_AddMasked (*hImlHeader, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
*hImlDiskHeader = ImageList_Create (
DISKHEADER_WIDTH, DISKHEADER_HEIGHT,
ILC_COLOR24|ILC_MASK, NUM_BITMAPS, 0);
hBmp = LoadBitmap (g_hinst, MAKEINTRESOURCE (IDB_DISKHEADER24));
ImageList_AddMasked (*hImlDiskHeader, hBmp, RGB(255, 0, 255));
DeleteObject (hBmp);
}
}
void MeasureMenuItem(LPMEASUREITEMSTRUCT mi)
{
// create the font we will use for the title
HFONT oldhfont;
HDC hdc;
SIZE size;
PPGPMENUINFO pmi;
if (mi->itemID == ID_PGPHEADERBITMAP)
{
PGPHotKeys* phks;
mi->itemHeight = HEADER_HEIGHT + HEADER_OFFSET;
// if hotkey text is displayed, then menu gets too wide,
// so we compensate here
phks = PTGetHotKeyStruct ();
if (phks->hotkeyPurgePassphraseCache & kPGPHotKeyEnabled)
mi->itemWidth = 10;
else
mi->itemWidth = HEADER_WIDTH - GetSystemMetrics(SM_CXMENUCHECK) -12;
return;
}
if (mi->itemID == ID_PGPDISKHEADERBITMAP)
{
mi->itemHeight = DISKHEADER_HEIGHT + DISKHEADER_OFFSET;
mi->itemWidth = DISKHEADER_WIDTH - GetSystemMetrics(SM_CXMENUCHECK) -12;
return;
}
pmi=(PPGPMENUINFO)mi->itemData;
hdc=GetDC(NULL);
oldhfont=SelectObject(hdc,s_hFontMenu);
GetTextExtentPoint32(hdc,pmi->szString,strlen(pmi->szString),&size);
SelectObject(hdc,oldhfont);
// add in the left margin for the menu item
size.cx += GetSystemMetrics(SM_CXMENUCHECK)+12;
// return the width and height
mi->itemWidth = size.cx;
mi->itemHeight = s_uMenuHeight;
}
void DrawMenuItem(LPDRAWITEMSTRUCT di)
{
// create the font we will use for the title
HFONT oldhfont;
HBRUSH hbgb;
int mode;
COLORREF text,back;
PPGPMENUINFO pmi;
RECT rc;
pmi=(PPGPMENUINFO)di->itemData;
if (di->itemID == ID_PGPHEADERBITMAP)
{
hbgb = CreateSolidBrush(GetSysColor(COLOR_MENU));
FillRect(di->hDC, &di->rcItem, hbgb);
DeleteObject(hbgb);
if (s_bDrawDividerLine)
{
rc = di->rcItem;
if (s_bTaskBarAtTop)
rc.top += (HEADER_OFFSET -2);
else
rc.bottom -= (HEADER_OFFSET -2);
DrawEdge (di->hDC, &rc, EDGE_ETCHED, BF_BOTTOM);
}
if (s_bHighColorDisplay)
hbgb = CreateSolidBrush(RGB(176,170,142));
else
hbgb = GetStockObject(LTGRAY_BRUSH);
rc = di->rcItem;
if (s_bTaskBarAtTop)
rc.top += HEADER_OFFSET;
else
rc.bottom -= HEADER_OFFSET;
FillRect(di->hDC, &rc, hbgb);
DeleteObject(hbgb);
ImageList_Draw(hImlHeader,0,
di->hDC,
rc.left,
rc.top,
ILD_TRANSPARENT);
return;
}
if (di->itemID == ID_PGPDISKHEADERBITMAP)
{
hbgb = CreateSolidBrush(GetSysColor(COLOR_MENU));
FillRect(di->hDC, &di->rcItem, hbgb);
DeleteObject(hbgb);
if (s_bDrawDividerLine)
{
rc = di->rcItem;
if (s_bTaskBarAtTop)
rc.top += (HEADER_OFFSET -2);
else
rc.bottom -= (HEADER_OFFSET -2);
DrawEdge (di->hDC, &rc, EDGE_ETCHED, BF_BOTTOM);
}
if (s_bHighColorDisplay)
hbgb = CreateSolidBrush(RGB(176,170,142));
else
hbgb = GetStockObject(LTGRAY_BRUSH);
rc = di->rcItem;
rc.bottom -= HEADER_OFFSET;
FillRect(di->hDC, &rc, hbgb);
DeleteObject(hbgb);
ImageList_Draw(hImlDiskHeader,0,
di->hDC,
di->rcItem.left,
di->rcItem.top,
ILD_TRANSPARENT);
return;
}
if((BOOL)(di->itemState & ODS_SELECTED))
{
hbgb = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
FillRect(di->hDC, &di->rcItem, hbgb);
DeleteObject(hbgb);
// Set the text background and foreground colors
text=SetTextColor(di->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
back=SetBkColor(di->hDC, GetSysColor(COLOR_HIGHLIGHT));
}
else
{
hbgb = CreateSolidBrush(GetSysColor(COLOR_MENU));
FillRect(di->hDC, &di->rcItem, hbgb);
DeleteObject(hbgb);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?