如何使鼠标点击穿透窗口,点到下层窗口?(200分)

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

luckmiky

Unregistered / Unconfirmed
GUEST, unregistred user!
我在屏幕上用了一个半透明的窗口来来提示信息,但我希望用户可以点击半透明窗口覆盖的窗口上面的Button等控件,也就是当这个半透明窗口不存在.<br><br>可以做到吗?要能的话应该怎么做?请高手指教.<br>
 
先取得鼠标点击事件的坐标,再传递到下层窗口上!
 
怎么取得下层窗口呢?难道要枚举所有得窗口再检查他的Rect?<br>这样也不行
 
暂时也只想到这个方法
 
我们可以换一个角度来处理,由于是在半透明窗口点击鼠标,那好,一旦半透明窗口接收<br>到鼠标点击事件,那就向所有窗口发送一个自定义消息,其余的处理就交给别的对该鼠标<br>点击事件感兴趣的窗口去处理。如楼主所说的button窗口,一旦接收到该自定义消息,并<br>判断自身窗口位置在半透明窗口位置的下面,那就激活自身窗口,并模拟击发一个鼠标的<br>点击事件。
 
应该可以的,我测试好再答你,好不!<br>----<br>试过了,完全可以,代码如下;<br>&nbsp; TForm2 = class(TForm)<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; &nbsp; procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br>implementation<br><br>{$R *.dfm}<br><br>{ TForm2 }<br><br>procedure TForm2.WMNCHitTest(var Message: TWMNCHitTest);<br>begin<br>&nbsp; Message.Result := HTTRANSPARENT;<br>end;<br>end.
 
xuxiaohan的方法只能在同一个程序里传递,编控件的时候经常采用的办法.<br><br>但是,透明窗口下面可能是任何的WIN32窗口啊.<br><br>在98下面应该是不可能的,就象以前讨论半透明窗口一样,无法取到下层窗口的信息,但在2000或XP下可能有办法.<br><br>这个问题很有点难度,大家多动动脑筋啊.我暂时只有这么多分,以后会加的
 
我在屏幕上用了一个半透明的窗口来来提示信息,但我希望用户可以点击半透明窗口覆盖的窗口上面的Button等控件,也就是当这个半透明窗口不存在.???<br>-----------------------------------------------------------------------<br>如果是怎样,已经完全达到你的要求了<br><br>你究竟是什么要求,能不能详细说清楚?
 
to xuxiaohan<br>你的方法只能点自己程序的按钮,你能点IE的菜单吗?<br>我测试过了,不行
 
查找所有窗口<br>判断位置<br>发送消息
 
好,我明白,我研究,看看有没有方法!
 
我有一个vc的例子 &nbsp;基本原理就是根据屏幕位置计算鼠标和目标程序的相对位置。 然后发送消息
 
想要得话留下email
 
这个问题我想了很久了,真希望能有答案。
 
转自:http://www.delphibbs.com/delphibbs/dispq.asp?lid=603975<br>const<br>&nbsp;WS_EX_LAYERED = $80000;<br>&nbsp;WS_EX_TRANSPARENT = $20;<br>&nbsp;LWA_ALPHA = $2;<br><br>procedure TForm2.Button1Click(Sender: TObject);<br>var<br>&nbsp;OldStyle: Integer;<br>begin<br>&nbsp;OldStyle := GetWindowLong(Handle, GWL_EXSTYLE);<br>&nbsp;SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);<br>&nbsp;SetLayeredWindowAttributes(Handle, 0, 255, LWA_ALPHA);<br>&nbsp;SetWindowLong(Handle, GWL_EXSTYLE, OldStyle Or WS_EX_LAYERED Or WS_EX_TRANSPARENT);<br>end;<br><br>end.<br>
 
用GetNextWindow获得下层窗口句柄,然后用postMessage
 
tt.t, 和 zhukewen 的不行。
 
用FindWindows找下層窗口句柄<br>然後postMessage
 
我说的方法没问题的,我用过,不过只能用在2k以上系统
 
tt.t:<br>&nbsp; 我真惭愧,你的方法可以在2000或xP实现。
 
后退
顶部