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 + -
显示快捷键?