如何响应屏幕上的鼠标事件。(100分)

  • 主题发起人 主题发起人 liangliang
  • 开始时间 开始时间
L

liangliang

Unregistered / Unconfirmed
GUEST, unregistred user!
如何响应屏幕上的鼠标事件。如屏幕上作图之类的。
 
在onmousemove,onmousedown,onmouseup事件中处理,
 
什么意思,不是很懂。
 
你要在form上做图的话,就在form的那些mouse事件中处理,
你看事件参数,可以知道当前mouse position,which button is pressed...
 
我指的屏幕是桌面上。
是这样的,我想实现的功能是鼠标在屏幕上移动,若移动到某应用程序则能在应用程序上画出一个框。这类似于'HyperSnap-Dx'中的用windows截图
时所见的情形。
不知如何实现,或者谁能告诉我HyperSnap-Dx是怎么作的。

 
一个很简单的办法:
建立一form, setwindowrgn(form.handle, createrectrgn(-1,-1,0,0), true);
setcapture(form.handle), 然后就可以用form.onmousemove, onmousedown, onmouseup等事件了, 而且窗口在屏幕上不可见(却是actived).
 
用mouse hook
 
To Another_eYes:
你的方法虽然简单但并能解决我的问题啊。
setcapture 只有在当前程序活动时有效,而且我在哪画框呢?

我发现HyperSnap-Dx截图时画面是静止的,所以我猜想它也许是先将整个屏幕截
下,然后在该图上处理画框,但若鼠标在该图上移动又如何取得其它程序句柄以取得某
window的rect,去画画框呢?难道可以在form上移动而把鼠标移动映射到桌面以取
得句柄?
不知哪位高手能指点一二?
 
anothereyes 的方法应该可以.就是你启动的程序在后台运行.如同在屏幕上画一样
我只知道如何可以建立程序接受系统消息.
private
procedure wndproc(var message;tmessage);
.
.
procedure tform1.wndproc(var message;tmessage);
var
pos:tpoint;
dc:hdc;
begin
if message.lparam=wm_mousemoue then
getdc(0);屏幕句柄
getcursor(pos);鼠标位置;
.
.如何画图调用 winapi 自己查吧!

 
在一个Timer里试试下面代码,不想用Timer就用Mouse Hook。

var p:TPoint; r:TRect;
begin
GetCursorPos(p);
GetWindowRect(WindowFromPoint(p),r);
DrawFocusRect(GetDC(0),r); //画Rect的方法参照这句自己发挥吧。
end;
 
to o*o:
In fact, your method is just my orinal manner, But
two problem:
How to back?
Getdc may occupy memory more and more with timer used.

To 阿蒙:
I have tried, but Wndproc cannt effect when the app is not actived.
 
多人接受答案了。
 
后退
顶部