一个关于钩子的极难得问题!棘手!(100分)

  • 主题发起人 主题发起人 小乖
  • 开始时间 开始时间

小乖

Unregistered / Unconfirmed
GUEST, unregistred user!
WH_KeyBoard
用键盘钩子函数调用dll里面的函数,以获得系统键盘消息.
在dll中,uses了xxx.pas,为什么在钩子所调用的函数中,不可以执行类似form1.edit1.text:='aa'的语句?
一旦出现,就非法操作.

??
高手指点!
 
将Edit1.handle作为参数传递,试验一下
 
To alaclp:
不可以.在dll里面的其他函数sendmessage给edit1.handle都可以,都能成功,可是在钩子函数里面不可以.不知道为什么,很奇怪.
 
大富翁没有高手了么?
 
这是可以的啊,也许你传的handle有问题吧/
我的钩子里就可以随意的sendmessage啊/
仔细检查一下,肯定是你有个地方写得不合理/
 
To: aq100
我不信.
你可以做个例子给我么?
kekeyingjun@163.com
 
win2000禁止跨进程读其他edit
win95可以 98 two好象也不行
 
你传一个EDIT的椐柄肯定不行,那是因为每个应用程序都在自己的内存空间运行,同样
是00036E90的椐柄值,在不同程序意义不一回事。你可以用应用程序窗口椐柄,发消息
给哪个窗口,发消息要EDIT1获得焦点,发消息写内容。。。
 
To:wangjiankang
能给个例子么?
oicq:10022959
email:kekeyingjun@163.com
 
Gec:
win2000禁止跨进程读其他edit

在windows系统下,什么事都是可能的,想读其他的edit ,狠点的可以采用读内存的方式
一般的还是通过应用程序的句柄来访问。

小乖:如果是单纯的实现功能的话,有很多种变通的方法,如果非得这样的话,我可以告诉你
其实你已经实现啦,你仔细思考一下:
为什么在dll里面的其他函数sendmessage给edit1.handle都可以,都能成功
你自己很容易就解决的/
 
TO : aq100
希望您能亲自试验一下,只要是系统调用的函数,不能sendmessage给事先传递过来的edit1.handle
如果是从程序的一个事件,调用dll里面的函数,函数是可以正常sendmessage,甚至dll里面如果uses unit1 "unit1.pas"的话,就可以分享unit1的变量.

TO : wangjiankang
??????????回话!

 
这一语句你是在什么情况下执行的,
把程序贴出来!
可能问题不在这条语句。
 
其实就是简单的几条语句.

这样吧,哪为大哥能给小弟做一个例子:监控系统键盘消息,把每次的按键信息返回到程序中
注意,是系统的键盘消息,而不是单个进程的键盘消息.
 
我也遇到了同样的问题,真的很奇怪??
高手出来啊
 
采用内存映射文件技术可解决这类问题。
 
拿分来,不用动态库,安装JournalRecord监视系统消息。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}


function JournalRecordProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
Result:=0;
if nCode=HC_ACTION then
begin
if PEventMsg(lParam).message = WM_KEYDOWN then
Form1.Edit1.Text:=Form1.Edit1.Text+Chr(PEventMsg(lParam).paramL);
end
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
if SetWindowsHookEx(WH_JOURNALRECORD, JournalRecordProc, hInstance, 0)=0 then
ShowMessage('Hook失败');
end;

end.
 
后退
顶部