如何使鼠标的点击无效(所有程序中) - UP有分~??(100分)

  • 主题发起人 主题发起人 doll_paul
  • 开始时间 开始时间
D

doll_paul

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:无论在什么程序中,MOUSE只能移动,点击按钮无效,但可以点击窗体(即点击窗体
可以成为当初窗体),也只能点击窗体。

我知道应该用HOOK,但不知道如何做,请大家帮助!(分可再加!)
 
看书法.这种问题没有人能帮你!
 
to yypeng,书法不好,你明白什么意思,不就成了?

谢谢~
 
为什么没人回答我啊?分少???看不懂问题?还是什么???
 
可以使用mouse钩子,勾wm_lbuttondown消息,然后判断是否是TButton,我试了一下,98下
可以使用。下面的代码是动态链接库里的代码,host代码就不用贴了吧。只是调用了dll中
的starthook和stophook。
library Hook;
uses
SysUtils, messages, windows,
Classes;

{$R *.res}
var
HookHandle: integer;
FileBuf: pointer;
Hmap: THandle;
function MouseProc(
code: integer; // hook code
wParam: WPARAM; // message identifier
LPARAM: lParam // mouse coordinates
): LResult; stdcall;
var
MouseInfo: pMouseHookStruct;
function IsButton: boolean;
var
p: TPoint;
H: THandle;
ClsName: array[0..255] of char;
begin
Result := false;
MouseInfo := pMouseHookStruct(Lparam);
H := MouseInfo^.hwnd;
GetClassName(h,ClsName,SizeOf(ClsName));
if ClsName = 'TButton' then
Result := true;
end;
begin
result:=0;
if Code<0 then
begin
CallNextHookEx(HookHandle,Code,wParam,lParam);
exit;
end;
if Code = HC_ACTION then
begin
if wparam = WM_LBUTTONDOWN then
begin
if IsButton then
Result := 1
else Result := 0;
end;
end;
end;

function StartHook: integer;export;
begin
Result := 0;
HookHandle := SetWindowsHookEx(WH_MOUSE ,MouseProc,hinstance,0);
Result := HookHandle;
end;
function StopHook: boolean;export;
begin
Result := UnhookWindowsHookEx(HookHandle);
end;
exports
StartHook,
StopHook;
begin
end.
 
如果是在你自己的程序中,不一定要用hook,可以锁定鼠标位置的办法,
使用ClipCursor(*rect)函数,
TRect变量前面加个^,
参数是个矩形区域变量的指针,
把矩形区域弄得很小就行,
呵呵,没有
 
这是用HOOK的一种方法:
HWND wnd = 按钮所在窗口的句柄;
WNDPROC oldProc = SetWindowLong(wnd, GWL_WNDPROC, yourProc);
...
用完后恢复 GWL_WNDPROC。

WNDPROC yourProc(...)
{
if (那个按钮被按下) then 想干什么就干什么
else CallWndProc(oldProc);
...
}
 
通过捕获鼠标消息实现
 
to cg1120
如果是自己的程序,button.enabled=false不就行了?

你的第二种方法是子类化窗体吧,呵呵,不用那么麻烦吧。
 
to all,我当然不是要在自己的程序里用了!并且,我也不想用ClipCursor,因为我想让
MOUSE移动,只是不能点击如按钮之类的东西,但可以点击窗体之类的东西!

to 薄荷,你的代码我会测试的。

大家还有其它好的办法吗?
 
to cg1120,你的方法能不能说的细点?小弟接触HOOK不久,谢谢了~(在Delphi用)!
 
hehe,

我说的方法才是hook呀。
 
to 薄荷,您能否说的细一些!

我对HOOK了解的不多,谢谢了!
 
hook,就是在系统消息链中间挂上你的处理函数,在系统处理前先调用你的代码。关键就是一个
setWindowsHook函数,可以设为鼠标,键盘等hook,你看看帮助就会明白,如果是全局钩子,一
般要放在dll中(log钩子除外)。设置了钩子后,你的处理代码就放在一个mouseproc的回调函数
中。你看看我的代码就会明白的。dll你应该会用吧,宿主程序里两个button,一个调用dll
中的starthook,一个调用stophook。
具体的你找本书看看吧,或者看帮助。不是三言两语说得清的。
 
to 薄荷,谢谢老兄,你上面说的这些基础,小弟是知道的~ ^_^

另请问cg1120写的方法是否可行?因为我感觉他的办法好像比较简单哦!
 
to 楼主
只要把鼠标界定
在一个较小的范围内(此边界应该离窗体的边缘有一定的距离),应该可以实现
你要实现的功能。
 

他那段代码的意思是当鼠标移到button上就用用自己的过程来代替button原来的窗口处理过程,
真的要实现起来我觉得代码不会比我的短。在你自己的过程里要自己判断消息。判断完后还要调用原来的处理过程。
不过,的确可以实现你要的功能。

 
那这么说来,二个办法都很复杂啦????
 
还有他的代码要能在后台随时得到mouse移动到了那个窗体上,还是得设置mousehook吧,
或者使用setcapture,如果用了mousehook,那不如直接在mousehook里判断了
 
后退
顶部