我在MFC程序里加载的DLL,如下:
void CProDlg::OnOK()
{
DWORD kk;
HINSTANCE dllhinstance; typedef BOOL(* INSTALLHOOK)(VOID); dllhinstance=LoadLibrary("dll.dll"); INSTALLHOOK installhook; if(dllhinstance!=NULL)
{
MessageBox("load library succeed","kk",MB_OK);
installhook=(INSTALLHOOK)GetProcAddress(dllhinstance,"installhook");
if(installhook==NULL)
MessageBox("install error","kk",MB_OK);
if(installhook!=NULL)
{
installhook();
}
}
}DLL的代码如下:
#include "stdafx.h"
# include<stdio.h>
DWORD kk;
# define DBT_DEVICEARRIVAL 0x8000
HHOOK loghook;
HINSTANCE hInstance;//本程序的句柄
BOOL installhook();
void endhook(void);
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//MessageBox(NULL,"DLL加载","",MB_OK);
hInstance=(HINSTANCE)hModule;
break;
default:
break;
}
return TRUE;
}BOOL installhook(void)
{
loghook=SetWindowsHookEx(WH_CALLWNDPROC,myloghook,hInstance,0);
if(loghook==NULL)
MessageBox(NULL,"log hook error","kk",MB_OK);
else
MessageBox(NULL,"install hook run","kk",MB_OK);
return true;
}
void endhook(void)
{
UnhookWindowsHookEx(loghook);
}
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam)
{
MessageBox(NULL,"安装","",MB_OK);
//ExitWindowsEx(EWX_LOGOFF,0);
//printf("nihao\n");
if(iCode==HC_ACTION)
{
PCWPSTRUCT msg=PCWPSTRUCT(lParam);
if(msg->message==WM_DEVICECHANGE)
{
if(msg->lParam==0x8000)//DBT_DEVICEARRIVAL
{
MessageBox(NULL,"有移动设备插入!","警告!",MB_OK);
}
}
}
return CallNextHookEx(loghook,iCode,wParam,lParam);
}但是钩子函数却没有执行,并且loghook不为NULL,不知道怎么回事,请大家指教,谢谢。
void CProDlg::OnOK()
{
DWORD kk;
HINSTANCE dllhinstance; typedef BOOL(* INSTALLHOOK)(VOID); dllhinstance=LoadLibrary("dll.dll"); INSTALLHOOK installhook; if(dllhinstance!=NULL)
{
MessageBox("load library succeed","kk",MB_OK);
installhook=(INSTALLHOOK)GetProcAddress(dllhinstance,"installhook");
if(installhook==NULL)
MessageBox("install error","kk",MB_OK);
if(installhook!=NULL)
{
installhook();
}
}
}DLL的代码如下:
#include "stdafx.h"
# include<stdio.h>
DWORD kk;
# define DBT_DEVICEARRIVAL 0x8000
HHOOK loghook;
HINSTANCE hInstance;//本程序的句柄
BOOL installhook();
void endhook(void);
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//MessageBox(NULL,"DLL加载","",MB_OK);
hInstance=(HINSTANCE)hModule;
break;
default:
break;
}
return TRUE;
}BOOL installhook(void)
{
loghook=SetWindowsHookEx(WH_CALLWNDPROC,myloghook,hInstance,0);
if(loghook==NULL)
MessageBox(NULL,"log hook error","kk",MB_OK);
else
MessageBox(NULL,"install hook run","kk",MB_OK);
return true;
}
void endhook(void)
{
UnhookWindowsHookEx(loghook);
}
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam)
{
MessageBox(NULL,"安装","",MB_OK);
//ExitWindowsEx(EWX_LOGOFF,0);
//printf("nihao\n");
if(iCode==HC_ACTION)
{
PCWPSTRUCT msg=PCWPSTRUCT(lParam);
if(msg->message==WM_DEVICECHANGE)
{
if(msg->lParam==0x8000)//DBT_DEVICEARRIVAL
{
MessageBox(NULL,"有移动设备插入!","警告!",MB_OK);
}
}
}
return CallNextHookEx(loghook,iCode,wParam,lParam);
}但是钩子函数却没有执行,并且loghook不为NULL,不知道怎么回事,请大家指教,谢谢。
解决方案 »
- DWORD和INT的区别
- 用Edit做的文本阅读器 【求教】
- 关于Winsock2 API
- 有6位字符,每位可以是0-9的数字字符,怎么输出它们的不同6位字符组合,求教!
- 一个MScomm的问题:为什么会一直产生Comevent=6的事件
- 在发个帖子问问高手们,如何控制其它程序(可执行的)的窗口,让它隐藏起来
- VC中,如何利用程序判断当前处于调试阶段还是应用的运行阶段,详细描述如下:
- 如何在知道CScrollView已经滚动到最底下,或最右边?
- 下载速度设置 是怎么实现的?
- 我的爱姬怎么一开机就自动访问某一网站,应该怎么解决(内空)
- 关于新手学习C++和MFC的问题
- 急:请帮忙-关于在消息中传递数组
#include<stdlib.h>
DWORD kk;
#define DBT_DEVICEARRIVAL 0x8000
HHOOK loghook;
HINSTANCE hInstance;//本程序的句柄
BOOL _stdcall installhook();
void _stdcall endhook(void);
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//MessageBox(NULL,"DLL加载","",MB_OK);
hInstance=(HINSTANCE)hModule;
break;
default:
break;
}
return TRUE;
}BOOL _stdcall installhook(void)
{
loghook=SetWindowsHookEx(WH_KEYBOARD,myloghook,hInstance,0);
if(loghook==NULL)
MessageBox(NULL,"log hook error","kk",MB_OK);
else
MessageBox(NULL,"install hook run","kk",MB_OK);
return true;
}
void _stdcall endhook(void)
{
UnhookWindowsHookEx(loghook);
}
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam)
{
MessageBox(NULL,"安装","",MB_OK);
//ExitWindowsEx(EWX_LOGOFF,0);
//printf("nihao\n");
if(iCode==HC_ACTION)
{
PCWPSTRUCT msg=PCWPSTRUCT(lParam);
if(msg->message==WM_DEVICECHANGE)
{
if(msg->lParam==0x8000)//DBT_DEVICEARRIVAL
{
MessageBox(NULL,"有移动设备插入!","警告!",MB_OK);
}
}
}
return CallNextHookEx(loghook,iCode,wParam,lParam);
}
LIBRARY 1111
EXPORTS
installhook
endhook
我试了试 你的钩子是起作用了 至于逻辑问题 就看你了 嘿嘿
{
loghook=SetWindowsHookEx(WH_CALLWNDPROC,myloghook,hInstance,0); if(loghook==NULL)
MessageBox(NULL,"log hook error","kk",MB_OK);
else
MessageBox(NULL,"install hook run","kk",MB_OK);
return true;
}这里的loghook返回的已经不是0了,但是钩子函数为何不执行呢?
#include "stdafx.h"#include<stdio.h>
DWORD kk;
#define DBT_DEVICEARRIVAL 0x8000
HHOOK loghook;
HINSTANCE hInstance;//本程序的句柄
BOOL _stdcall installhook();
void _stdcall endhook(void);
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
//MessageBox(NULL,"DLL加载","",MB_OK);
hInstance=(HINSTANCE)hModule;
break;
default:
break;
}
return TRUE;
}BOOL _stdcall installhook(void)
{
//查找指定窗口,让指定窗口接收消息.要不然会有N多条消息.好多好多啊.不信可以试试:)
HWND MyHwnd= ::FindWindow(NULL,"Test");
if (MyHwnd == NULL)
{
OutputDebugString("查找窗口失败");
return FALSE;
}
//获得指定窗口的线程ID
DWORD dwThreadID = GetWindowThreadProcessId(MyHwnd,NULL);
loghook=SetWindowsHookEx(WH_CALLWNDPROC,myloghook,hInstance,dwThreadID);
if(loghook==NULL)
{
OutputDebugString("函数挂钩错误");
return FALSE;
} return TRUE;
}
void _stdcall endhook(void)
{
UnhookWindowsHookEx(loghook);
}
LRESULT CALLBACK myloghook(int iCode,WPARAM wParam,LPARAM lParam)
{
//ExitWindowsEx(EWX_LOGOFF,0);
//printf("nihao\n");
if(iCode==HC_ACTION)
{
CWPSTRUCT *msg = (CWPSTRUCT *)lParam;
if (msg->message == WM_DEVICECHANGE)
{
if(msg->wParam == DBT_DEVICEARRIVAL)
{
MessageBox(NULL,"A device or piece of media has been inserted and is now available.","",MB_OK);
//你要做的事情
}
}
}
return CallNextHookEx(loghook,iCode,wParam,lParam);
}
[\CODE]
if(msg->lParam==0x8000)//DBT_DEVICEARRIVAL
{
MessageBox(NULL,"有移动设备插入!","警告!",MB_OK);
}
msg->lParam正确的应该是msg->wParam,拼写错误?