ptproc.c

来自「PGP8.0源码 请认真阅读您的文件包然后写出其具体功能」· C语言 代码 · 共 1,577 行 · 第 1/3 页

C
1,577
字号
        // Set the text background and foreground colors to the 
        // standard window colors
        text=SetTextColor(di->hDC, GetSysColor(COLOR_MENUTEXT));
        back=SetBkColor(di->hDC, GetSysColor(COLOR_MENU));
	}

	mode = SetBkMode(di->hDC, TRANSPARENT);

	ImageList_Draw(hIml,pmi->uIcon,
			di->hDC,
			di->rcItem.left+4,
			di->rcItem.top+s_uBitmapPos,
			ILD_TRANSPARENT);

	// add the menu margin offset
	di->rcItem.left += GetSystemMetrics(SM_CXMENUCHECK)+12;

	oldhfont = (HFONT)SelectObject(di->hDC, s_hFontMenu);

	// if disabled, draw "etched" text by drawing first
	// in white offset by 1 pixel, then in gray
	if((BOOL)(di->itemState & ODS_DISABLED))
	{
		if (!(BOOL)(di->itemState & ODS_SELECTED))
		{
			SetTextColor (di->hDC, GetSysColor(COLOR_3DHILIGHT));

			di->rcItem.left++;
			di->rcItem.top++;
			di->rcItem.bottom++;
			DrawText(di->hDC,pmi->szString, 
					-1, &di->rcItem, DT_SINGLELINE|DT_VCENTER|DT_LEFT);
			di->rcItem.left--;
			di->rcItem.top--;
			di->rcItem.bottom--;
		}

		SetTextColor (di->hDC, GetSysColor(COLOR_GRAYTEXT));
	}

	// draw the text left aligned and vertically centered
	DrawText(di->hDC,pmi->szString, 
			-1, &di->rcItem, DT_SINGLELINE|DT_VCENTER|DT_LEFT);

	SelectObject(di->hDC, oldhfont);
	SetBkMode(di->hDC, mode);
	SetTextColor(di->hDC, text);
	SetBkColor(di->hDC, back);
}

BOOL InPGPOperation = FALSE;
BOOL bInitingServices = TRUE;

static VOID
sHandlePrefsChange (HWND hwnd)
{
	PGPPrefRef	prefref;
	PGPError	err;

	// handle wipe on delete-related messages
	if ((!PGPclRunningUnderTerminalServer ())&&
		(!bInitingServices)) // WOD has to be initialized first 
		PTHandleWipeOnDeletePrefsMsg(hwnd);

	err=PGPclPeekClientLibPrefRefs(&prefref,NULL);
	if(IsntPGPError(err))
	{
		if (IsntPGPError (PGPGetPrefBoolean (prefref, 
				kPGPPrefShowTrayIcon, &s_bIconEnabled)))
		{
			sUpdateTrayIconAndText (hwnd, FALSE);
		}

		// hotkeys pref handler should be called last
		// since it will close prefs and free prefref
		PTHandleHotKeyPrefsChange(hwnd, PGPsc, prefref);

		// the PGPdisk prefs handler does not follow
		// the rules (i.e. it can invalidate the prefref),
		// so we treat it separately 
		PGPclPeekClientLibPrefRefs(&prefref,NULL);
		PTHandleDiskPrefsChange(hwnd, prefref);
	}
}

void WMCreatePostServiceInit(HWND hwnd)
{
	// perform PGPdisk initialization
	if (PGPdiskExists)
	{
		PTDiskStartup ();
		PTDiskMountStartupDisks (hwnd);
	}

	// start PGPdisk timer to unmount timed-out disks
	if (PGPdiskExists)
		SetTimer(hwnd, PGPDISK_TIMER_ID, PGPDISK_TIMER_MS, NULL);

	// start timer to query passphrase cache every so often,
	// just in case the notifications get out of sync
	SetTimer(hwnd, PGPPASSPHRASE_TIMER_ID, PGPPASSPHRASE_TIMER_MS, NULL);

	// initialize auto update thread
	PTStartAutoUpdater ();

	// load up prefs and set icons
	sHandlePrefsChange (hwnd);
}


static void
sSDKNotificationCallback (
		PGPUserValue			userval,
		PGPNotificationReason	reason,
		PGPUInt32				uParam1,
		PGPUInt32				uParam2)
{
	if (reason == kPGPNotification_PassphraseCacheChanged)
	{
		PostMessage ((HWND)userval, WM_APP, 0, 0);
	}
}


LRESULT CALLBACK EnclyptorProc(HWND hwnd, UINT msg, 
							   WPARAM wParam, LPARAM lParam)
{
	static char HelpFile[MAX_PATH + 1] = "\0";
	static HWND hwndFocus;

	if(!bInitingServices)
	{
		// check for changed prefs
		if(msg == g_uReloadPrefsMsg) 
			sHandlePrefsChange(hwnd);

		// check for hotkey-related messages
		PTCheckForHotKeyMsg(hwnd,PGPsc,msg);

		// check for PGPdisk-related messages
		PTCheckForDiskMsg(hwnd,msg,wParam,lParam);

		if(msg == g_uTaskbarRestart)
			sUpdateTrayIconAndText(hwnd, TRUE);
	}

	if((bInitingServices)&&(msg!=WM_CREATE))
		return DefWindowProc(hwnd, msg, wParam, lParam);

	switch(msg)
	{
		case WM_CREATE:
		{
			PGPclWindowsGenus	genus;

			InitCommonControls();
			sGetMenuFont ();

			// See which menu items to install
			PGPdiskExists=PGPclIsComponentInstalled (kPGPclPGPdisk);
			PGPtoolsExists=PGPclIsComponentInstalled (kPGPclPGPtools);
			PGPkeysExists=PGPclIsComponentInstalled (kPGPclPGPkeys);

			// PGPdisk only in biz and pp versions
/*			if(PGPclIsAuthorized())
			{
				PGPdiskExists=FALSE;
			}*/

			LoadString(g_hinst, IDS_PGPTOOLS, miTools.szString, sizeof(miTools.szString));
			LoadString(g_hinst, IDS_PGPDISK, miDisk.szString, sizeof(miDisk.szString));
			LoadString(g_hinst, IDS_PGPKEYS, miKeys.szString, sizeof(miKeys.szString));

			miKeys.uIcon=IDX_PGPKEYS;
			miTools.uIcon=IDX_PGPTOOLS;
			miDisk.uIcon=IDX_PGPDISK;

			PGPtrayCreateImageLists (&hIml,&hImlHeader,&hImlDiskHeader);

			// Load up default PGPtray icon
			PGPclGetWindowsVersion (NULL, &genus, NULL);
			if (genus == kPGPclWindowsGenusMillenium)
			{
				// Me can display hi-color icons in the system tray,
				g_hIconTrayDefault = 
						LoadImage (g_hinst, MAKEINTRESOURCE(IDI_TRAYICON8),
						IMAGE_ICON, 0, 0, 0);

				g_hIconTrayCached = 
						LoadImage (g_hinst, MAKEINTRESOURCE(IDI_TRAYICONCACHED8),
						IMAGE_ICON, 0, 0, 0);

				s_bDrawDividerLine = TRUE;
			}
			else if (genus >= kPGPclWindowsGenusXp)
			{
				// XP can display > 32-bit icons in the system tray,
				g_hIconTrayDefault = 
						LoadImage (g_hinst, MAKEINTRESOURCE(IDI_TRAYICON32),
						IMAGE_ICON, 0, 0, 0);

				g_hIconTrayCached = 
						LoadImage (g_hinst, MAKEINTRESOURCE(IDI_TRAYICONCACHED32),
						IMAGE_ICON, 0, 0, 0);

				s_bDrawDividerLine = FALSE;
			}
			else
			{
				// otherwise we need to use the 16 color
				g_hIconTrayDefault = 
						LoadImage (g_hinst, MAKEINTRESOURCE(IDI_TRAYICON4),
						IMAGE_ICON, 0, 0, 0);

				g_hIconTrayCached = 
						LoadImage (g_hinst, MAKEINTRESOURCE(IDI_TRAYICONCACHED4),
						IMAGE_ICON, 0, 0, 0);

				s_bDrawDividerLine = TRUE;
			}

			sUpdateTrayIconAndText (hwnd, FALSE);

			// register callback to get passphrase cache change notifications
			PGPSetNotificationCallback (sSDKNotificationCallback, hwnd);

			return 0;
		}

		case WM_APP:
		{
			sUpdateTrayIconAndText (hwnd, FALSE);
			return 0;
		}

		case WM_HOTKEY:
		{
			PTProcessHotKey(hwnd, PGPsc, wParam);
			return TRUE;
		}

		case WM_TIMER :
		{
			switch (wParam)
			{
			case PGPDISK_TIMER_ID:
				PTDiskCheckForTimedOutDisks(hwnd);
				break;

			case PGPPASSPHRASE_TIMER_ID:
				PostMessage (hwnd, WM_APP, 0, 0);
				break;
			}
			return 0;
		}

		case WM_DRAWITEM: 
        {
			DrawMenuItem((LPDRAWITEMSTRUCT)lParam);
			return TRUE;
        }

        case WM_MEASUREITEM:
		{
			MeasureMenuItem((LPMEASUREITEMSTRUCT)lParam);
            return TRUE;
		}

		case WM_QUERYOPEN:
		{
			return 0;
		}

		case WM_USERCHANGED:
		{
			PGPPurgePassphraseCache (PGPsc);
			PGPPurgeKeyDBCache (PGPsc);
			return 0;
		}

		case WM_MENUSELECT:
		{
			return 0;
		}

		case WM_TASKAREA_MESSAGE:
		{
			UINT uID = (UINT) wParam;
			UINT uMouseMsg = (UINT) lParam;

			if(uMouseMsg == WM_RBUTTONDOWN)
			{
				switch(uID)
				{
					case 1:
					{
						PopupTaskbarMenu(hwnd, InPGPOperation);
						return 0;
					}
				}
			}
			else if(uMouseMsg == WM_LBUTTONDOWN)
			{
				switch(uID)
				{
					case 1:
					{
						PopupTaskbarMenu(hwnd, InPGPOperation);
						return 0;
					}
				}
			}
			break;
		}

		case WM_COMMAND:
		{
			// Menu is greyed, but just in case hot keys are sending 
			// messages
			if(InPGPOperation)
				break;

			switch(LOWORD(wParam))
			{
				case ID_PURGECACHES:
				{
					InPGPOperation = TRUE;
					PTProcessHotKey(hwnd, PGPsc, kPurgePassphraseCache);
					InPGPOperation = FALSE;
					break;
				}

				case ID_ENCRYPTCLIPBOARD:
				{
					InPGPOperation = TRUE;
					PGPscEncryptClipboard(hwnd, szApp, PGPsc, PGPtls, TRUE, FALSE, FALSE);
					InPGPOperation = FALSE;
					break;
				}

				case ID_SIGNCLIPBOARD:
				{
					InPGPOperation = TRUE;
					PGPscEncryptClipboard(hwnd, szApp, PGPsc,PGPtls, FALSE, TRUE, FALSE);
					InPGPOperation = FALSE;
					break;
				}

				case ID_ENCRYPTSIGNCLIPBOARD:
				{
					InPGPOperation = TRUE;
					PGPscEncryptClipboard(hwnd, szApp, PGPsc,PGPtls, TRUE, TRUE, FALSE);
					InPGPOperation = FALSE;
					break;
				}

				case ID_DECRYPTVERIFYCLIPBOARD:
				{
					InPGPOperation = TRUE;
					PGPscDecryptClipboard(hwnd, szApp, PGPsc,PGPtls);
					InPGPOperation = FALSE;
					break;
				}

				case ID_ENCRYPTWINDOW:
				{
					BOOL bStartingCR;

					InPGPOperation = TRUE;
					if(PGPscDoCopy(hwnd,PGPsc,TRUE,&hwndFocus,&bStartingCR))
					{
						if(PGPscEncryptClipboard(hwnd, szApp, PGPsc, PGPtls, TRUE, FALSE, bStartingCR))
							PGPscDoPaste(TRUE,hwndFocus);
						else
							PGPscDoFocus(TRUE,hwndFocus);
					}
					InPGPOperation = FALSE;
					break;
				}

				case ID_SIGNWINDOW:
				{
					BOOL bStartingCR;

					InPGPOperation = TRUE;
					if(PGPscDoCopy(hwnd,PGPsc,TRUE,&hwndFocus,&bStartingCR))
					{
						if(PGPscEncryptClipboard(hwnd, szApp, PGPsc,PGPtls, FALSE, TRUE, bStartingCR))
							PGPscDoPaste(TRUE,hwndFocus);
						else
							PGPscDoFocus(TRUE,hwndFocus);
					}
					InPGPOperation = FALSE;
					break;
				}

				case ID_ENCRYPTSIGNWINDOW:
				{
					BOOL bStartingCR;

					InPGPOperation = TRUE;
					if(PGPscDoCopy(hwnd,PGPsc,TRUE,&hwndFocus,&bStartingCR))
					{
						if(PGPscEncryptClipboard(hwnd, szApp, PGPsc,PGPtls, TRUE, TRUE, bStartingCR))
							PGPscDoPaste(TRUE,hwndFocus);
						else
							PGPscDoFocus(TRUE,hwndFocus);
					}
					InPGPOperation = FALSE;
					break;
				}

				case ID_DECRYPTVERIFYWINDOW:
				{
					BOOL bStartingCR;

					InPGPOperation = TRUE;
					if(PGPscDoCopy(hwnd,PGPsc,TRUE,&hwndFocus,&bStartingCR))
					{
						PGPscDecryptClipboard(hwnd, szApp, PGPsc,PGPtls);
						PGPscDoFocus(TRUE,hwndFocus);
					}
					InPGPOperation = FALSE;
					break;
				}

				case ID_ABOUTPGP:
				{
					InPGPOperation = TRUE;
					PGPclHelpAbout (PGPsc, hwnd, NULL, NULL, NULL); 
					InPGPOperation = FALSE;
					break;
				}

				case ID_WIPECLIP:
				{
					InPGPOperation = TRUE;
					PGPscEraseClipboard(hwnd,PGPsc);
					InPGPOperation = FALSE;
					break;
				}
				
				case ID_VIEWCLIPBOARD:
				{
					InPGPOperation = TRUE;
					PGPscClipboardEditor(PGPsc,hwnd);
					InPGPOperation = FALSE;
					break;
				}
	
				case ID_LAUNCHPGPKEYS:
				{
					InPGPOperation = TRUE;
					PGPscDoLaunchKeys(hwnd);
					InPGPOperation = FALSE;
					break;
				}

				case ID_LAUNCHPGPTOOLS:
				{
					InPGPOperation = TRUE;
					PGPscDoLaunchTools(hwnd);
					InPGPOperation = FALSE;
					break;
				}

				case ID_PGPDISKMOUNTDISK:
				{
					InPGPOperation = TRUE;
					PTDiskOperation(hwnd, PGPDISK_MOUNTDISK);
					InPGPOperation = FALSE;
					break;
				}
				
				case ID_PGPDISKNEWDISK:
				{
					InPGPOperation = TRUE;
					PTDiskOperation(hwnd, PGPDISK_NEWDISK);
					InPGPOperation = FALSE;
					break;
				}

				case ID_PGPDISKEDITDISK:
				{
					InPGPOperation = TRUE;
					PTDiskOperation(hwnd, PGPDISK_EDITDISK);
					InPGPOperation = FALSE;
					break;
				}

				case ID_PGPDISKUNMOUNTALL:
				{
					InPGPOperation = TRUE;
					PTDiskOperation(hwnd, PGPDISK_UNMOUNTALL);
					InPGPOperation = FALSE;
					break;
				}

				case ID_PROPERTIES:
				{
					InPGPOperation = TRUE;
					PGPscPreferences(hwnd, PGPsc,PGPtls);
					InPGPOperation = FALSE;
					break;
				}

				case ID_QUIT_ENCLYPTOR:
				{
					InPGPOperation = TRUE;
#if !PGP_DEBUG
					// Hide it
					{
						PGPPrefRef prefref;

						if(IsntPGPError(PGPclPeekClientLibPrefRefs(&prefref,NULL)))
						{
							PGPSetPrefBoolean (prefref,kPGPPrefShowTrayIcon, FALSE);

							PGPclFlushClientLibPrefs (prefref, NULL);
						}
					}
#else
					// Quit it
					if (CheckIfOKToClose(hwnd))
					{
						DWORD	dwVersion;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?