icqsend.c

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

C
495
字号
/*__________________________________________________________________________
 Copyright (C) 2002 PGP Corporation
 All rights reserved.
 
 $Id: ICQsend.c,v 1.17 2002/08/06 20:09:42 dallen Exp $
__________________________________________________________________________*/
#include "precomp.h"

// All this just because of ICQ's stupid control-return hotkey...
LRESULT CALLBACK 
GetMsgHookProc (
		INT		iCode, 
		WPARAM	wParam, 
		LPARAM	lParam) 
{ 
	MSG *s=(MSG *) lParam;

	switch(s->message)
	{
		case WM_CHAR:
		case WM_KEYDOWN:
		case WM_KEYUP:
		{
			if(s->wParam==VK_RETURN)
			{
				if (GetAsyncKeyState(VK_CONTROL)<0)
				{
					HWND hwndEdit,hwndTest;

					hwndTest=s->hwnd;

					while(hwndTest!=NULL)
					{
						hwndEdit=hwndTest;
						hwndTest=GetParent(hwndEdit);
					}

					if((hwndEdit!=NULL)&&(s->message==WM_KEYUP))
					{
						PPLUGININFO plugin;
						WNDPROC lpOldProc;

						lpOldProc = (WNDPROC)GetProp( hwndEdit, "oldproc" );

						if(lpOldProc!=NULL)
						{
							// This must be a PGP subclassed window
							plugin=GetPluginInfo(hwndEdit);

							if(plugin!=NULL)
								PostMessage(plugin->hwndMain,WM_COMMAND,(WPARAM)plugin->SendID,(LPARAM)0);
						}
					}

					s->wParam=' ';
				}
			}
			break;
		}
	}

	return 0;
} 

void InitGetMessageHook(HHOOK* phhookGetMessage)
{
	DWORD dwPhraseThreadID;

	dwPhraseThreadID = GetCurrentThreadId ();

	*phhookGetMessage = SetWindowsHookEx (WH_GETMESSAGE , 
		GetMsgHookProc, 
		NULL, dwPhraseThreadID);
}

void UninitGetMessageHook(HHOOK hhookGetMessage)
{
	UnhookWindowsHookEx (hhookGetMessage);
}

LRESULT CALLBACK SendMessageWndProc(HWND hDlg, 
							 UINT msg,
							 WPARAM wParam, 
							 LPARAM lParam)
{
	WNDPROC lpOldProc;
	PPLUGININFO Plugin;

	lpOldProc = (WNDPROC)GetProp( hDlg, "oldproc" );
	Plugin=GetPluginInfo(hDlg);

	if(Plugin->bInitDone)
	{
		char szUserID[256];
		BOOL bEncrypt;

		// WM_CREATE has finished making the window
		// All text fields should be filled in. Get the
		// ICQ number and depress the toolbar button.
		Plugin->bInitDone=FALSE;

		GetWindowText(Plugin->hwndICQ,Plugin->szICQ,256);

		if(UserHasState(g_userstate,
				  Plugin->szICQ,
				  &bEncrypt))
		{
			if(bEncrypt)
			{
				Plugin->bEncrypt=TRUE;

				SendMessage(Plugin->hwndToolbar,TB_SETSTATE,
					(WPARAM)IDC_ENCRYPT,
					(LPARAM)MAKELONG(TBSTATE_CHECKED|TBSTATE_ENABLED, 0));
			}
		}
		else
		{
			sprintf(szUserID,"<ICQ:%s>",Plugin->szICQ);

//		MessageBox(Plugin->hwndCurrent,
//			szUserID,"ICQ check",MB_OK|MB_SETFOREGROUND);

			if(CheckForICQMatch(Plugin->hwndCurrent,PGPsc,PGPtls,szUserID))
			{
				if(CheckForICQUserID(Plugin->hwndCurrent,PGPsc,PGPtls))
				{
					Plugin->bEncrypt=TRUE;

					SendMessage(Plugin->hwndToolbar,TB_SETSTATE,
						(WPARAM)IDC_ENCRYPT,
						(LPARAM)MAKELONG(TBSTATE_CHECKED|TBSTATE_ENABLED, 0));
				}
			}
		}
	}
	
	switch(msg)
	{
		case WM_SHOWWINDOW:
		{
			Plugin->bInitDone=TRUE;
			break;
		}

		case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
				case IDC_PGPKEYS: // send key
				{
					BOOL bOK;

					bOK=FALSE;

					if(CheckForICQUserID(Plugin->hwndCurrent,PGPsc,PGPtls))
					{
						bOK=TRUE;
					}
					else
					{
						if(ICQWizard(Plugin->hwndCurrent,PGPsc,PGPtls))
						{
							bOK=TRUE;
						}
					}

					if(bOK)
					{
						void *pOutput;

						pOutput=ExportICQUserID(hDlg,PGPsc,PGPtls);

						if(pOutput==NULL)
						{
							return 0;
						}
						else
						{
							SetWindowText(Plugin->hwndRichEdit,pOutput);

							memset(pOutput,0x00,strlen(pOutput));
							PGPFreeData(pOutput);
							pOutput=NULL;

							// Fake send
							wParam=Plugin->SendID;

							// Reset the encrypt button in case ICQ
							// doesn't actually send it
							SendMessage(Plugin->hwndToolbar,TB_SETSTATE,
								(WPARAM)IDC_ENCRYPT,
								(LPARAM)MAKELONG(TBSTATE_ENABLED, 0));
							Plugin->bEncrypt=FALSE;
						}
						break;
					}
				}
			}

			if(LOWORD(wParam)==Plugin->SendID)
			{
				/*
				if(Plugin->bSendKey)
				{
					void *pOutput;

					pOutput=ExportICQUserID(hDlg,PGPsc,PGPtls);

					if(pOutput==NULL)
					{
						return 0;
					}
					else
					{
						SetWindowText(Plugin->hwndRichEdit,pOutput);

						memset(pOutput,0x00,strlen(pOutput));
						PGPFreeData(pOutput);
						pOutput=NULL;
					}
				}
				else */
				if(Plugin->bEncrypt)
				{
					if(!EncryptRichEdit(Plugin))
						return 0;

					// Reset the encrypt button in case ICQ
					// doesn't actually send it (& disable)
					SendMessage(Plugin->hwndToolbar,TB_SETSTATE,
						(WPARAM)IDC_ENCRYPT,
						(LPARAM)MAKELONG(0,0)); //TBSTATE_ENABLED, 0));
					Plugin->bEncrypt=FALSE;
				}
				break;
			}
			break;
		}

		case WM_GETMINMAXINFO:
		{
			LPMINMAXINFO lpmmi;

			// Let ICQ set it first
			CallWindowProc(lpOldProc, hDlg, msg, wParam, lParam);

			lpmmi = (LPMINMAXINFO) lParam;

			// Lets see if we need to adjust it
			if(lpmmi->ptMinTrackSize.x<480)
			{
				lpmmi->ptMinTrackSize.x=480;
			}
			
			return 0;
		}

		case WM_SIZING:
		{
			PPLUGININFO plugin;

			plugin=GetPluginInfo(hDlg);

			if(plugin->b2001b)
			{
				RECT *lprc = (LPRECT) lParam;

				if(lprc->right-lprc->left<530)
				{
					lprc->right=lprc->left+530;
				}

				return TRUE;
			}
		}
		case WM_SIZE:
		{
			PPLUGININFO plugin;

			CallWindowProc(lpOldProc, hDlg, msg, wParam, lParam);

			plugin=GetPluginInfo(hDlg);

			SizeToolbar(plugin);
			SizeSendKey(plugin);
			return 0;
		}

		case WM_NEXTDLGCTL:
		{
			SetFocus(Plugin->hwndSend);
			return 0;
		}

		case WM_DESTROY:
		{
			PPLUGININFO plugin;

			plugin=GetPluginInfo(hDlg);

			UninitGetMessageHook(plugin->hMsgHook);

			FreePluginInfo(plugin);

			RemoveProp(hDlg, "oldproc");
			SetWindowLong(hDlg, GWL_WNDPROC, (DWORD) lpOldProc);
			break;
		}
	}

	return CallWindowProc(lpOldProc, hDlg, msg, wParam, lParam);
}

BOOL IsSendMessageWindow(HWND hwndRichEdit,
				 HWND *phwndMain,
				 HWND *phwndICQ,
				 HWND *phwndNick,
				 HWND *phwndSend,
				 HWND *phwndSKMark,
				 HWND *phwndTool,
				 HWND *phwndBack,
				 BOOL *b2001b)
{
	HWND hwndICQText;
	HWND hwndNickText;

	*b2001b=FALSE;

	*phwndMain=GetParent(hwndRichEdit);

	hwndNickText=FindWindowEx(*phwndMain,NULL,"Static","Nick:");

	if(hwndNickText==NULL)
	{
		return FALSE;
	}

	*phwndNick=FindWindowEx(*phwndMain,hwndNickText,"Static",NULL);

	if(*phwndNick==NULL)
	{
		return FALSE;
	}

	hwndICQText=FindWindowEx(*phwndMain,NULL,"Static","ICQ# :");

	if(hwndICQText==NULL)
	{
		return FALSE;
	}

	*phwndICQ=FindWindowEx(*phwndMain,hwndICQText,"Static",NULL);

	if(*phwndICQ==NULL)
	{
		return FALSE;
	}

	*phwndSend=FindWindowEx(*phwndMain,NULL,"Button","&Send");

	*phwndSKMark=FindWindowEx(*phwndMain,NULL,"Button","Msg Mode");
	if(*phwndSKMark==NULL)
	{
		*phwndSKMark=*phwndSend;
	}

	if(*phwndSend==NULL)
	{
		return FALSE;
	}

	*phwndTool=FindWindowEx(*phwndMain,NULL,"#32770",NULL);

	if(*phwndTool==NULL)
	{
		return FALSE;
	}

	*phwndBack=GetDlgItem(*phwndTool,6544);

	if(*phwndBack==NULL)
	{
		*phwndBack=FindWindowEx(*phwndTool,NULL,"ToolbarWindow32",NULL);

		if(*phwndBack==NULL)
		{
			return FALSE;
		}
		else
		{
			*phwndSKMark=FindWindowEx(*phwndMain,NULL,"Button","Send by:");
			if(*phwndSKMark==NULL)
			{
				*phwndSKMark=*phwndSend;
			}

			*b2001b=TRUE;
		}
	}

	return TRUE;
}

BOOL IsSendMessageWindow2000a(HWND hwndRichEdit,
				 HWND *phwndMain,
				 HWND *phwndICQ,
				 HWND *phwndNick,
				 HWND *phwndSend,
				 HWND *phwndSKMark,
				 HWND *phwndTool,
				 HWND *phwndBack)
{
	HWND hwndICQText;
	HWND hwndNickText;
	HWND hwnd32770;
//	HWND hwndFirstRE;

	*phwndMain=GetParent(hwndRichEdit);
/*
	// 2000a has multiple richedits which could clash.
	// Only one seems to do anything? -wjb
	hwndFirstRE=FindWindowEx(*phwndMain,NULL,"RICHEDIT",NULL);

	if(hwndFirstRE!=hwndRichEdit)
	{
		return FALSE;
	}*/

	hwnd32770=FindWindowEx(*phwndMain,NULL,"#32770",NULL);

	if(hwnd32770==NULL)
	{
		return FALSE;
	}

	// 32770 Stuff
	hwndNickText=FindWindowEx(hwnd32770,NULL,"Static","Nick:");

	if(hwndNickText==NULL)
	{
		return FALSE;
	}

	*phwndNick=FindWindowEx(hwnd32770,hwndNickText,"Static",NULL);

	if(*phwndNick==NULL)
	{
		return FALSE;
	}

	hwndICQText=FindWindowEx(hwnd32770,NULL,"Static","To:  ICQ# ");

	if(hwndICQText==NULL)
	{
		return FALSE;
	}

	*phwndICQ=FindWindowEx(hwnd32770,hwndICQText,"Static",NULL);

	if(*phwndICQ==NULL)
	{
		return FALSE;
	}
	// End 32770 Stuff

	*phwndSend=FindWindowEx(*phwndMain,NULL,"Button","&Send");
	*phwndSKMark=FindWindowEx(*phwndMain,NULL,"Button","Msg Mode");

	if(*phwndSend==NULL)
	{
		return FALSE;
	}

	*phwndTool=hwnd32770;

	*phwndBack=GetDlgItem(*phwndTool,6544);

	if(*phwndBack==NULL)
	{
		return FALSE;
	}

	return TRUE;
}

/*__Editor_settings____

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

⌨️ 快捷键说明

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