zoukankan      html  css  js  c++  java
  • 关于窗口嵌入桌面及透明的注意事项

    附件:透明窗体

    这几天在做个东东,需要将窗体嵌入桌面及窗口透明
    开始我以为以我现在的所知应该没什么大问题,结果也的确如此,没什么大问题,只是细节上出了几个小问题...

    1. 关于嵌入桌面
    原理很简单,找到 Progman 并将窗口 SetParent 过去即可
    (当然也可以嵌入到 Progman 的子窗口以保证窗口不覆盖桌面的图标,不过我的要求是我的窗口必须覆盖桌面图标,呵呵)
    但是问题来了,我发现我的窗口在桌面上F5或者Win+D的时候会隐藏,尝试拦截 WM_SYSCOMMAND/SC_MINIMIZED消息无效
    但是其他嵌入桌面的程序则没有此问题
    查看了一下Window Style,发现我的窗口的 Ex Style 多了一个 WS_EX_APPWINDOW 属性(因为是主窗口)
    但是我的主窗口此属性去不掉,因此 New 了一个 Form 动态创建后 OK

    代码(就一句...)

    1Windows.SetParent(Handle, FindWindow('Progman''Program Manager'));


    2. 关于透明
    第一个想到的是 Layered Window
    需要注意的是窗口样式 ExStyle 必须包含 WS_EX_LAYERED(0x80000),而且在 CreateParams 里指定无效...
    然后使用 SetLayeredWindowAttributes 设置透明度,关于这个函数网上有很多问题,这里不在赘述
    执行时我发现我的窗口并没有被透明,SetLayeredWindowAttributes 返回 False
    于是我估计还是跟窗体的 Style 有关系(因为我的窗口 BorderStyle=bsNone)
    果然,在 CreateParams 里给窗体加上 WS_POPUP 后透明成功~鼓掌~~
    不过这样窗口虽然透明了可是窗体里控件也跟着透明了...

    跟着就想到 WS_EX_TRANSPARENT 样式,加上后窗体透明,但是控件不透明了
    不过这个样式下当桌面被刷新的时候窗口得不到及时通知,因此显示会有点问题
    正在尝试 MsgHook...(待续)

    先贴个代码吧

     1procedure TSubForm.CreateParams(var Params: TCreateParams);
     2begin
     3  inherited;
     4  with Params do Style := Style or WS_POPUP;
     5end;
     6
     7procedure TSubForm.FormCreate(Sender: TObject);
     8begin
     9  UpdateStyle;
    10end;
    11
    12procedure TSubForm.UpdateStyle;
    13begin
    14  SetWindowLong(Handle, GWL_EXSTYLE,
    15    GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    16  if Assigned(SetLayeredWindowAttributes) then
    17    SetLayeredWindowAttributes(Handle, 0128, LWA_ALPHA);
    18end;
    19
    // 好久不用 D,都忘光了。。。
    // D7以上直接使用 Form 的 AlphaBlend/AlphaBlendValue 或者 TransparentColor/TransparentColorVale 即可实现透明
    // 其实最终还是用 SetLayeredWindowAttributes 实现的
     
    1procedure TSubForm.CreateParams(var Params: TCreateParams);
    2begin
    3  inherited;
    4  with Params do ExStyle := ExStyle or WS_EX_TRANSPARENT;
    5end;



    看清这世界的美丽与残酷
  • 相关阅读:
    第十四周 Leetcode 315. Count of Smaller Numbers After Self(HARD) 主席树
    POJ1050 To the Max 最大子矩阵
    POJ1259 The Picnic 最大空凸包问题 DP
    POJ 3734 Blocks 矩阵递推
    POJ2686 Traveling by Stagecoach 状态压缩DP
    iOS上架ipa上传问题那些事
    深入浅出iOS事件机制
    iOS如何跳到系统设置里的各种设置界面
    坑爹的私有API
    业务层网络请求封装
  • 原文地址:https://www.cnblogs.com/ljl_falcon/p/2364431.html
Copyright © 2011-2022 走看看