//wndhook.cpp
#include <assert.h>
#include <windows.h>
#include <tchar.h>
#include "wndhook.h"
struct HOOKDATA
{
int type;
HHOOK hook;
HOOKPROC proc;
HookClient *cx;
HOOKROUTINE fn;
HINSTANCE inst;
};
struct MSGHOOKDATA
{
WNDPROC owp;
HookClient *cx;
MsgHookType type;
MSGHOOKROUTINE fn;
};
#define MSGHOOKPRE TEXT("MsgHookPre")
#define MSGHOOKPOST TEXT("MsgHookPost")
static LRESULT CALLBACK jphookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK jrhookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK cbthookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK cwphookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK dbghookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK idlehookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK cwprhookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK hwhookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK mousehookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK keybdhookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK mousellhookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK keybdllhookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK shellhookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK getmsghookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK msgfilterhookStub(int code,WPARAM w,LPARAM l);
static LRESULT CALLBACK sysmsgfilterhookStub(int code,WPARAM w,LPARAM l);
#pragma data_seg(".shared")
//long g_ref;
HWND g_wnd = 0;
unsigned g_cmd = 0;
TCHAR g_fnName[128] = {0};
TCHAR g_dllName[512] = {0};
HINSTANCE g_dll = 0;
HOOKDATA g_hooks[16]={0};
#pragma data_seg()
#pragma comment(linker,"/SECTION:.shared,RWS")
BOOL WINAPI DllMain(HANDLE dll, DWORD reason, LPVOID dummy)
{
if(reason==DLL_PROCESS_ATTACH)
{
if(!g_dll)
{
g_dll = (HINSTANCE)dll;
HOOKDATA hooks[]=
{
{WH_JOURNALRECORD,0,&jrhookStub,0,0,0},
{WH_JOURNALPLAYBACK,0,&jphookStub,0,0,0},
{WH_KEYBOARD,0,&keybdhookStub,0,0,0},
{WH_GETMESSAGE,0,&getmsghookStub,0,0,0},
{WH_CALLWNDPROC,0,&cwphookStub,0,0,0},
{WH_CBT,0,&cbthookStub,0,0,0},
{WH_SYSMSGFILTER,0,&sysmsgfilterhookStub,0,0,0},
{WH_MOUSE,0,&mousehookStub,0,0,0},
{WH_HARDWARE,0,&hwhookStub,0,0,0},
{WH_DEBUG,0,&dbghookStub,0,0,0},
{WH_SHELL,0,&shellhookStub,0,0,0},
{WH_FOREGROUNDIDLE,0,&idlehookStub,0,0,0},
{WH_CALLWNDPROCRET,0,&cwprhookStub,0,0,0},
{WH_KEYBOARD_LL,0,&keybdllhookStub,0,0,0},
{WH_MOUSE_LL,0,&mousellhookStub,0,0,0},
{WH_MSGFILTER,0,&msgfilterhookStub,0,0,0},
};
assert(sizeof(hooks)==sizeof(g_hooks));
CopyMemory(g_hooks,hooks,sizeof(hooks));
}
}
else if(reason==DLL_PROCESS_DETACH)
{
for(int i=0;i<sizeof(g_hooks)/sizeof(g_hooks[0]);++i)
{
if(g_hooks[i].hook) removeWndHookByType(g_hooks[i].type);
}
}
return TRUE;
}
static LRESULT CALLBACK hookEntry(int type,int code,WPARAM w,LPARAM l)
{
HOOKDATA *h = NULL;
if(type==WH_MSGFILTER) h = g_hooks+sizeof(g_hooks)/sizeof(g_hooks[0])-1;
else if(type<sizeof(g_hooks)/sizeof(g_hooks[0])) h = g_hooks+type;
else
{
assert(!"Impossible situation!");
return 0;
}
assert(type==h->type);
HookCall call = eCallGoOn;
LRESULT r = 0;
try
{
if(h->fn!=0)
{
if(h->cx) r = (h->cx->*h->fn)(code,w,l,call);
else
{
HOOKROUTINEFP fn = horribleCastToHRFP(h->fn);
r = (*fn)(code,w,l,call);
}
}
}
catch(...)
{
UnhookWindowsHookEx(h->hook);
h->hook = NULL;
}
if(code>=0 && call==eCallStop) return r;
return CallNextHookEx(h->hook,code,w,l);
}
static LRESULT CALLBACK jphookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_JOURNALPLAYBACK,code,w,l);
}
static LRESULT CALLBACK jrhookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_JOURNALRECORD,code,w,l);
}
static LRESULT CALLBACK cbthookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_CBT,code,w,l);
}
static LRESULT CALLBACK cwphookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_CALLWNDPROC,code,w,l);
}
static LRESULT CALLBACK dbghookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_DEBUG,code,w,l);
}
static LRESULT CALLBACK idlehookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_FOREGROUNDIDLE,code,w,l);
}
static LRESULT CALLBACK cwprhookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_CALLWNDPROCRET,code,w,l);
}
static LRESULT CALLBACK hwhookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_HARDWARE,code,w,l);
}
static LRESULT CALLBACK mousehookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_MOUSE,code,w,l);
}
static LRESULT CALLBACK keybdhookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_KEYBOARD,code,w,l);
}
static LRESULT CALLBACK mousellhookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_MOUSE_LL,code,w,l);
}
static LRESULT CALLBACK keybdllhookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_KEYBOARD_LL,code,w,l);
}
static LRESULT CALLBACK shellhookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_SHELL,code,w,l);
}
static LRESULT CALLBACK getmsghookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_GETMESSAGE,code,w,l);
}
static LRESULT CALLBACK msgfilterhookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_MSGFILTER,code,w,l);
}
static LRESULT CALLBACK sysmsgfilterhookStub(int code,WPARAM w,LPARAM l)
{
return hookEntry(WH_SYSMSGFILTER,code,w,l);
}
HookResult WINAPI installWndHook(int type,void *c,HOOKROUTINE fn,HINSTANCE inst)
{
HOOKDATA *h = NULL;
if(type==WH_MSGFILTER) h = g_hooks+sizeof(g_hooks)/sizeof(g_hooks[0])-1;
else if(type<sizeof(g_hooks)/sizeof(g_hooks[0])) h = g_hooks+type;
else
{
assert(!"Impossible situation!");
return eResultFailure;
}
if(c==0 && fn==0) assert(!"Supply HookClient instance and its HookRoutine please!");
if(h->hook) return eResultFailure;//have already hooked up
h->fn = fn;
h->cx = (HookClient *)c;
DWORD tid = 0;
if(type==WH_KEYBOARD_LL || type==WH_MOUSE_LL || type==WH_JOURNALPLAYBACK
|| type==WH_JOURNALRECORD || type==WH_SYSMSGFILTER || !inst)
{
inst = g_dll;
tid = 0;
}
else
{
if(inst!=g_dll) tid = GetCurrentThreadId();
else tid = 0;
}
h->inst = inst;
if((h->hook=SetWindowsHookEx(type,h->proc,h->inst,tid))==0) return eResultFailure;
return eResultSuccess;
}
HookResult WINAPI installWndHookEx(int type,void *c,HOOKROUTINE fn,HWND wnd)
{
HOOKDATA *h = NULL;
if(!IsWindow(wnd)) return eResultFailure;
if(type==WH_MSGFILTER) h = g_hooks+sizeof(g_hooks)/sizeof(g_hooks[0])-1;
else if(type<sizeof(g_hooks)/sizeof(g_hooks[0])) h = g_hooks+type;
else
{
assert(!"Impossible situation!");
return eResultFailure;
}
if(c==0 && fn==0) assert(!"Supply HookClient instance and/or its HookRoutine please!");
if(h->hook) return eResultFailure;//have already hooked up
h->fn = fn;
h->cx = (HookClient *)c;
DWORD tid = 0;
h->inst = g_dll;
DWORD pid = 0;
tid = GetWindowThreadProcessId(wnd,&pid);
if((h->hook=SetWindowsHookEx(type,h->proc,h->inst,tid))==0) return eResultFailure;
return eResultSuccess;
}
HookResult WINAPI removeWndHookByType(int type)
{
HOOKDATA *h = NULL;
if(type==WH_MSGFILTER) h = g_hooks+sizeof(g_hooks)/sizeof(g_hooks[0])-1;
else if(type<sizeof(g_hooks)/sizeof(g_hooks[0])) h = g_hooks+type;
else
{
assert(!"Impossible situation!");
return eResultFailure;
}
HHOOK k = h->hook;
h->cx = 0;
h->fn = 0;
h->hook = 0;
if(!k || UnhookWindowsHookEx(k)) return eResultSuccess;
return eResultFailure;
}
HookResult WINAPI removeWndHookByFn(HOOKROUTINE fn)
{
int i;
for(i=0;i<sizeof(g_hooks)/sizeof(g_hooks[0]);++i)
{
if(g_hooks[i].fn==fn) break;
}
if(i>=sizeof(g_hooks)/sizeof(g_hooks[0])) return eResultFailure;
return removeWndHookByType(g_hooks[i].type);
}
HookResu
没有合适的资源?快使用搜索试试~ 我知道了~
VBSpy - VB6 form spy
共42个文件
cpp:11个
h:11个
dsp:4个
需积分: 9 22 下载量 109 浏览量
2008-10-19
14:45:44
上传
评论
收藏 155KB RAR 举报
温馨提示
这是一个基本的VB Spy程序,还很不完善,容易导致问题,请谨慎使用。 Quick Test Pro之类的自动测试可以编码脚本来操作被测试程序的界面,对VB程序不仅要操作界面元素,并且需要知道编程时使用的控件ID,假如“确定”的ID是btnOK,脚本中就写btnOk.Click()。 本程序就是用来遍历VB form上的控件。 注意:本程序不稳定,容易导致问题。
资源推荐
资源详情
资源评论
收起资源包目录
VBSpy.rar (42个子文件)
test
MenuWnd.cpp 5KB
test.h 1KB
StdAfx.cpp 206B
test.cpp 2KB
test.rc 5KB
HookManager.cpp 3KB
testDlg.cpp 7KB
StdAfx.h 1KB
testDlg.h 6KB
Resource.h 681B
test.dsp 4KB
res
test.rc2 396B
test.ico 1KB
HookManager.h 1KB
MenuWnd.h 2KB
wndhook.cpp 13KB
WndHook.dsp 4KB
WndHook.dsw 2KB
HookVB
HookVB.def 19B
HookVB.cpp 5KB
mso.tlb 215KB
HookVB.dsp 4KB
msvbvm63.tlb 104KB
msvbvm61.tlb 41KB
vbspy
StdAfx.cpp 208B
resource.h 774B
vbspy.h 1KB
vbspyDlg.cpp 8KB
VBSpy.clw 960B
vbspyDlg.h 2KB
VBSpy.rc 5KB
StdAfx.h 1KB
res
findcursor.cur 2KB
VBSpy.ico 1KB
vbspy.rc2 397B
vbspy.cpp 2KB
vbspy.dsp 4KB
wndfrompoint.cpp 2KB
Release
vbspy.exe 28KB
HookVB.dll 52KB
WndHook.dll 40KB
wndhook.h 2KB
共 42 条
- 1
资源评论
DoItFreely
- 粉丝: 6
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功