为什么:CM_MOUSELEAVE不好用?(10分)

  • 主题发起人 主题发起人 嫩手
  • 开始时间 开始时间

嫩手

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
inherited;
while Form1.Left<Screen.Width-3do
begin
Form1.Left:=Form1.Left+1;
Application.ProcessMessages;
end;
end;
这句代码在鼠标离开窗体后再点击其它窗体或桌面才管用,能不能做到像QQ那样,只要离开
窗体就执行的?
 
QQ那个好像是用Timer来完成的,有这样的控件就是用Timer来完成的
并且控件的CM_MouseLeave事件是由本身Form发出的,如果你是在Form上想用这个事件好像
是无法达到这个功能
 
QQ那个窗体好像不是用TIMER来实现的,是用全局的鼠标勾子来实现的,
至于鼠标钩子的实现方法,以前的贴子讲了很多,没有必要再贴了吧!
 
那可以告诉我地址吗?
 
你用hook和mouse作关键词能搜出一大堆。
 
在mousemove事件中也可以。
 
to ego:
能给出个地址吗?没找到
 
private
protected
procedure CMMouseLeave(var Message: TMessage);
message CM_MOUSELeave;
{ Private declarations }
public
{ Public declarations }
end;

procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
inherited;
while Form1.Left<Screen.Width-3do
begin
Form1.Left:=Form1.Left+1;
Application.ProcessMessages;
end;
end;
不会出现你说的情况
 
不行呀?我把代码拷贝到Unit文件里,但就是效果不好,为什么?
 
CM_MOUSELeave 的确不够灵敏,是这样的
推荐用 Timer 定时测试,我记得 Another_eyes 大虾就是这样用的:)
 
下面是一个窗口钩子,运行就可以看到,鼠标进出窗体,根本不能获得所需要的消息。
所以,即便是使用钩子,也需要是系统钩子,或者老老实实地使用定时器。
{ function MyHook(var Message: TMessage):boolean;
}
function TForm1.MyHook(var Message: TMessage): boolean;
begin
with Messagedo
Memo1.Lines.Add(Format('消息 ID:$%d;'+#9+'WParam:$%d;'+#9+'LParam:$%d',
[Msg,WParam,LParam]));
Result:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.HookMainWindow(MyHook);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Application.UnhookMainWindow(MyHook);
end;
 
最简单的方法是在窗体上放一个ScrollBox或其它控件,让其Allclient;在它上写CMMouseLeave
 
那OICQ是怎么实现的?
 
OICQ 是一个 app bar(Application Desktop Bar),跟Windows的任务栏是一样的
 
to 教父:
控件也是代码组成的,难道自己写就不成?
 
Delphi的程序结构好像和标准的Win32程序不同也!
运行Delphi写的程序好像还多一个Application进程?
 
QQ现在新的版本回信息旁边有个显示广告的,鼠标移入就显示广告,移出没有了,很好呀
,这应该不是什么控件吧,这个很难吗?
 
嫩手:
  如果你的程序始终是active的,那么用TTimer足够了;如果想你的程序在后台运行时也能捕获mouse,
那么只有使用MouseHook了。
  其实仅仅做一个捕获Mouse位置的Hook并不难。我帮你搜索一篇,你照着做就可以了。
 
不好意思,找了一下没找到Mouse Hook方面的,只有Keyboard hook方面的多......
所以干脆自己写了一个 ^_^
--------------------MouseHook.DPR------------
Lirbrary MouseHook;
uses main in 'main.pas';
exports
EnableMouseHook, DisableMouseHook;
begin
HookDC:=0;
end;

----------------main.pas----------------------
unit main;
interface
uses windows, message;
type
TmyData = record
H: Hwnd;
end;

var
HookDC: HHook;
procSaveExit;
Pointer;
MapFile: THandle;
ShareData: ^TMyData;
const
WM_MyMousMsg = WM_User + 100;
function MouseProc(nCode:integer;
wParam:wParam;
lParam:lParam):lResult;
stdcall;
export;
fcuntion EnableMouseHook(hd: Hwnd);
export;
function DisableMouseHook:bool;
export;
procedure HotMouseHookExit;
far;
proceudre CreateMapFile;
procedure CloseMapFIle;
implementation
procedure CloseMapFile;
begin
UnMapViewOfFile(ShareData);
CloseHandle(MapFile);
end;

procedure CreateMapFile;
begin
MapFile := CreateFileMapping($FFFFFF, nil, Page_ReadWrite,0,sizeof(sharedata),'sharedatafile');
sharedata := MapViewOfFile(mapfile,file_map_write,0,0,sizeof(sharedata));
end;
procedure EnableMouseHook(hd: Hwnd): bool;
export;
begin
result := false;
if HookDC <> 0 then
exit;
ShareData.H := hd;
HookDC := SetWindwosHookEx(WH_Mouse, mouseproc, HInstance, 0);
Result := HookDC <> 0;
end;

function MouseProc(nCode:integer;
wParam:wParam;
lParam:lParam):lResult;
stdcall;
export;
var
mhs: pMouseHookStruct;
begin
result := CallNextHookEx(HookDC, nCode, wParam, lParam);
if wParam = WM_MouseMove then
begin
mhs:=pMouseHookStruct(lParam);
if mhs.pt.x < 3 then

begin
result := 1;
postMessage(ShareData.H, wm_myMouseMsg, mhs.hwnd,0);
end;
end;
end;

function DisableMouseHook:bool;
export;
begin
UnHookWindowsHookEx(HookDC);
HookDC := 0;
Result := true;
end;

procedure HotMouseHookExit;
begin
if HookDC <> 0 then
DisableMouseHook;
exitproc := procsaveexit;
end;

initalization
CreateMapFile;
finalization
CloseMapFile;
end;

-----------新建一个project1.dpr---------------
......
----------unit1.pas----------------------
unit unit1;
interface ......
type
TMainForm = class(TForm)
Button1: TButton;
button2: tButton;
procedure Button1Click(Sender: TOBject);
procedure Button2click(sender: TObject);
private
proceudre WndProc(var message: TMessage);
override;
end;

......
const
MW_myMouseMsg = WM_User + 100;

function EnableMouseHook(hd: Hwnd): bool;
external 'MouseHook.DLL';
function DisableMouseHook:bool;
external 'MouseHook.dll';
......
procedure TMainFOrm.WndProc(var message: TMesage);
begin
inherited WndProc(Message);
if message.msg = wm_mymousemsg then
begin
application.bringtofront;
...... //你需要做的事情
end;
end;

procedure TMainFOrm.button1.click(Sender: TObject);
begin
if enablemousehook(handle) <> true then
showmessage('鼠标钩子已经装载或装载错误!');
end;

proceudre TMainForm.button2click(......);
beign
if disablemousehook <> true then
showmessage('鼠标钩子解除发生错误!');
end;

呼~~~~~~~~~~~~~~总算打完了。在网吧上网真不方便,输入法都不顺手的说 :(
我只测试了一下,在D3 + win2000pro下成功。
打得太快,可能其中有错误或遗漏 ^_^ ,你先试一试吧!
 
后退
顶部