SetWindowsHookEx问题

vchell 2009-08-14 10:57:29
在常规静态dll中使用钩子函数时出现以下错误:
d:\backup\final\final.h(56) : error C2664: 'SetWindowsHookExA' : cannot convert parameter 2 from 'long (int,unsigned int,long)' to 'long (__stdcall *)(int,unsigned int,long)'

源码:
_declspec(dllimport) void SetHookKeyboard()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}

...全文
292 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
你妹的特盗不 2009-08-18
  • 打赏
  • 举报
回复
怎么解决的啊~~贴出来让大家知道啊~~
zoulie 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fishion 的回复:]
SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC) KeyboardProc,GetModuleHandle("Hook"),0);
[/Quote]
同意
fishion 2009-08-14
  • 打赏
  • 举报
回复
SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC) KeyboardProc,GetModuleHandle("Hook"),0);
vchell 2009-08-14
  • 打赏
  • 举报
回复
声明没有问题
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information )
{
return 1;
}
  • 打赏
  • 举报
回复
可在 xxxx.def 中 说出导出函数 用 SetHookKeyboard 这种形式就可以 不用加括号
  • 打赏
  • 举报
回复
可在 xxxx.def 中 说出到处函数 用 SetHookKeyboard 这种形式就可以 不用加括号
Yofoo 2009-08-14
  • 打赏
  • 举报
回复

CALLBACK


参考MSDN的 __cdecl, __stdcall
Yofoo 2009-08-14
  • 打赏
  • 举报
回复

CALLBACK


参考MSDN的 __cdecl, __stdcall
  • 打赏
  • 举报
回复
没有试过这种情况
正确用法 应是

先声明 LRESULT CALLBACK KeyboardProc( int code,
WPARAM wParam,
LPARAM lParam
);

再 SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
xylicon 2009-08-14
  • 打赏
  • 举报
回复
LRESULT CALLBACK KeyboardProc( int code,
WPARAM wParam,
LPARAM lParam
);


KeyboardProc回调函数应该声明 CALLBACK 也就是__stdcall
skybblue 2009-08-14
  • 打赏
  • 举报
回复
KeyboardProc函数定义的的不对,应该这样定义:
LRESULT CALLBACK KeyboardProc( int code,
WPARAM wParam,
LPARAM lParam
);
h490516509 2009-08-14
  • 打赏
  • 举报
回复
顶一下
vchell 2009-08-14
  • 打赏
  • 举报
回复
越详细越好 再加分
vchell 2009-08-14
  • 打赏
  • 举报
回复
问题已解决 还是谢谢大家
MoXiaoRab 2009-08-14
  • 打赏
  • 举报
回复
怎么会冒这么多问题?你百度搜下看看,钩子文章很多的
vchell 2009-08-14
  • 打赏
  • 举报
回复
其实我就是想在一常规动态链接库中实现钩子函数过程,但是不知道为什么每次在定义导出函数的时候即安装钩子的函数中,总是报错;以前没用过常规动态链接库,不知道是不是它出了什么问题,有什么特别需要注意的吗!谁能贴一段完整代码给我参考参考将不甚感激
zoulie 2009-08-14
  • 打赏
  • 举报
回复
你声明LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam) 地方的代码贴出来
zoulie 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lfs09 的回复:]
这样,我使用的代码

C/C++ code
DllExportvoid WINAPI Install()
{
Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)LauncherHook,theApp.m_hInstance,0);
}

LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
{
LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);//这里做按键判断if(nCode==HC_ACTION)
{if(lParam&0x80000000)
{//按下 bit 31 set 1 按下响应 set 0 弹起响应 }return Result;

}
[/Quote]
这段代码是可以的,你检查一下其他地方的代码有没有问题,
d:\backup\mfcdll\dll\dll.h(45) : error C2440: 'type cast' : cannot convert from '' to 'long (__stdcall *)(int,unsigned int,long)'
明显是你头文件有错误
再rebuild all试试
你妹的特盗不 2009-08-14
  • 打赏
  • 举报
回复
SetWindowsHookEx

建议看下 msdn上面关于 SetWindowsHookEx的知识~
你妹的特盗不 2009-08-14
  • 打赏
  • 举报
回复
这样,我使用的代码


DllExport void WINAPI Install()
{
Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)LauncherHook,theApp.m_hInstance,0);
}

LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
{
LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);
//这里做按键判断
if(nCode==HC_ACTION)
{
if(lParam & 0x80000000)
{
//按下 bit 31 set 1 按下响应 set 0 弹起响应
}
return Result;

}
加载更多回复(2)

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧