快来帮我,为什么传给DLL的参数无效?(100分)

  • 主题发起人 主题发起人 kid
  • 开始时间 开始时间
K

kid

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个键盘HOOK小程序,主要功能就是截获并处量键盘消息,在满足条件时向
事先指定的窗口发出特定的消息告知。
主程序部分作用是挂起DLL中的HOOK,并将指定窗口句柄_whnd传给它,在HOOK中通
过postmessage(_whnd,消息名,wparam,lparam)向指定窗口传送特定消息。但经测试,消
息并没有传给指定窗口,必须在HOOK中用_whnd:=findwindow(指定窗口名)重新获得指定
窗口的句柄,特定的消息才传给了指定的窗口。
这是为什么?为什么主程序中传给DLL的窗口句柄无效?怎么办?
 
窗口句柄实际上是一个指向特定数据区的指针, 而每一个进程有自己的地址空间
所以需要在进程自己获取句柄
 
这里是我的程序的简单片断:
主程序:
begin
.......
enablehook(myhwnd);
//挂起HOOK,并把指定窗口的句柄传去。
.......
end;

DLL:
var myhandle:HWND;
//设一个全局变量用来保存从主程序传来的指定窗口句柄。
function enalbehook(_whnd:HWND):bool;export;
begin
myhandle:=_whnd;
//这里将主程序传来的指定窗口句柄赋值给全局变量
//myhandle,以便后面HOOK处理函数用。
setwindowhookex(....);
......
end;
function keyhookproc(icdoe,wparam,lparam)... //这个就是HOOK处理函数。
begin
.......
postmessage(myhandle,消息名,wparam,lparam);
//这句就是向指定窗口
//传特定消息。
......
end;

但消息并没有传给指定窗口。
 
你是想由主程序传递一个窗口句柄给HOOK.DLL,然后让hook.dll进行处理吧。
如果是这样的话,你可以取得你要传递的窗体的caption,然后在hook.dll中findwindow
这样你就可以自由操作啦/
例:
主程序
begin
.......
enablehook('objectform.caption');
//把指定窗口的标识传过去。
.......
end;

DLL:
uses
sharemem..
........
var myhandle:HWND;
//设一个全局变量用来保存从主程序传来的指定窗口句柄。
function enalbehook(_whnd:string):bool;export;
begin
myhandle:=findwindow(nil,_whnd);
//在这里你得到以前想传递的窗口句柄
setwindowhookex(....);
......
end;
function keyhookproc(icdoe,wparam,lparam)...
begin
.......
postmessage(myhandle,消息名,wparam,lparam);

......
end;

也就是说你把以前在主程序中处理窗口句柄的操作放到dll中来做,主程序只要负责窗体目标
窗体的标识就可以啦/
 
to aq100:
我也是这样解决问题的,不过现在还想知道,为什么传过去的窗口句柄在hook.dll中
不起作用呢?想知其所以然啦。
tseug,能说明点吗?
 
接受答案了.
 

Similar threads

回复
0
查看
863
不得闲
S
回复
0
查看
816
SUNSTONE的Delphi笔记
S
S
回复
0
查看
735
SUNSTONE的Delphi笔记
S
后退
顶部