关于消息传送与接受的问题???????????(50分)

  • 主题发起人 主题发起人 LitterTiger
  • 开始时间 开始时间
L

LitterTiger

Unregistered / Unconfirmed
GUEST, unregistred user!
我把主窗体Form1.Handle给dll的一个变量
dll用这个句柄给Form1发消息,但Form1是前台时能接到,后台就接不到了。
为什么???怎么解决??
接受是用的message_map.
 
应该广播消息!
 
handle用broadcast,什么都收不到。

 
你能把这部分程序贴出来吗?
 
原码现在不在。
 
用钩子,可以做到!
 
只是在我的程序内部发送消息,还是自己定义的,
不会用的到钩子吧!
 
代码如下:
extern "C" __declspec(dllexport) void __stdcall SetHook(HWND,bool);
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam);
//----------------------------------------------------------------------------------------------------
static HINSTANCE hInstance; // 应用实例句柄
HWND hWndMain; // MainForm句柄
static HHOOK hKeyHook; // HOOK句柄
static const myMessage=2000; // 自定义消息号
//----------------------------------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{ hInstance=hinst; return 1; }
//----------------------------------------------------------------------------------------------------
void __stdcall SetHook(HWND hMainWin,bool nCode)
{
if(nCode) // 安放HOOK
{
hWndMain=hMainWin;
hKeyHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)HookProc,hInstance,0);
}
else // 卸下HOOK
UnhookWindowsHookEx(hKeyHook);
}
//------------------------------------- ---------------------------------------------------------------
LRESULT CALLBACK HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{ ShowMessage(IntToStr(wParam));
ShowMessage(IntToStr((unsigned int)hWndMain));
PostMessage(hWndMain,myMessage,wParam,lParam);
// 向调用窗体发消息myMessage和虚拟键码(char)(keyMSG->paramL)
return((int)CallNextHookEx(hKeyHook,nCode,wParam,lParam));
}
//----------------------------------------------------------------------------------------------------
 
跨进程的钩子,你的dll是运行在不同进程空间的,也就是说,hWndMain这个变量,在不同的进程是不相关的
你不要以为他在别的进程的时候也是你的main form
包括 hKeyHook 也是这样
解决办法是把这些需要跨进程的变量放入用filemapping实现的跨进程的共享内存:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=635375
重点看:通过建立内存映象文件以共享内存
 
你的意思好象很对,但我还是不太明白.
dll不是和主程序在同一个进程空间?
在我的mian window在前台时,它怎么工作正常??
这是因为dll的问题还上callbackproc的问题??
请赐教!!
你说的filemap我知道.
 
系统钩子,它是附加在别的进程的
比如鼠标钩子来说吧,当鼠标在别的进程的窗口上移动的时候,windows
把钩子dll装入那个进程,所以那个时候运行的进程空间是发生鼠标事件的
那个进程。你的程序在前台的时候,发生鼠标事件的就是你的进程,那个时候
代码在你的进程空间运行
总之,系统钩子,代码运行在发生事件的那个进程。(windows会把你的dll
装入相应发生了事件的进程)
 
LitterTiger,你自己编写的含有钩子的DLL是在自己的进程中,但在调用的时候加载到系统的
进程,这样即使是相同的HANDLE也不知道互相发生了什么,因为进程不同!必须用共享内存的
方法才可以是得大家都访问同一个地址,这样才可以保证你的正确调用!pipi是个高手,说的
没有错,你要仔细看看他提供的链接~!
 
谢谢几位了!
看来hook挂在什么thread上,就在什么的空间上执行了?
这是唯一的解释了,是吗?
 
真理就是这样,不用其他解释了
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部