621 lines
16 KiB
C++
621 lines
16 KiB
C++
// HookInj.cpp : Defines the entry point for the DLL application.
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include <windows.h>
|
|
//#include "CmnHdr.h"
|
|
#include <WindowsX.h>
|
|
#include <CommCtrl.h>
|
|
#include <assert.h>
|
|
|
|
#define HOOKINJLIBAPI __declspec(dllexport)
|
|
#include "HookInj.h"
|
|
//#include "Resource.h"
|
|
|
|
/* nonstandard extension 'single line comment' was used */
|
|
#pragma warning(disable:4001)
|
|
|
|
// unreferenced formal parameter
|
|
#pragma warning(disable:4100)
|
|
|
|
// Note: Creating precompiled header
|
|
#pragma warning(disable:4699)
|
|
|
|
// function not inlined
|
|
#pragma warning(disable:4710)
|
|
|
|
// unreferenced inline function has been removed
|
|
#pragma warning(disable:4514)
|
|
|
|
// assignment operator could not be generated
|
|
#pragma warning(disable:4512)
|
|
|
|
#ifdef _X86_
|
|
#define DebugBreak() _asm { int 3 }
|
|
#endif
|
|
|
|
////////////////////////////// chINRANGE Macro ////////////////////////////////
|
|
|
|
|
|
// This macro returns TRUE if a number is between two others
|
|
#define chINRANGE(low, Num, High) (((low) <= (Num)) && ((Num) <= (High)))
|
|
|
|
|
|
//////////////////////////////// chDIMOF Macro ////////////////////////////////
|
|
|
|
|
|
// This macro evaluates to the number of elements in an array.
|
|
#define chDIMOF(Array) (sizeof(Array) / sizeof(Array[0]))
|
|
|
|
/////////////////////////// Quick MessageBox Macro ////////////////////////////
|
|
|
|
|
|
inline void chMB(PCSTR s) {
|
|
char szTMP[128];
|
|
GetModuleFileNameA(NULL, szTMP, chDIMOF(szTMP));
|
|
MessageBoxA(GetActiveWindow(), s, szTMP, MB_OK);
|
|
}
|
|
|
|
|
|
//////////////////////////// Assert/Verify Macros /////////////////////////////
|
|
|
|
|
|
inline void chFAIL(PSTR szMsg) {
|
|
chMB(szMsg);
|
|
DebugBreak();
|
|
}
|
|
|
|
|
|
// Put up an assertion failure message box.
|
|
inline void chASSERTFAIL(LPCSTR file, int line, PCSTR expr) {
|
|
char sz[128];
|
|
wsprintfA(sz, "File %s, line %d : %s", file, line, expr);
|
|
chFAIL(sz);
|
|
}
|
|
|
|
|
|
// Put up a message box if an assertion fails in a debug build.
|
|
#ifdef _DEBUG
|
|
#define chASSERT(x) if (!(x)) chASSERTFAIL(__FILE__, __LINE__, #x)
|
|
#else
|
|
#define chASSERT(x)
|
|
#endif
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
#ifdef _DEBUG
|
|
// This function forces the debugger to be invoked
|
|
void ForceDebugBreak() {
|
|
__try { DebugBreak(); }
|
|
__except(UnhandledExceptionFilter(GetExceptionInformation())) { }
|
|
}
|
|
#else
|
|
#define ForceDebugBreak()
|
|
#endif
|
|
|
|
#ifdef _DEBUG
|
|
VOID DbgPrintf(LPTSTR fmt, ...);
|
|
#else
|
|
VOID DbgPrintf(LPTSTR fmt, ...) { }
|
|
#endif
|
|
|
|
#ifdef _DEBUG
|
|
VOID DbgPrintf( LPTSTR fmt, ... )
|
|
{
|
|
va_list marker;
|
|
TCHAR szBuf[256];
|
|
|
|
va_start(marker, fmt);
|
|
wvsprintf(szBuf, fmt, marker);
|
|
va_end(marker);
|
|
|
|
OutputDebugString(szBuf);
|
|
OutputDebugString(TEXT("\r\n"));
|
|
}
|
|
#endif
|
|
|
|
|
|
#pragma data_seg("Shared")
|
|
DWORD g_dwThreadIdMainWnd = 0;
|
|
HWND g_hMainWnd = NULL;
|
|
|
|
HWND g_hWnd1 = NULL;
|
|
BOOL g_bFirstTime_Wnd1 = FALSE;
|
|
HHOOK g_hHookGetMessage_Wnd1 = NULL;
|
|
|
|
HWND g_hWnd2= NULL;
|
|
BOOL g_bFirstTime_Wnd2= FALSE;
|
|
HHOOK g_hHookGetMessage_Wnd2= NULL;
|
|
|
|
HWND g_hWnd3= NULL;
|
|
BOOL g_bFirstTime_Wnd3= FALSE;
|
|
HHOOK g_hHookGetMessage_Wnd3 = NULL;
|
|
#pragma data_seg()
|
|
|
|
// Instruct the linker to make the Shared section
|
|
// readable, writable, and shared.
|
|
#pragma comment(linker, "/section:Shared,rws")
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Forward references
|
|
LRESULT CALLBACK GetMsgProc_Wnd1(INT hc, WPARAM wParam, LPARAM lParam);
|
|
LRESULT CALLBACK Proc_Wnd1( HWND, UINT, WPARAM, LPARAM );
|
|
|
|
LRESULT CALLBACK GetMsgProc_Wnd2(INT hc, WPARAM wParam, LPARAM lParam);
|
|
LRESULT CALLBACK Proc_Wnd2( HWND, UINT, WPARAM, LPARAM );
|
|
|
|
LRESULT CALLBACK GetMsgProc_Wnd3(INT hc, WPARAM wParam, LPARAM lParam);
|
|
LRESULT CALLBACK Proc_Wnd3( HWND, UINT, WPARAM, LPARAM );
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// Nonshared variables
|
|
HINSTANCE g_hinstDll = NULL;
|
|
|
|
WNDPROC g_wpOld_Wnd1 = NULL;
|
|
WNDPROC g_wpOld_Wnd2 = NULL;
|
|
WNDPROC g_wpOld_Wnd3 = NULL;
|
|
|
|
SPYMSGDATA gsmd;
|
|
COPYDATASTRUCT gcds = { 0, sizeof(SPYMSGDATA), &gsmd };
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// DLL Entry point.
|
|
BOOL APIENTRY DllMain( HINSTANCE hModule,
|
|
DWORD ul_reason_for_call,
|
|
LPVOID lpReserved
|
|
)
|
|
{
|
|
switch (ul_reason_for_call) {
|
|
|
|
case DLL_PROCESS_ATTACH:
|
|
// DLL is attaching to the address space of the current process.
|
|
g_hinstDll = hModule;
|
|
break;
|
|
|
|
case DLL_THREAD_ATTACH:
|
|
// A new thread is being created in the current process.
|
|
break;
|
|
|
|
case DLL_THREAD_DETACH:
|
|
// A thread is exiting cleanly.
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
// The calling process is detaching the DLL from its address space.
|
|
break;
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL WINAPI HAPI_InstallHook( HWND hMainWnd,
|
|
HWND hWnd1,
|
|
HWND hWnd2,
|
|
HWND hWnd3 )
|
|
{
|
|
DbgPrintf( "HAPI_InstallHook : Start" );
|
|
|
|
g_dwThreadIdMainWnd = GetCurrentThreadId();
|
|
|
|
g_hMainWnd = hMainWnd;
|
|
|
|
g_hWnd1 = hWnd1;
|
|
g_hWnd2 = hWnd2;
|
|
g_hWnd3 = hWnd3;
|
|
|
|
BOOL fOk = FALSE;
|
|
DWORD _dwThreadId;
|
|
if( ::IsWindow(hWnd1) )
|
|
{
|
|
_dwThreadId = GetWindowThreadProcessId( hWnd1, NULL );
|
|
|
|
if (_dwThreadId != 0)
|
|
{
|
|
chASSERT(g_hHookGetMessage_Wnd1 == NULL);
|
|
if (!g_hHookGetMessage_Wnd1)
|
|
{
|
|
if (!(g_hHookGetMessage_Wnd1 = SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)GetMsgProc_Wnd1,
|
|
g_hinstDll, _dwThreadId)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
DbgPrintf( "HAPI_InstallHook : g_hHookGetMessage_Wnd1" );
|
|
|
|
g_bFirstTime_Wnd1 = TRUE;
|
|
fOk = PostThreadMessage(_dwThreadId, WM_NULL, 0, 0);
|
|
}
|
|
}
|
|
|
|
if( ::IsWindow(hWnd2) )
|
|
{
|
|
_dwThreadId = GetWindowThreadProcessId( hWnd2, NULL );
|
|
|
|
if (_dwThreadId != 0)
|
|
{
|
|
chASSERT(g_hHookGetMessage_Wnd2 == NULL);
|
|
if (!g_hHookGetMessage_Wnd2)
|
|
{
|
|
if (!(g_hHookGetMessage_Wnd2 = SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)GetMsgProc_Wnd2,
|
|
g_hinstDll, _dwThreadId)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
DbgPrintf( "HAPI_InstallHook : g_hHookGetMessage_Wnd2" );
|
|
|
|
g_bFirstTime_Wnd2 = TRUE;
|
|
fOk = PostThreadMessage(_dwThreadId, WM_NULL, 0, 0);
|
|
}
|
|
}
|
|
|
|
if( ::IsWindow(hWnd3) )
|
|
{
|
|
_dwThreadId = GetWindowThreadProcessId( hWnd3, NULL );
|
|
|
|
if (_dwThreadId != 0)
|
|
{
|
|
chASSERT(g_hHookGetMessage_Wnd3 == NULL);
|
|
if (!g_hHookGetMessage_Wnd3)
|
|
{
|
|
if (!(g_hHookGetMessage_Wnd3 = SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)GetMsgProc_Wnd3,
|
|
g_hinstDll, _dwThreadId)))
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
DbgPrintf( "HAPI_InstallHook : g_hHookGetMessage_Wnd3" );
|
|
|
|
g_bFirstTime_Wnd3 = TRUE;
|
|
fOk = PostThreadMessage(_dwThreadId, WM_NULL, 0, 0);
|
|
}
|
|
}
|
|
|
|
return(fOk);
|
|
}
|
|
|
|
BOOL WINAPI HAPI_UninstallHook( )
|
|
{
|
|
BOOL fOk = FALSE;
|
|
|
|
if (g_hHookGetMessage_Wnd1)
|
|
{
|
|
DbgPrintf( "HAPI_UninstallHook : g_hHookGetMessage_Wnd1" );
|
|
|
|
g_bFirstTime_Wnd1 = FALSE;
|
|
|
|
SendMessage( g_hWnd1, WM_APP, APP_UNSUBCLASSING, APP_UNSUBCLASSING );
|
|
|
|
fOk = UnhookWindowsHookEx(g_hHookGetMessage_Wnd1);
|
|
if( !fOk )
|
|
{
|
|
DWORD dwError = GetLastError();
|
|
DbgPrintf( "UnhookWindowsHookEx :1 Error(%d)", dwError );
|
|
}
|
|
else
|
|
g_hHookGetMessage_Wnd1 = NULL;
|
|
}
|
|
|
|
if (g_hHookGetMessage_Wnd2)
|
|
{
|
|
DbgPrintf( "HAPI_UninstallHook : g_hHookGetMessage_Wnd2" );
|
|
|
|
g_bFirstTime_Wnd2 = FALSE;
|
|
|
|
SendMessage( g_hWnd2, WM_APP, APP_UNSUBCLASSING, APP_UNSUBCLASSING );
|
|
|
|
fOk = UnhookWindowsHookEx(g_hHookGetMessage_Wnd2);
|
|
if( !fOk )
|
|
{
|
|
DWORD dwError = GetLastError();
|
|
DbgPrintf( "UnhookWindowsHookEx :2 Error(%d)", dwError );
|
|
}
|
|
else
|
|
g_hHookGetMessage_Wnd2 = NULL;
|
|
}
|
|
|
|
if (g_hHookGetMessage_Wnd3)
|
|
{
|
|
//CloseHandle(hFile);
|
|
|
|
DbgPrintf( "HAPI_UninstallHook : g_hHookGetMessage_Wnd3" );
|
|
|
|
g_bFirstTime_Wnd3 = FALSE;
|
|
|
|
SendMessage( g_hWnd3, WM_APP, APP_UNSUBCLASSING, APP_UNSUBCLASSING );
|
|
|
|
fOk = UnhookWindowsHookEx(g_hHookGetMessage_Wnd3);
|
|
if( !fOk )
|
|
{
|
|
DWORD dwError = GetLastError();
|
|
DbgPrintf( "UnhookWindowsHookEx :3 Error(%d)", dwError );
|
|
}
|
|
else
|
|
g_hHookGetMessage_Wnd3 = NULL;
|
|
}
|
|
|
|
return(fOk);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
void InitSubClass_Wnd1( )
|
|
{
|
|
g_wpOld_Wnd1 = (WNDPROC)SetWindowLong( g_hWnd1, GWL_WNDPROC, (LONG)Proc_Wnd1 );
|
|
}
|
|
LRESULT CALLBACK GetMsgProc_Wnd1( INT hc, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
LPMSG pMsg = (LPMSG)lParam;
|
|
// DbgPrintf( "GetMsgProc_Wnd1 : %d,%d", pMsg->wParam, pMsg->lParam );
|
|
|
|
if( g_bFirstTime_Wnd1 )
|
|
{
|
|
g_bFirstTime_Wnd1 = FALSE;
|
|
InitSubClass_Wnd1( );
|
|
}
|
|
|
|
return CallNextHookEx(g_hHookGetMessage_Wnd1, hc, wParam, lParam);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
void InitSubClass_Wnd2( )
|
|
{
|
|
g_wpOld_Wnd2 = (WNDPROC)SetWindowLong( g_hWnd2, GWL_WNDPROC, (LONG)Proc_Wnd2 );
|
|
}
|
|
LRESULT CALLBACK GetMsgProc_Wnd2( INT hc, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
LPMSG pMsg = (LPMSG)lParam;
|
|
// DbgPrintf( "GetMsgProc_Wnd2 : %d,%d", pMsg->wParam, pMsg->lParam );
|
|
|
|
if( g_bFirstTime_Wnd2 )
|
|
{
|
|
g_bFirstTime_Wnd2 = FALSE;
|
|
InitSubClass_Wnd2( );
|
|
}
|
|
|
|
return CallNextHookEx(g_hHookGetMessage_Wnd2, hc, wParam, lParam);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
void InitSubClass_Wnd3( )
|
|
{
|
|
g_wpOld_Wnd3 = (WNDPROC)SetWindowLong( g_hWnd3, GWL_WNDPROC, (LONG)Proc_Wnd3 );
|
|
}
|
|
LRESULT CALLBACK GetMsgProc_Wnd3( INT hc, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
LPMSG pMsg = (LPMSG)lParam;
|
|
// DbgPrintf( "GetMsgProc_Wnd3 : %d,%d", pMsg->wParam, pMsg->lParam );
|
|
|
|
if( g_bFirstTime_Wnd3 )
|
|
{
|
|
g_bFirstTime_Wnd3 = FALSE;
|
|
InitSubClass_Wnd3( );
|
|
}
|
|
|
|
return CallNextHookEx(g_hHookGetMessage_Wnd3, hc, wParam, lParam);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
// KOSDAQ 티커.
|
|
LRESULT CALLBACK Proc_Wnd1( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
LRESULT lResult = CallWindowProc( g_wpOld_Wnd1, hwnd, msg, wParam, lParam );
|
|
switch( msg )
|
|
{
|
|
case LVM_INSERTITEM:
|
|
{
|
|
DbgPrintf( "LVM_INSERTITEM " );
|
|
}
|
|
break;
|
|
case LVM_SETITEM:
|
|
{
|
|
DbgPrintf( "LVM_SETITEM " );
|
|
LPLVITEM pItem = (LPLVITEM) lParam;
|
|
|
|
memset( &gsmd, NULL, sizeof(SPYMSGDATA) );
|
|
|
|
gsmd.wParam = wParam;
|
|
gsmd.lParam = lParam;
|
|
strcpy( (char*)gsmd.ExtraData, pItem->pszText );
|
|
|
|
gcds.dwData = UM_HOOKOK_WND1;
|
|
|
|
DbgPrintf("Proc_Wnd1 Sending Message hwnd:%8.8x msg:%d", hwnd, msg);
|
|
SendMessage(g_hMainWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&gcds);
|
|
}
|
|
break;
|
|
|
|
case WM_APP :
|
|
{
|
|
UINT nW = (UINT)wParam;
|
|
UINT nL = (UINT)lParam;
|
|
if( nW == APP_UNSUBCLASSING && nL == APP_UNSUBCLASSING )
|
|
{
|
|
DbgPrintf( "Proc_Wnd1 : SetWindowLong" );
|
|
g_wpOld_Wnd1 = (WNDPROC)SetWindowLong( hwnd, GWL_WNDPROC, (LONG)g_wpOld_Wnd1 );
|
|
}
|
|
}
|
|
break;
|
|
case WM_DESTROY :
|
|
::PostMessage( g_hMainWnd, WM_HOOKMSG_TARGETAPP_DESTORYED, UM_HOOKOK_WND1, 0 );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return lResult;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
// NewsPlus.
|
|
LRESULT CALLBACK Proc_Wnd2( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
LRESULT lResult = CallWindowProc( g_wpOld_Wnd2, hwnd, msg, wParam, lParam );
|
|
|
|
if(msg == 132 || msg == 32 || msg == 675 || msg == 512)
|
|
;
|
|
else
|
|
DbgPrintf("Message : %d",msg);
|
|
/*
|
|
static int nCheck = -1;
|
|
static char szMessage[256];
|
|
|
|
switch( msg )
|
|
{
|
|
case LVM_INSERTITEM:
|
|
{
|
|
DbgPrintf( "LVM_INSERTITEM " );
|
|
nCheck = 0; // Check Start.
|
|
}
|
|
break;
|
|
case LVM_SETITEM:
|
|
{
|
|
if( nCheck >= 0 )
|
|
{
|
|
++nCheck;
|
|
|
|
if( nCheck == 2 ) // 종목코드.
|
|
{
|
|
DbgPrintf( "LVM_SETITEM 2" );
|
|
LPLVITEM pItem = (LPLVITEM) lParam;
|
|
memset( szMessage, NULL, 256 );
|
|
int nLen = strlen( pItem->pszText );
|
|
if( nLen == 6 )
|
|
strcpy( szMessage, pItem->pszText );
|
|
else
|
|
nCheck = -1; // 종목코드 길이가 맞지않아서 체크카운트를 초기화합니다.
|
|
}
|
|
else if( nCheck == 4 ) // 타이틀.
|
|
{
|
|
DbgPrintf( "LVM_SETITEM 4" );
|
|
LPLVITEM pItem = (LPLVITEM) lParam;
|
|
strcat( szMessage, pItem->pszText );
|
|
|
|
memset( &gsmd, NULL, sizeof(SPYMSGDATA) );
|
|
|
|
gsmd.wParam = wParam;
|
|
gsmd.lParam = lParam;
|
|
strcpy( (char*)gsmd.ExtraData, szMessage );
|
|
|
|
gcds.dwData = UM_HOOKOK_WND2;
|
|
|
|
DbgPrintf("Proc_Wnd2 Sending Message hwnd:%8.8x msg:%d", hwnd, msg);
|
|
SendMessage(g_hMainWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&gcds);
|
|
|
|
nCheck = -1; // 체크카운트를 다시 초기화한다.
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_APP :
|
|
{
|
|
UINT nW = (UINT)wParam;
|
|
UINT nL = (UINT)lParam;
|
|
if( nW == APP_UNSUBCLASSING && nL == APP_UNSUBCLASSING )
|
|
{
|
|
DbgPrintf( "Proc_Wnd2 : SetWindowLong" );
|
|
g_wpOld_Wnd2 = (WNDPROC)SetWindowLong( hwnd, GWL_WNDPROC, (LONG)g_wpOld_Wnd2 );
|
|
}
|
|
}
|
|
break;
|
|
case WM_DESTROY :
|
|
::PostMessage( g_hMainWnd, WM_HOOKMSG_TARGETAPP_DESTORYED, UM_HOOKOK_WND2, 0 );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
*/
|
|
return lResult;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
// 7121.
|
|
LRESULT CALLBACK Proc_Wnd3( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
LRESULT lResult = CallWindowProc( g_wpOld_Wnd3, hwnd, msg, wParam, lParam );
|
|
|
|
//~!
|
|
/* 2005.8.18
|
|
중요한 정보는 헤드라인과 종목명 두가지로 가정한다.
|
|
따라서 LVM_SETITEM 메시지만 후킹하면 되며
|
|
SubItem이 2이면 헤드라인
|
|
SubItem이 3이면 종목명이다
|
|
*/
|
|
|
|
// hFile=CreateFile("d:\\NewsLog.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
|
|
// DWORD dwWritten;
|
|
|
|
switch( msg )
|
|
{
|
|
|
|
/*
|
|
case LVM_INSERTITEM:
|
|
case LVM_SETITEM:
|
|
{
|
|
LPLVITEM pLvitem = (LPLVITEM)lParam;
|
|
DbgPrintf("[Juno] : [%d,%d]%s",pLvitem->iItem,pLvitem->iSubItem,pLvitem->pszText);
|
|
WriteFile(hFile,pLvitem->pszText,strlen(pLvitem->pszText),&dwWritten,NULL);
|
|
WriteFile(hFile,"\n",2,&dwWritten,NULL);
|
|
}
|
|
break;
|
|
*/
|
|
|
|
// case LVM_INSERTITEM:
|
|
case LVM_SETITEM:
|
|
{
|
|
LPLVITEM pLvitem = (LPLVITEM)lParam;
|
|
|
|
DbgPrintf("[Juno] : [%d,%d]%s",pLvitem->iItem,pLvitem->iSubItem,pLvitem->pszText);
|
|
|
|
if(pLvitem->iSubItem != 1 && pLvitem->iSubItem != 2 && pLvitem->iSubItem != 3)
|
|
break;
|
|
|
|
gsmd.wParam = MSG_LIST_SET_ITEM;
|
|
gsmd.lParam = pLvitem->iSubItem;
|
|
strcpy( (char*)gsmd.ExtraData, (char*)pLvitem->pszText);
|
|
|
|
gcds.dwData = UM_HOOKOK_WND3;
|
|
|
|
DbgPrintf("Proc_Wnd3 Sending Message hwnd:%8.8x msg:%d", hwnd, msg);
|
|
SendMessage(g_hMainWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&gcds);
|
|
}
|
|
break;
|
|
|
|
case LB_INSERTSTRING:
|
|
{
|
|
memset( &gsmd, NULL, sizeof(SPYMSGDATA) );
|
|
|
|
gsmd.wParam = wParam;
|
|
gsmd.lParam = lParam;
|
|
strcpy( (char*)gsmd.ExtraData, (char*)lParam);
|
|
|
|
gcds.dwData = UM_HOOKOK_WND3;
|
|
|
|
DbgPrintf("Proc_Wnd3 Sending Message hwnd:%8.8x msg:%d", hwnd, msg);
|
|
SendMessage(g_hMainWnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)&gcds);
|
|
}
|
|
break;
|
|
case WM_APP :
|
|
{
|
|
UINT nW = (UINT)wParam;
|
|
UINT nL = (UINT)lParam;
|
|
if( nW == APP_UNSUBCLASSING && nL == APP_UNSUBCLASSING )
|
|
{
|
|
DbgPrintf( "Proc_Wnd3 : SetWindowLong" );
|
|
g_wpOld_Wnd3 = (WNDPROC)SetWindowLong( hwnd, GWL_WNDPROC, (LONG)g_wpOld_Wnd3 );
|
|
}
|
|
}
|
|
break;
|
|
case WM_DESTROY :
|
|
::PostMessage( g_hMainWnd, WM_HOOKMSG_TARGETAPP_DESTORYED, UM_HOOKOK_WND3, 0 );
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return lResult;
|
|
}
|
|
|