初学者的问题(50分)

  • 主题发起人 主题发起人 xiaocom
  • 开始时间 开始时间
X

xiaocom

Unregistered / Unconfirmed
GUEST, unregistred user!
我想捕获鼠标点击消息,代码如下但只能在自己程序的
form内才有用,鼠标在窗口外或别有程序窗口就不行,怎
样解决这个问题?请指点!
procedure Tform1.Mymessage(var Msg:Tmessage);message wm_lbuttondown;
begin
; ......
; 我的代码
end;

还有,怎么让这个消息处理过程在程序开始时不激活,而在程序运行后可以通
过一个buttonClick事件激活?分不多,请笑纳。为什么别人回答了我的问题
我收不到邮件通知?
 
在别的程序也想?那要钩子的!给你源代码吧。

unit Unit1;

interface

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

type
; TForm1 = class(TForm)
; ; BtnSet: TButton;
; ; BtnEnd: TButton;
; ; procedure BtnSetClick(Sender: TObject);
; ; procedure BtnEndClick(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; { Public declarations }
; end;
function HookPro(iCode:Integer;wParam:wParam;lParam:lParam):lResult;stdcall;
var
; Form1: TForm1;
; hHook:Integer;
; HookFile:TextFile;
; fHandle,lHandle:THandle;
; Cpt:string;
; EvtMsg:TEventMsg;
;
implementation

{$R *.DFM}
function HookPro(iCode:Integer;wParam:wParam;lParam:lParam):lResult;stdcall;
var SysTime:String;
begin
; ;if iCode<0 then
; ; ; result:=CallNextHookEx(hHook,iCode,wParam,lParam)
; ;else
; ;begin
; ; EvtMsg:=PEventMsg(lParam)^;
; ; if (EvtMsg.message =WM_lBUTTONDOWN) or (EvtMsg.message=WM_RBUTTONDOWN) then
; ; begin
; ; ; lHandle:=GetActiveWindow();
; ; ; if not(fHandle=lHandle) then
; ; ; begin
; ; ; ; SetLength(Cpt,256);
; ; ; ; GetWindowText(lHandle,pChar(Cpt),256);
; ; ; ; SetLength(Cpt,StrLen(pChar(Cpt)));
; ; ; ; AssignFile(HookFile,'Hook.txt');
; ; ; ; if not FileExists('Hook.txt') then
; ; ; ; ; ReWrite(HookFile)
; ; ; ; else
; ; ; ; ; Append(HookFile);
; ; ; ; SysTime:=TimetoStr(now)+'打开:';
; ; ; ; Writeln(HookFile,SysTime,Cpt);
; ; ; ; CloseFile(HookFile);
; ; ; end;
; ; fHandle:=GetActiveWindow();
; ;end;
; ;result:=200;
; ;end;
end;

procedure TForm1.BtnSetClick(Sender: TObject);
begin
; hHook:=SetWindowsHookEx(WH_JOURNALRECORD,HookPro,HInstance,0);
end;

procedure TForm1.BtnEndClick(Sender: TObject);
begin
; UnhookWindowsHookEx(hHook);
; ShowMessage('你的使用过程被记录在'+ExtractFilePath(Application.ExeName)+'Hook.Txt'+'下');
end;

end.
 
1。楼上说的没错。用HOOK。
2。我也和你一样:)
 
多谢两位指点但我不一定是想在别的程序窗口上,比如在屏幕上呢?
还是不懂,听说用全局钩子要写*.dll,但上面的代码并没有
调用*.dll文件啊!
 
;钩子是什么?我不懂??(我是初学者)
 
屏幕也是一个窗口,是属于EXPLORER.EXE进程的窗口。
上面老猫写的程序是HOOK的DLL里的代码,具体怎么创建一个DLL,你可以搜索一下以前的已答问题
(如果你身边没有参考书的话)
要想程序运行后由你选择激不激活也VERY EASY,只要放一个BUTTON,在这个BUTTON的
CLICK事件里激活就可以了:)
 
to iamfly:我试了,wjiachun的代码我没有写到*.dll里,就加在我的代码里也行,是不是不用
写*。DLL文件也能用钩子?
 
xiaocom, 写钩子不一定要DLL的啊,不知你被谁误导了,我写的就是钩子。
 
谢谢指点!
 
后退
顶部