关于RegisterHotKey的问题 求大哥们帮忙解决!!!!

quhuiwangjing 2011-06-03 10:21:36
RegisterHotKey 是注册热件

现在的问题是这样如果我 在 IE 里面注入一个 dll 在 dllmain 里面直接使用RegisterHotKey 就可以注册到!


如果在dllmain 里 直接在load 一个 2.dll 然后在2.dll使用RegisterHotKey 这个api 怎么就不行呢???

相关函数的说明我已经查过 意识是说 在本身的线程里面就可以使用这个函数

如果 我按我说的上面 在 2.dll里面使用注册一个窗口 热键 应该用什么函数呢???


求大哥们帮帮小弟 小弟将会感激您的!!!!
...全文
229 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Lactoferrin 2011-06-04
DWORD WINAPI ZHU_CE(PVOID param)
{
MSG msg;
RegisterHotKey(0,1,0,VK_F1);
while (GetMessage(&msg, 0, 0, 0) != -1)
{
if (msg.message == WM_HOTKEY)
{
MessageBoxW(0,0,0,0);
}
}
return 0;

}
回复
quhuiwangjing 2011-06-04
//监视
DWORD WINAPI JIAN_SHI(PVOID param)
{

while(true)
{
GetMessage(IpMsg,NULL,0,0);
Sleep(1);
}
return 0;

}
//注册
DWORD WINAPI ZHU_CE(PVOID param)
{

::RegisterHotKey(NULL,1,0,VK_F1);
return 0;

}

BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call)
{

case DLL_PROCESS_ATTACH:

HANDLE hThread = CreateThread(NULL, 0, JIAN_SHI, NULL, 0, NULL);
CloseHandle(hThread);

HANDLE hThread = CreateThread(NULL, 0, ZHU_CE, NULL, 0, NULL);
CloseHandle(hThread);



break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
大哥你说用线程来做消息循环部分我不会写啊 ! 希望给予帮助!!!!! 上面是我的代码!
回复
quhuiwangjing 2011-06-04
明白了 谢谢大哥!!! 果然在不同的线程不一样的!! 非常感激!!
回复
quhuiwangjing 2011-06-03
好 大哥的意识 我有点 明白了 ! 我明天 去 按大哥的说法实验 !外一明天有不明白的地方再问 然后 行不行 明天 都给 分 !!!!最后一句 谢谢大哥 小弟 感激不禁!!!
回复
Lactoferrin 2011-06-03
不需要处理消息 得镶嵌在 ie的窗口中,你在ie进程创建一个新的线程处理这个消息也能这样
而且RegisterHotKey不是限制在一个窗口的,你在哪里按都会有消息,RegisterHotKey的hwnd只是用来接收消息的,根本不需要这个hwnd
回复
quhuiwangjing 2011-06-03
不 是 很 明白 !! 那 起 不是 在 这个线程中 !消息 循环 有用 ! 关键 是我 想 在 ie里面按键盘F1就能出MessageBox 在别处按不出!就是说处理消息 得镶嵌在 ie的窗口中! 建立一个消息循环处理WM_HOTKEY 我在ie窗口按会出吗 那不是窗口 现成 吗??不是很理解窗口和和消息 希望大哥 指点!!!!!!
回复
Lactoferrin 2011-06-03
CreateThread创建一个线程
这个新的线程中调用RegisterHotKey注册热键,然后建立一个消息循环处理WM_HOTKEY
回复
quhuiwangjing 2011-06-03
楼上 大哥 比如 说 ! 给个 模板就可以 !
回复
Lactoferrin 2011-06-03
你这样做不太好,我建议你创建一个专用的线程来处理WM_HOTKEY
回复
quhuiwangjing 2011-06-03
大哥 帮帮忙 吧 !!!
回复
quhuiwangjing 2011-06-03
1.dll

DWORD WINAPI UnloadProc2(PVOID param)
{
while(true)
{
::Sleep(50);
ReadProcessMemory(GetCurrentProcess(), (LPCVOID)ie_tz, &dwBaseAddr2, 4, NULL); //特征代码2
if(dwBaseAddr2!=0)
{
//::MessageBox(NULL,"haha","haha",MB_OK);
::LoadLibrary("c:\2.dll");
goto haha2;
}
}
haha2:
return 0;
}

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hDll = (HMODULE)hModule;
hThread2= CreateThread(NULL, 0, UnloadProc2, NULL, 0, NULL);
::CloseHandle(hThread2);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;

2.dll


long CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
long ret;
if (uMsg==WM_HOTKEY)
{
switch(wParam)
{
case 1: Messagebox break;
case 2:
break;
case 3:
break;

}
/*
_asm
{
MOV DWORD PTR DS:[0x01B40A04],0x000021A5
}
*/
}
ret=::CallWindowProcA((WNDPROC)preWinProc,hwnd,uMsg,wParam,lParam);
return ret;
}


BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch(ul_reason_for_call)
{

case DLL_PROCESS_ATTACH:
//获得本身进程PID号
if(!(Getpro(PN)==GetCurrentProcessId()))
{
g_hDll = (HMODULE)hModule;
HANDLE hThread = CreateThread(NULL, 0, UnloadProc, NULL, 0, NULL);
CloseHandle(hThread);
break;
}
quhui=::FindWindow(NULL,"淘宝网");
if (quhui!=0)
{
preWinProc=::GetWindowLong(quhui,(-4));
::SetWindowLong(quhui,(-4),(long)WindowProc);
::RegisterHotKey(quhui,1,0,VK_F1);
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}




回复
quhuiwangjing 2011-06-03
好 你等 大哥 !!!
回复
Lactoferrin 2011-06-03
哪个线程都行,只要有消息循环,你上代码
回复
quhuiwangjing 2011-06-03
其实 是 这样 我 在 1.dll中创建个现成 来load 2.dll (由于需要必须这样做 !) 好象 这个函数只能注册本身线程的 !
回复
Lactoferrin 2011-06-03
上代码
回复
quhuiwangjing 2011-06-03
是 这样 我 让 2.dll注册上热键 弹出个 MessageBox 结果弹不出!
回复
Lactoferrin 2011-06-03
亲手实验过,你把你觉得不行的依据说出来,程序有什么现象
回复
quhuiwangjing 2011-06-03
楼上 的 大哥 我 亲手 实验过 的 !!!!求楼上热心的 大哥 帮帮 忙 吧
回复
Lactoferrin 2011-06-03
你怎么知道不行的
回复
相关推荐
发帖
进程/线程/DLL
创建于2007-09-28

1.5w+

社区成员

VC/MFC 进程/线程/DLL
申请成为版主
帖子事件
创建了帖子
2011-06-03 10:21
社区公告
暂无公告