www.pudn.com > GUIhookNT.zip > Guihook.c


/************************************************* 
*  Copyrights , 1997 ,CompTech , TaoChen 
*  Email : tchen@Venus.sui.ustc.edu.cn 
*************************************************/ 
 
#include  
#include  
#include  
#include  
#include "texthook.h" 
#include "resource.h" 
#include "guidll.h" 
static BOOL bCanEnd = FALSE ; 
 
char AppName[]      = "TEXTHOOKNT"; 
HANDLE HInstance; 
char ERROR_CAPTION[] = "Problem!!!"; 
static BOOL bCleared  = TRUE; 
 
BOOL 
RegisterMousePointWindow(void); 
BOOL CALLBACK 
TextHookDialogProc(HWND hDlg, UINT message, 
					WPARAM wParam, LPARAM lParam); 
 
 
 
void TextHookError(char *msg) 
{ 
	 char buffer[128]; 
 
	 wsprintf(buffer, "TextHook %s", msg); 
 
	 MessageBox(NULL, buffer, ERROR_CAPTION, MB_OK); 
} 
 
 
 
BOOL CALLBACK TextHookDialogProc(HWND hDlg, UINT message, 
WPARAM wParam, LPARAM lParam) 
{ 
	char buffer[128]; 
//	POINT FAR *pt; 
	static HANDLE hMapObject= NULL; 
	static PTShareData pData=NULL; 
	HMODULE hModGDI ; 
	switch ( message ){ 
	case WM_INITDIALOG: 
			hMapObject = CreateFileMapping(  
                (HANDLE) 0xFFFFFFFF, // use paging file 
                NULL,                // no security attributes 
                PAGE_READWRITE,      // read/write access 
                0,                   // size: high 32-bits 
                SHMEMSIZE,           // size: low 32-bits 
                MAPFILENAME);        // name of map object 
             
			if (hMapObject == NULL){ 
				TextHookError("Can not init. share memory !"); 
                EndDialog(hDlg , FALSE ); 
				return FALSE;  
			} 
  
            // Get a pointer to the file-mapped shared memory. 
  
            pData = (PTShareData)MapViewOfFile(  
                hMapObject,     // object to map view of 
                FILE_MAP_WRITE, // read/write access 
                0,              // high offset:  map from 
                0,              // low offset:   beginning 
                0);             // default: map entire file 
 
            if (pData == NULL){ 
				TextHookError("Can not init. share memory !"); 
                EndDialog(hDlg , FALSE ); 
				return FALSE;  
			} 
  
            // Initialize memory . 
             
            memset(pData, '\0', SHMEMSIZE);  
			 
			pData->hCurTask = GetCurrentTask(); 
			pData->HTextHookWnd = hDlg ; 
			pData->DLLRef = 1; 
			 
			hModGDI = GetModuleHandle ( "GDI32"); 
			if ( hModGDI == NULL ){ 
				TextHookError("What about your windows nt ?"); 
                EndDialog(hDlg , FALSE ); 
				return FALSE; 
			} 
			 
			pData->ExtTextOutA = (__ExtTextOut)GetProcAddress(hModGDI , "ExtTextOutA"); 
			if (pData->ExtTextOutA == NULL ){ 
				TextHookError("Failed to get API entry !"); 
                EndDialog(hDlg , FALSE ); 
				return FALSE; 
			}	 
			 
			memcpy(pData->OldCodeExtTextOutA , pData->ExtTextOutA , 10 ); 
 
			pData->TextOutA = (__TextOut)GetProcAddress(hModGDI , "TextOutA"); 
						 
			if (pData->TextOutA == NULL ){ 
				TextHookError("Failed to get API entry !"); 
                EndDialog(hDlg , FALSE ); 
				return FALSE; 
			} 
			memcpy(pData->OldCodeTextOutA , pData->TextOutA , 10 ); 
 
			pData->ExtTextOutW = (__ExtTextOut)GetProcAddress(hModGDI , "ExtTextOutW"); 
			if (pData->ExtTextOutW == NULL ){ 
				TextHookError("Failed to get API entry !"); 
                EndDialog(hDlg , FALSE ); 
				return FALSE; 
			}	 
			memcpy(pData->OldCodeExtTextOutW , pData->ExtTextOutW , 10 ); 
 
			pData->TextOutW = (__TextOut)GetProcAddress(hModGDI , "TextOutW"); 
						 
			if (pData->TextOutW == NULL ){ 
				TextHookError("Failed to get API entry !"); 
                EndDialog(hDlg , FALSE ); 
				return FALSE; 
			} 
			memcpy(pData->OldCodeTextOutW , pData->TextOutW , 10 ); 
			 
			return TRUE ; 
		  case WM_SHUTDOWN : 
			  if(bCanEnd==TRUE){ 
				  UnmapViewOfFile(pData);  
				  CloseHandle(hMapObject); 
				  EndDialog(hDlg,TRUE); 
				} 
			  break ; 
 
		  case WM_COMMAND: 
				switch ( wParam ){ 
					case IDOK : 
						SetWindowText(hDlg , "Unloading ... ... please wait ... ..."); 
						if(	pData->DLLRef == 1){ 
							EndDialog(hDlg,TRUE); 
						}else{ 
							pData->bIntercept = FALSE; 
							UninstallMouseHook(); 
						} 
						EnableWindow(hDlg,FALSE); 
						//Sleep(1000); 
						bCanEnd= TRUE ; 
				 
						return TRUE; 
					case  IDHELP : 
						WinExec("WinHlp32.exe GUIHOKNT.HLP" , SW_SHOW); 
						return 0 ; 
 
					case IDC_COMMAND : 
						GetDlgItemText(hDlg , IDC_COMMAND ,buffer ,128 ); 
						if ( lstrcmpi( buffer , "Start !") == 0){ 
							MessageBox(NULL , "Start!" ,"Demo" , MB_OK ); 
							SetDlgItemText(hDlg , IDC_COMMAND ,"Stop !" ); 
							pData->bIntercept = TRUE; 
							InstallMouseHook(HInstance); 
						}else{ 
							SetDlgItemText(hDlg , IDC_COMMAND ,"Start !" ); 
							pData->bIntercept = FALSE; 
							UninstallMouseHook(); 
						} 
						 
						return 0; 
 
					case IDC_COMMAND2 : 
						GetDlgItemText(hDlg , IDC_COMMAND2 ,buffer ,128 ); 
						if ( lstrcmpi( buffer , "Start !") == 0){ 
							MessageBox(NULL , "Start" ,"demo" , MB_OK ); 
							SetDlgItemText(hDlg , IDC_COMMAND2 ,"Stop !" ); 
							pData->bReadyToGetText = TRUE ; 
							FlushViewOfFile(pData , 0); 
						}else{ 
							SetDlgItemText(hDlg , IDC_COMMAND2 ,"Start !" ); 
							pData->bReadyToGetText = FALSE ; 
						} 
						return 0; 
 
					case IDC_IGNORE1 : 
						if( BST_UNCHECKED != IsDlgButtonChecked(hDlg ,IDC_IGNORE1 )){ 
							CheckDlgButton(hDlg ,IDC_IGNORE1,TRUE); 
							pData->bIgrExtTextOutA = TRUE ; 
						}else{ 
							CheckDlgButton(hDlg ,IDC_IGNORE1,FALSE); 
							pData->bIgrExtTextOutA = FALSE; 
						} 
						FlushViewOfFile(pData , 0); 
						break; 
					case IDC_IGNORE2 : 
						if( BST_UNCHECKED != IsDlgButtonChecked(hDlg ,IDC_IGNORE2 )){ 
							CheckDlgButton(hDlg ,IDC_IGNORE2,TRUE); 
							pData->bIgrTextOutA = TRUE ; 
						}else{ 
							CheckDlgButton(hDlg ,IDC_IGNORE2,FALSE); 
							pData->bIgrTextOutA = FALSE ; 
						} 
 
						break; 
					case IDC_IGNORE3 : 
						if( BST_UNCHECKED != IsDlgButtonChecked(hDlg ,IDC_IGNORE3 )){ 
							CheckDlgButton(hDlg ,IDC_IGNORE3,TRUE); 
							pData->bIgrExtTextOutW = TRUE; 
						}else{ 
							CheckDlgButton(hDlg ,IDC_IGNORE3,FALSE); 
							pData->bIgrExtTextOutW = FALSE; 
						} 
						FlushViewOfFile(pData , 0); 
						break; 
					case IDC_IGNORE4 : 
						if( BST_UNCHECKED != IsDlgButtonChecked(hDlg ,IDC_IGNORE4 )){ 
							CheckDlgButton(hDlg ,IDC_IGNORE4,TRUE); 
							pData->bIgrTextOutW = TRUE; 
				 		}else{ 
							CheckDlgButton(hDlg ,IDC_IGNORE4,FALSE); 
							pData->bIgrTextOutW = FALSE; 
						} 
						FlushViewOfFile(pData , 0); 
						break; 
 
					default : 
						break ; 
				} 
				break; 
		  case WM_EXTTEXTOUTA: 
			  if(wParam == CMD_USE2) 
				  SetDlgItemText( hDlg , IDC_EXTTEXTOUTA , pData->sBufExtTextOutA2) ; 
			  else 
				  SetDlgItemText( hDlg , IDC_EXTTEXTOUTA , pData->sBufExtTextOutA) ; 
				break ; 
		  case WM_TEXTOUTA: 
			  if(wParam == CMD_USE2) 
				  SetDlgItemText( hDlg , IDC_TEXTOUTA , pData->sBufTextOutA2) ; 
			  else 
				  SetDlgItemText( hDlg , IDC_TEXTOUTA , pData->sBufTextOutA) ; 
				break ; 
		  case WM_EXTTEXTOUTW : 
			  if(wParam == CMD_USE2) 
				  SetDlgItemText( hDlg , IDC_EXTTEXTOUTW , pData->sBufExtTextOutW2) ; 
			  else 
				  SetDlgItemText( hDlg , IDC_EXTTEXTOUTW , pData->sBufExtTextOutW) ; 
				break ; 
		  case WM_TEXTOUTW: 
			  if(wParam == CMD_USE2) 
				  SetDlgItemText( hDlg , IDC_TEXTOUTW , pData->sBufTextOutW2) ; 
			  else 
				  SetDlgItemText( hDlg , IDC_TEXTOUTW , pData->sBufTextOutW) ; 
 
				break ; 
 
		  case WM_MOUSEPT: 
				wsprintf(buffer , "Mouse point : X=%3d,Y=%3d" , pData->tMouseP.x , pData->tMouseP.y); 
				SetDlgItemText( hDlg , IDC_MOUSEXY , buffer ) ; 
				break ; 
	} 
	return FALSE ;	  
} 
 
BOOL 
RegisterMousePointWindow(void) 
{ 
	 WNDCLASS wc; 
 
	 // prepare to register the class for the main window 
	 wc.style         = 0 ; //CS_HREDRAW | CS_VREDRAW; 
	 wc.lpfnWndProc   = (WNDPROC)MouseWndProc; 
	 wc.cbClsExtra    = 0; 
	 wc.cbWndExtra    = 0; 
	 wc.hInstance     = HInstance; 
	 wc.hIcon         = NULL ; 
	 wc.hCursor       = NULL ; 
	 wc.hbrBackground = NULL ; //(HBRUSH)GetStockObject(WHITE_BRUSH); 
	 wc.lpszMenuName  = NULL; 
	 wc.lpszClassName = szMousePointWindowName; 
 
	 // register the class for the main window 
	 if( ! RegisterClass( &wc ) ) 
		  return FALSE; 
 
	 return TRUE; 
} 
 
int PASCAL WinMain( HANDLE hInstance,  HANDLE hPrevInstance, 
						  LPSTR lpszCmdLine, int nCmdShow) 
 
{ 
 
	 HInstance = hInstance; 
	 if ( hPrevInstance ){ 
		  TextHookError("can only be run once"); 
		  return 0; 
	 } 
	 if ( !RegisterMousePointWindow()){ 
		 return 0; 
	 } 
 
	 Ctl3dRegister(hInstance); 
	 Ctl3dAutoSubclass(hInstance); 
	 DialogBox( HInstance, MAKEINTRESOURCE(TEXTHOOK), NULL, TextHookDialogProc); 
	 Ctl3dUnregister(hInstance); 
	 UnregisterClass(szMousePointWindowName,hInstance); 
	 return 0; 
}