ctxmenu.cpp

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

CPP
1,608
字号
	++ItemInfo.wID;
	strcpy(MText, "&Encrypt");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	++ItemInfo.wID;
	strcpy(MText, "&Sign");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	++ItemInfo.wID;
	strcpy(MText, "E&ncrypt && Sign");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	ItemInfo.fType=MFT_SEPARATOR ;
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);
	ItemInfo.fType = MFT_STRING;

	++ItemInfo.wID;
	strcpy(MText, "D&ecrypt && Verify");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	ItemInfo.fType=MFT_SEPARATOR ;
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);
	ItemInfo.fType = MFT_STRING;

	++ItemInfo.wID;
	strcpy(MText, "&Wipe");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	ItemInfo.fType=MFT_SEPARATOR ;
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);
	ItemInfo.fType = MFT_STRING;

	++ItemInfo.wID;
	strcpy(MText, "&Create SDA");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	SubMenuItems = 7;
}

void CShellExt::CreateVolumeMenu(UINT idCmdFirst)
{
	MENUITEMINFO ItemInfo;
	char MText[64];

	ItemInfo.cbSize = sizeof ItemInfo;
	ItemInfo.wID = idCmdFirst;
	ItemInfo.hSubMenu = NULL;
	ItemInfo.hbmpChecked = NULL;
	ItemInfo.hbmpUnchecked = NULL;
	ItemInfo.dwItemData = 0;
	ItemInfo.dwTypeData = MText;
	ItemInfo.cch = 0;

	strcpy(SubMenuType, "Volume");
	hSubMenu = CreatePopupMenu();

	ItemInfo.fType = MFT_STRING;
	ItemInfo.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID;
	ItemInfo.fState = MFS_ENABLED;		// for command lines

	++ItemInfo.wID;
	strcpy(MText, "&Encrypt");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	++ItemInfo.wID;
	strcpy(MText, "&Sign");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	++ItemInfo.wID;
	strcpy(MText, "E&ncrypt && Sign");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	ItemInfo.fType=MFT_SEPARATOR ;
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);
	ItemInfo.fType = MFT_STRING;

	++ItemInfo.wID;
	strcpy(MText, "D&ecrypt && Verify");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	ItemInfo.fType=MFT_SEPARATOR ;
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);
	ItemInfo.fType = MFT_STRING;

	++ItemInfo.wID;
	strcpy(MText, "&Wipe Free Space");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	ItemInfo.fType=MFT_SEPARATOR ;
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);
	ItemInfo.fType = MFT_STRING;

	++ItemInfo.wID;
	strcpy(MText, "&Create SDA");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	SubMenuItems = 7;
}

void CShellExt::CreatePlaintextMenu(UINT idCmdFirst)
{
	MENUITEMINFO ItemInfo;
	char MText[64];

	ItemInfo.cbSize = sizeof ItemInfo;
	ItemInfo.wID = idCmdFirst;
	ItemInfo.hSubMenu = NULL;
	ItemInfo.hbmpChecked = NULL;
	ItemInfo.hbmpUnchecked = NULL;
	ItemInfo.dwItemData = 0;
	ItemInfo.dwTypeData = MText;
	ItemInfo.cch = 0;

	strcpy(SubMenuType, "Plaintext");
	hSubMenu = CreatePopupMenu();

	ItemInfo.fType = MFT_STRING;
	ItemInfo.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID;
	ItemInfo.fState = MFS_ENABLED;		// for command lines

	++ItemInfo.wID;
	strcpy(MText, "&Encrypt");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	++ItemInfo.wID;
	strcpy(MText, "&Sign");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	++ItemInfo.wID;
	strcpy(MText, "E&ncrypt && Sign");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	ItemInfo.fType=MFT_SEPARATOR ;
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);
	ItemInfo.fType = MFT_STRING;

	++ItemInfo.wID;
	strcpy(MText, "&Wipe");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	ItemInfo.fType=MFT_SEPARATOR ;
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);
	ItemInfo.fType = MFT_STRING;

	++ItemInfo.wID;
	strcpy(MText, "&Create SDA");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	SubMenuItems = 6;
}

void CShellExt::CreatePGPdiskMenu(UINT idCmdFirst)
{
	MENUITEMINFO ItemInfo;
	char MText[64];

	ItemInfo.cbSize = sizeof ItemInfo;
	ItemInfo.wID = idCmdFirst;
	ItemInfo.hSubMenu = NULL;
	ItemInfo.hbmpChecked = NULL;
	ItemInfo.hbmpUnchecked = NULL;
	ItemInfo.dwItemData = 0;
	ItemInfo.dwTypeData = MText;
	ItemInfo.cch = 0;

	strcpy(SubMenuType, "PGPdisk");
	hSubMenu = CreatePopupMenu();

	ItemInfo.fType = MFT_STRING;
	ItemInfo.fMask = MIIM_TYPE | MIIM_STATE | MIIM_ID;
	ItemInfo.fState = MFS_ENABLED;

	++ItemInfo.wID;

	if (m_NumFiles > 1)
		strcpy(MText, "&Mount/Unmount PGPdisks...");
	else if (m_IsMountedDisk)
		strcpy(MText, "&Unmount PGPdisk...");
	else
		strcpy(MText, "&Mount PGPdisk...");

	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	++ItemInfo.wID;

	if (m_NumFiles > 1)
		ItemInfo.fState = MFS_ENABLED;

	strcpy(MText, "&Edit PGPdisk...");
	InsertMenuItem(hSubMenu, 0xffffffff, TRUE, &ItemInfo);

	SubMenuItems = 3;
}
/*
LRESULT CALLBACK ShellProc(HWND hwnd, UINT msg,
							   WPARAM wParam, LPARAM lParam)
{
	// See if user deselects caching via prefs
	PGPscCheckForPurge(msg,wParam);

	switch(msg)
	{
		case WM_CREATE:
		{
			ShowWindow(hwnd, SW_HIDE);
			return 0;
		}
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}

#define szAppName "PGPshell_HiddenWindow"

HWND ShellWindow(void)
{
	HWND hwnd;
	WNDCLASS wc;

	// Register the Server Window Class

	wc.style			= 0;
	wc.lpfnWndProc		= ShellProc;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	wc.hInstance		= g_hmodThisDll;
	wc.hIcon			= 0;
	wc.hCursor			= 0;
	wc.hbrBackground	= 0;
	wc.lpszMenuName		= 0;
	wc.lpszClassName	= szAppName;

	RegisterClass(&wc);

	hwnd = CreateWindow(
		szAppName, szAppName, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, NULL, NULL, g_hmodThisDll, NULL );

	return hwnd;
}
*/
HRESULT CallPGP(STGMEDIUM *pMedium, UINT ActionCode)
{
	int i;
	UINT ReturnCode;
	HWND hwnd;
	int NumFiles;
	BOOL bEncrypt,bSign;
	char szFile[MAX_PATH+1];
	FILELIST *ListHead;

	strcpy(szApp,"PGPshell");

	ReturnCode=TRUE;

	if(PGPsc==0)
	{
		return(ReturnCode);
	}

	hwnd = GetForegroundWindow();

	NumFiles = DragQueryFile((HDROP) pMedium->hGlobal, (UINT)-1, 0, 0);

	if(NumFiles==0)
		return(ReturnCode);

	ReturnCode=TRUE;
	bEncrypt=bSign=FALSE;

	if(ActionCode==PGP_CODE_ENCRYPT)
		bEncrypt = TRUE;

	if(ActionCode==PGP_CODE_SIGN)
		bSign = TRUE;

	if(ActionCode==PGP_CODE_ENCRYPT_SIGN)
		bEncrypt = bSign = TRUE;

	if ((ActionCode==PGP_CODE_ENCRYPT)||
		(ActionCode==PGP_CODE_SIGN)   ||
		(ActionCode==PGP_CODE_ENCRYPT_SIGN))
	{
		ListHead=0;

		for(i=0;i<NumFiles && ReturnCode == TRUE;i++)
		{
			DragQueryFile((HDROP) pMedium->hGlobal,
                         i,szFile,MAX_PATH);
			PGPscAddToFileList(&ListHead,szFile,NULL,NULL);
		}

		ReturnCode = PGPscEncryptFileList(hwnd,szApp,PGPsc,PGPtls,
			ListHead,
			bEncrypt,
			bSign);
	}

	if (ActionCode==PGP_CODE_CREATE_SDA)
	{
		ListHead=0;

		for(i=0;i<NumFiles && ReturnCode == TRUE;i++)
		{
			DragQueryFile((HDROP) pMedium->hGlobal,
                         i,szFile,MAX_PATH);
			PGPscAddToFileList(&ListHead,szFile,NULL,NULL);
		}

		ReturnCode = PGPscCreateSDAFileList(hwnd,szApp,PGPsc,PGPtls,
			ListHead);
	}

	if((ActionCode==PGP_CODE_DECRYPT)||
	   (ActionCode==PGP_CODE_VERIFY_SIG)||
	   (ActionCode==PGP_CODE_VERIFY))
	{
		ListHead=0;

		for(i=0;i<NumFiles && ReturnCode == TRUE;i++)
		{
			DragQueryFile((HDROP) pMedium->hGlobal,
                          i,szFile,MAX_PATH);
			PGPscAddToFileList(&ListHead,szFile,NULL,NULL);
		}

		ReturnCode = PGPscDecryptFileList(hwnd,szApp,PGPsc,PGPtls,
			ListHead);
	}

	if(ActionCode==PGP_CODE_WIPE)
	{
		DWORD FileAttr;

		ListHead=0;

		for(i=0;i<NumFiles && ReturnCode == TRUE;i++)
		{
			DragQueryFile((HDROP) pMedium->hGlobal,
				i,szFile,MAX_PATH);

			FileAttr = GetFileAttributes(szFile);

			if (FileAttr == 0xFFFFFFFF)
				;
			else if (FileAttr & FILE_ATTRIBUTE_SYSTEM)
				;
			else if (FileAttr & FILE_ATTRIBUTE_READONLY)
				;
			else
				PGPscAddToFileList(&ListHead,szFile,NULL,NULL);
		}

		ReturnCode = PGPscWipeFileList(hwnd,PGPsc,
			ListHead,WIPE_DEFAULT,0);
	}

	if(ActionCode==PGP_CODE_WIPEFREESPACE)
	{
		for(i=0;i<NumFiles && ReturnCode == TRUE;i++)
		{
			DragQueryFile((HDROP) pMedium->hGlobal,
				i,szFile,MAX_PATH);

			if(strlen(szFile)<=3)
			{
				ReturnCode=PGPscFreeSpaceWipeCmdLine(hwnd,PGPsc,szFile,0,FALSE);
			}
		}
	}

	if ((ActionCode == PGP_CODE_MNTUNMNT_DISK) ||
		(ActionCode == PGP_CODE_EDIT_DISK))
	{
		for	(i=0;i<NumFiles && ReturnCode == TRUE;i++)
		{
			BOOL	isMounted, isPGPdisk;

			DragQueryFile((HDROP) pMedium->hGlobal,
				i,szFile,MAX_PATH);

			MNdiskIsPathPGPdisk(szFile, &isPGPdisk, &isMounted);

			if (isPGPdisk)
			{
				if (ActionCode == PGP_CODE_EDIT_DISK)
					MNdiskEditPGPdisk(szFile, hwnd);
				else if (isMounted)
					MNdiskUnmountPGPdisk(szFile, hwnd);
				else
					MNdiskMountPGPdisk(szFile, hwnd);
			}
		}
	}

	// This is done because the start menu doesn't work if
	// the current directory gets set to a directory that
	// the user moves to the recycling bin in Win98. The user
	// won't move SYSTEM, hopefully...
	GetWindowsDirectory(szFile,MAX_PATH);
	SetCurrentDirectory(szFile);

	ReleaseStgMedium(pMedium);

	return ReturnCode;
}

BOOL CShellExt::AddMenuSeparator(HMENU hMenu, int iPosition)
{
	MENUITEMINFO MenuItemInfo;
	BOOL		 bRC;

	MenuItemInfo.cbSize = sizeof(MENUITEMINFO);
	MenuItemInfo.fMask  = MIIM_TYPE;
	MenuItemInfo.fType  = MFT_SEPARATOR;

	bRC = InsertMenuItem(hMenu,
			  				   iPosition,
							   TRUE,
							   &MenuItemInfo);

	if (!bRC) {
		// wow, we couldn't add the separator after Send To...
		ODS("Insert Separator failed...\r\n");
		return FALSE;
	}
	return TRUE;
}

int CShellExt::FindMenuItem(HMENU hMenu, const char *itemName)
{
	int		iMenuItemCount = GetMenuItemCount(hMenu);
	TCHAR	szStringInfo[255];

	for (int i = 0; i < iMenuItemCount; i++) {

		MENUITEMINFO	MenuItemInfo;
		memset(&MenuItemInfo, 0, sizeof(MenuItemInfo));

		MenuItemInfo.cbSize		= sizeof(MENUITEMINFO);
		MenuItemInfo.fMask		= MIIM_TYPE;
		MenuItemInfo.dwTypeData	= szStringInfo;
		MenuItemInfo.cch		= sizeof(szStringInfo);

		if (GetMenuItemInfo(hMenu, i, TRUE, &MenuItemInfo)) {
			if (MenuItemInfo.fType == MFT_STRING) {
				if (!stricmp(MenuItemInfo.dwTypeData, itemName)) {
					// found item

					return i;
				}
			}
		}
	}

	return -1;
}

BOOL CShellExt::InsertSubMenu(
	HMENU		hMenu,
	const char	*menuText,
	int			*pIPosition)
{
	int		iMenuItemCount = GetMenuItemCount(hMenu);
	int		iStartPos = *pIPosition;
	TCHAR	szStringInfo[255];

	*pIPosition = -1;

	// look for following separator
	for (int j = iStartPos+1; j < iMenuItemCount; j++) {

		MENUITEMINFO	MenuItemInfo;
		memset(&MenuItemInfo, 0, sizeof(MenuItemInfo));

		MenuItemInfo.cbSize		= sizeof(MENUITEMINFO);
		MenuItemInfo.fMask		= MIIM_TYPE | MIIM_DATA;
		MenuItemInfo.dwTypeData	= szStringInfo;
		MenuItemInfo.cch		= sizeof(szStringInfo);

		if (GetMenuItemInfo(hMenu, j, TRUE, &MenuItemInfo)) {
			if (MenuItemInfo.fType == MFT_SEPARATOR) {
				*pIPosition = j+1;
				break;
			}
		}
	}

	if (*pIPosition == -1) {
// no end separator was found, just previous item, so add a separator
		AddMenuSeparator(hMenu, iStartPos+1);
		*pIPosition= iStartPos+2;
	}

	return InsertMenu(hMenu, *pIPosition, MF_STRING | MF_BYPOSITION |
			MF_POPUP, (UINT)hSubMenu, menuText);
}

LRESULT CALLBACK InvisiProc(HWND hwnd, UINT msg,
							WPARAM wParam, LPARAM lParam)
{
	switch(msg)
	{
		case WM_CREATE:
		{
			return 0;
		}

		case WM_QUERYOPEN:
		{
			return 0;
		}

#if 0
		case WM_CLOSE:
		{
			PostQuitMessage(0);

			return 0;
		}
#endif
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}


/*__Editor_settings____

	Local Variables:
	tab-width: 4
	End:
	vi: ts=4 sw=4
	vim: si
_____________________*/

⌨️ 快捷键说明

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