我想问一下许多桌面软件的桌面穿透功能是如何实现的,有谁知道? ( 积分: 20 )

  • 主题发起人 主题发起人 batconv
  • 开始时间 开始时间
B

batconv

Unregistered / Unconfirmed
GUEST, unregistred user!
就像一个时钟放到桌面上,但是鼠标能够透过时钟点击下面的窗口而不受影响。

最好有代码,谢谢!
 
以下代码就可以了。给分,呵呵。

procedure TForm1.Button1Click(Sender: TObject);
const
WS_EX_LAYERED = $80000;
WS_EX_TRANSPARENT = $20;
LWA_ALPHA = $2;
var
OldStyle: Integer;
begin
OldStyle := GetWindowLong(Handle, GWL_EXSTYLE);
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or
WS_EX_LAYERED);
SetLayeredWindowAttributes(Handle, 0, 125, LWA_ALPHA);
SetWindowLong(Handle, GWL_EXSTYLE, OldStyle or WS_EX_LAYERED or
WS_EX_TRANSPARENT or WS_EX_TOPMOST);
end;


procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with params do
begin
Style:=WS_POPUP or WS_BORDER;
ExStyle := WS_EX_TOPMOST or WS_EX_NOACTIVATE or WS_EX_WINDOWEDGE;
end;
end;
 
freisky 兄的方法应该可以了。
借楼主地方一用
to freisky:
有个问题想请教一下:
上面的代码应该可以实现嵌入桌面和鼠标穿透的效果,我想知道的是在程序运行的状态下,怎么实现 嵌入桌面 以及 鼠标穿透 效果的 开/关 切换。
这个问题我以前考虑过,但是想不到实现方法,今天看到楼主的问题,于是又想起这个问题,如果 freisky 兄有办法解决,我愿意另外开帖。
 
freisky兄可否解释一下你的代码?
 
要恢复的话,在form2里面加入以下代码就行了

procedure TForm2.Button1Click(Sender: TObject);
var
OldStyle: Integer;
begin
//恢复原来的样子
OldStyle := GetWindowLong(form2.Handle, GWL_EXSTYLE);
SetWindowLong(Form1.Handle, GWL_EXSTYLE, OldStyle);
end;
 
to freisky:
谢谢你的代码,修改一下就可以用在我的程序上了,现在可以自由切换了。
其实我做了一个放大镜工具,呵呵!!
请到以下的帖子领分
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3672176
 
谢谢freisky兄!
还有个问题想请教一下,我看到有些桌面时钟可能用的是PNG图片,形成的是不规则窗体,但是边缘过渡非常自然,这是怎么搞的?请多赐教!
 
过渡自然的不规则窗体,用gdi+配合含有透明信息的PNG图片是最好的了。
 
可否给点示例代码?谢谢。batconv@163.com
 
正如 freisky 兄所说的,用 gdi+ 配合 PNG 图片的实现效果很好。
邮件我已经发送出去了,附件有 1 点几兆,不知道能不能收得到。
 
非常感谢,邮件已收到,现在发分,只是分少了点,请包涵!!
 
后退
顶部