SetWindowHookEx問題

patricklee01 2005-03-01 02:32:17
建立一個WIN32 DLL,調用時發現鉤子沒效,檢查時發現跑到SetWindowHookEx出錯,請各位指教
調用函數採用CreateRemoteThread的WIN32 Console Application

代碼如下
======================================================
#include "stdafx.h"
//設置共享代碼段
#pragma data_seg(".SHARDAT")
static HHOOK hkb=NULL;
#pragma data_seg()


BOOL APIENTRY DllMain( HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
switch(reason)
{
case DLL_PROCESS_ATTACH:
// MessageBox(NULL,"TEST SUCESS","REMOTE",MB_OK);
InstallHook();
break;
case DLL_PROCESS_DETACH:
UninstallHook();
break;
default:
break;
}
return TRUE;
}

BOOL InstallHook()
{
MessageBox(NULL,"InstallHook","Hook",MB_OK); //成功調用,顯示對話框
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,0,0);
return TRUE;
}

BOOL UninstallHook()
{
UnhookWindowsHookEx(hkb);
return TRUE;
}


LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{

MessageBox(NULL,"KeyBoard","Hook",MB_OK);//這裡調用失敗,沒有顯示對話框

if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
{
switch(wParam)
{
case '1':MessageBox(NULL,"Press 1","Hook",MB_OK);break;
case '2':MessageBox(NULL,"Press 2","Hook",MB_OK);break;
case '3':MessageBox(NULL,"Press 3","Hook",MB_OK);break;
default:
break;
}
}
LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam );
return RetVal;
}
...全文
217 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
patricklee01 2005-03-02
  • 打赏
  • 举报
回复
謝謝,已經解決
zkxz 2005-03-02
  • 打赏
  • 举报
回复
不好意思,昨天因为要下班所以下线了。

同意 KeNan_Net(柯楠)!
KeNan_Net 2005-03-01
  • 打赏
  • 举报
回复
使用HINSTANCE hInstance=GetCurrentProcess(); // 这里不对;
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInstance,0);

上面的不对;
SetWindowsHookEX中的hInstance是指DLL实例句柄,你应该让它和DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved)中的hInstance一致,也就是先在DllMain函数中保存一下;


cnwolf 2005-03-01
  • 打赏
  • 举报
回复
学习!关注!
真相重于对错 2005-03-01
  • 打赏
  • 举报
回复
改为hkb=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyboardProc,hInstance,0);试试


patricklee01 2005-03-01
  • 打赏
  • 举报
回复
我的EXE中不能調用DLL,我的EXE要用CreateRemoteThread在其他EXE(如explorer.exe,notepad.exe)中插入DLL.
zkxz 2005-03-01
  • 打赏
  • 举报
回复
你可以将InstallHook定义成这样:
extern "C" BOOL __declspec(dllexport) WINAPI InstallHook(HINSTANCE hInstance);
然后在Exe中调用InstallHook时这样写:
InstallHook(::AfxGetInstanceHandle());
不要在
case DLL_PROCESS_ATTACH:
时调用。
patricklee01 2005-03-01
  • 打赏
  • 举报
回复
我試過用HINSTANCE hInstance=GetCurrentProcess();

hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hInstance,0);

但還是不行
zkxz 2005-03-01
  • 打赏
  • 举报
回复
在MSDN中关于HHOOK SetWindowsHookEx(
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
);
的解释中有这么一句话:
An error may occur if the hMod parameter is NULL and the dwThreadId parameter is zero or specifies the identifier of a thread created by another process.
就是说,"hMod"和"dwThreadId"不能同时为0。你应该把hMod设为本进程。
zzc21th 2005-03-01
  • 打赏
  • 举报
回复
这两天我也在做钩子的东西,共同学习

你把钩子处理函数改成
extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)

而把下面的消息框放到下面的if语句里面,好像是要接收到按键信息才会做出反应
而且在这里应该用 AfxMessageBox() 来弹出消息,MessageBox() 好像不能弹出
patricklee01 2005-03-01
  • 打赏
  • 举报
回复
up
patricklee01 2005-03-01
  • 打赏
  • 举报
回复
剛剛在UnistallHook中也加上MessageBox,退出時也成功顯示對話框,但好像鉤子設置沒有成功

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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