关于HOOK鼠标的难点(200分)

H

hansome

Unregistered / Unconfirmed
GUEST, unregistred user!
我用DLL进行鼠标的全局HOOK
把所有的鼠标消息直接发送到自己的应用程序
一切功能比较正常
但是,发现了三个难点
还望大虾门指点

1、我的本意是,鼠标消息发送到我的应用程序之后,
就把它丢掉。比如说,就算鼠标在某个窗口的工具
栏上移动时,也不会对此窗口产生任何影响,当然
工具栏上的按钮更不会变成3D效果了。但是,当我
把回调函数的返回值设置为0或者是非0值时,都没
有达到预期效果,请问该如何实现?

2、当我用WindowFromPoint函数想获取鼠标下的窗口句
柄时,有发现,它唯独不能返回含有标题栏的窗口句
柄,其它的,如编辑框、按钮等窗口都很正常,真是
奇怪。当然,如果,鼠标不是处于HOOK的时候,一切
都很正常,不知大虾们有何高见?

3、当鼠标处于HOOK时,又该如何设置光标形状呢?反正
我知道普通的Screen.Cursor:=crHandPoint是不行的。
 

嘿嘿,我也想知道
 
我很相信大富翁的
应该有牛B的人
耐心等待。。。
 
1、我的本意是,鼠标消息发送到我的应用程序之后,
就把它丢掉...
result:=-1;

2、当我用WindowFromPoint函数想获取鼠标下的窗口句
柄时...
Windows 98以后要范围其他窗口最好用AttachThreadInput
1. AttachThreadInput(
GetCurrentThreadID,
GetWindowThreadProcessID(GetForegroundWindow,nil),True);
2. GetWindowText
3. AttachThreadInput(
GetCurrentThreadID,
GetWindowThreadProcessID(GetForegroundWindow,nil),false);
 
实在不好意思,第一个和第二个问题我正在查找相关资料,
第三个问题这样您试试行不行 Handle.hCursor := LoadCursor(0, IDC_ARROW);
 
谢谢各位!
wql:
result := -1;我已经试过了,就是我上面所说的
非0值的一种,当然,result := 1;我也是试过的,但是
没有效果,所以很奇怪。我是这样加的,麻烦帮我看看:
if (Code >= 0) and (MonitorWnd <> 0) then
begin
case Msg of
WM_LBUTTONDOWN:
begin
SendMessage(MonitorWnd, WM_LBUTTONDOWN, 0, (MouseHookStruct^.pt.x shl 16) + MouseHookStruct^.pt.y);
end;
WM_LBUTTONUP:
begin
SendMessage(MonitorWnd, WM_LBUTTONUP, 0, (MouseHookStruct^.pt.x shl 16) + MouseHookStruct^.pt.y);
end;
WM_LBUTTONDBLCLK:
begin
end;
WM_RBUTTONDOWN:
begin
end;
WM_RBUTTONUP:
begin
end;
WM_RBUTTONDBLCLK:
begin
end;
WM_MBUTTONDOWN:
begin
end;
WM_MBUTTONUP:
begin
end;
WM_MBUTTONDBLCLK:
begin
end;
WM_MOUSEMOVE:
begin
SendMessage(MonitorWnd, WM_MOUSEMOVE, 0, (MouseHookStruct^.pt.x shl 16) + MouseHookStruct^.pt.y);
end;
end;
Result := -1;
end
else
Result := CallNextHookEx(HookHandle, Code, Msg, MouseHook);
 
if (Code >= 0) and (MonitorWnd <> 0) then
begin
case Msg of
WM_LBUTTONDBLCLK,
WM_RBUTTONDOWN,
WM_RBUTTONUP,
WM_RBUTTONDBLCLK,
WM_MBUTTONDOWN,
WM_MBUTTONUP,
WM_MBUTTONDBLCLK:
Result := -1;
else
goto _NHook;
end
else
_NHook:
Result := CallNextHookEx(HookHandle, Code, Msg, MouseHook);
 
UnHookWindowsHookEx(HookHandle);
 
接受答案了.
 
顶部