在win10桌面窗口层的workerw嵌入应用,黑色像素变为透明 5C

在写c#程序
总之使用如下方式将窗口设置为桌面workerw的子窗口

            EnumWindows(new Callback(Find_SHELLDLL_DefView), 0);
           IntPtr chiWnd = FindWindowEx(workerw,IntPtr.Zero,"TXMiniSkin", null);
           //IntPtr chiWnd = workerw;
           if(chiWnd==IntPtr.Zero)
           {
               chiWnd = workerw;

           }
                    SetParent(this.Handle,chiWnd);

                        //回调函数
        private IntPtr workerw = IntPtr.Zero;
        public bool Find_SHELLDLL_DefView(IntPtr hwnd,int lParam)
        {
            if(FindWindowEx(hwnd,IntPtr.Zero,"SHELLDLL_DefView",null)!=IntPtr.Zero)
            {
                workerw = hwnd;
                return false;
            }
            return true;
        }

图片说明
然后就出问题了,我的窗口貌似所有的黑色像素都变成了无色
图片说明
仔细看上面的图片,会发现窗口实际上遮住了图标但是背景层穿越过来了。像是图标穿上了隐身衣。
求解这种情况,希望解决黑色像素丢失的问题

0

2个回答

这是因为DWM设置了ARGB型的透明色,而你的程序使用的是传统的RGB,黑色的Alpha通道被误认为是完全透明。

以下内容引用自文章《DWM 窗体玻璃效果实现》


一个特殊问题是使用位模式 0x00000000 以黑色呈现 GDI 项目,在使用 Alpha 管道时也会碰巧出现完全透明的黑色。这意味着如果您使用黑色 GDI 画笔或笔进行绘制,将会得到透明的颜色,而不是黑色。当您尝试使用默认文本颜色控制位于玻璃区域中的文本标签时,这种问题表现得就特别明显。因为默认文本颜色通常为黑色,DWM 会认为它是透明的,因此文本将错误地写入玻璃区域。图 10 显示了一个这样的示例。第一行使用 GDI+ 编写,第二行是一个使用默认颜色的文本标签控件。可以看出,其中的内容几乎无法辨认,因为它实际上是错误呈现的文件,文本显示为灰色,而不是黑色。

图 10 透明对话框
令人欣慰的是,可以通过多种方法解决此问题。其中一种方法是使用所有者描述的控件。另一种方法是呈现到具有 Alpha 管道的位图。但控制文本的最简单方法是让 .NET Framework 2.0 为您使用 GDI+。通过在您的控件上设置 UseCompatibleTextRendering 属性可以很容易地做到这一点。默认情况下,此属性设置为 false,这样,为 .NET Framework 的以前版本编写的控件将以相同的方式呈现。但是,如果将其设置为 true,则文本将正确呈现。您可以使用 Application.SetUseCompatibleTextRenderingDefault 方法在全局设置该属性。如果您使用的是 Visual Studio® 2005,则模板代码将包括一个调用,以便在创建窗体之前在主例程中将兼容文本呈现设置为 false。您可以编辑它,将其设置为 true(如下所示),这时在玻璃窗口中进行编写时,所有控件看上去都会是正确的。

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(true);
    Application.Run(new GlassForm());
}

您可以在 Miguel A. Lacouture 在 2006 年 3 月份的《MSDN 杂志》上发表的文章“Build World-Ready Apps Using Complex Scripts In Windows Forms Controls”中找到有关此内容和使用 TextRenderer 类的详细信息。
在开始呈现窗口之前应启用玻璃效果。组合引擎将查看您窗口的 Alpha 值,并将模糊效果应用到透明区域。这在使用某些 GDI 函数时可能会出现问题,因为这些函数不保留 Alpha 值。您可以在需要时使用 GDI+,但应谨慎使用,因为 GDI+ 调用在软件中呈现,而不是在硬件上呈现,因此窗口刷新频率较高时使用 GDI+ 调用可能导致耗费大量的系统资源。
可以通过相同方法在 DirectX 应用程序中获得玻璃效果。您需要做的只是控制呈现目标的 Alpha 值和使用两个启用玻璃效果的 DWM 函数之一。无论在何处指示 DWM 使用玻璃效果,它都将使用呈现目标的 Alpha 值。无论在其他任何地方,呈现目标均应为不透明的,否则将得到未定义的行为。

0

将该窗口的Owner设置成桌面的Shell 窗口。

-1
qq_34537052
qq_34537052 我刚刚看了看,Owner好像不可以跨进程设置
一年多之前 回复
qq_34537052
qq_34537052 SHELLDLL_DefView?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Windows核心编程_将窗口嵌入到桌面图标下面不被遮挡+spy++分析过程
近年很流行动态视频桌面,实则上早期的windows vista系统上有一个Windows DreamScene软件将桌面壁纸设置成视频,但是是收费的!首先先来观察一下Windows桌面的组成单元:我们可以通过spy++工具来帮助我们探测屏幕窗口:1.打开spy++选择窗口探测功能:按住图标然后将焦点挪移到电脑桌面上然后在点击确定就可以找到桌面的组成单元了!可以看到桌面是由三个窗口组成的!父窗口-背...
Qt实现半透明窗口 嵌入桌面
本文介绍的是Qt实现半透明窗口 嵌入桌面,窗口的一个特效,主要是有alpha值的颜色填充背景,最终的dialog实现看内容。 一、将Qt窗口嵌入到桌面中。 声明一个最简单的类: class Dialog : public QDialog   {           Q_OBJECT  public :           Dialog(QWidget *parent = 0);
QT 5.10 嵌入桌面以及 真半透明实现,win7&win10
首先嵌入桌面 添加依赖: LIBS += -luser32 其次main.cpp中添加定义及引用   #include <Windows.h> static BOOL enumUserWindowsCB(HWND hwnd, LPARAM lParam) { long wflags = GetWindowLong(hwnd, GWL_STYLE); if (!(wf...
win10 在桌面图标下显示窗体(C++)
直接上代码,只需要将窗体的Parent设置为这个函数的返回值即可。 HWND FindDTWindow() { HWND hWnd = ::FindWindow(_T("Progman"), _T("Program Manager")); DWORD dResult = 0; SendMessageTimeout(hWnd, 0x052C, ...
delphi 程序嵌入桌面效果的实现
function Tform1.CreateRegion(wMask:TBitmap;wColor:TColor;hControl:THandle): HRGN; var  dc, dc_c: HDC;  rgn: HRGN;  x, y: integer;  coord: TPoint;  line: boolean; color: TColor;  begin  dc := GetWindow
Windows 桌面各个窗口的获取
/*  shellwindow.h  sdragonx 2015-02-12 12:23:16 */ #ifndef SHELLWINDOW_H_20150212122316 #define SHELLWINDOW_H_20150212122316 #include <windows.h> const static PTCHAR CLASS_NAME_TASKMAN = TEXT("S...
win 10 设置透明图表显示为黑色方块问题
在使用了透明图标的位置放置该透明图标即可,; 那个名为纸质的文件即为透明图标 格式jpg使用时修改为ico即可 路径下透明文件可使用同样的图标设置 附赠福利:按住alt键+0160数字键,可以输入文件名所允许的空格 即是空白文件名 透明图标鼠标下面即可出现
获取桌面窗口句柄
GetDesktopWindow获取的是顶层显示桌面句柄,也就是说,如果应用程序窗口在桌面上,那么它的窗口也算是所获取的窗口的一部分,如果使用GetDC(NULL)作图,则永远是在最顶层。 那么如何获取包含桌面图标的窗口句柄呢? 我们可以用Spy++来查看。 可以看出窗口层次为Progman->SHELLDLL_DefView->SysListView32。于是我们可以这样来获取我们
如何让你的WinForm嵌入桌面窗口最底层
如何让你的WinForm嵌入桌面窗口最底层此类将窗体永远置于窗口最底层首先, 调用一些User32.dll的WinAPI函数internal class User32    ...{        public const int SE_SHUTDOWN_PRIVILEGE = 0x13;        [DllImport("user32.dll")]        public sta
关于窗口嵌入桌面及透明的注意事项
这几天在做个东东,需要将窗体嵌入桌面及窗口透明开始我以为以我现在的所知应该没什么大问题,结果也的确如此,没什么大问题,只是细节上出了几个小问题...1. 关于嵌入桌面原理很简单,找到 Progman 并将窗口 SetParent 过去即可(当然也可以嵌入到 Progman 的子窗口以保证窗口不覆盖桌面的图标,不过我的要求是我的窗口必须覆盖桌面图标,呵呵)但是问题来了,我发现我的窗口在桌面上F5或者
win10文件夹图标变成黑色方块处理方法
用软媒魔方修复,具体功能位置为电脑医生–图标缓存–恢复图标缩略图。
将窗口嵌入桌面
在试用某些Ap时,发现有些Ap的窗口可以嵌入桌面,这样Win+D键的时候就可以看到,很方便。在网上搜索了一下,原理就是将窗口的父窗口设置成桌面。 这个父窗口在Xp下通过FindWindow("Program manager","progman")找到,但是在win7下这个方法找到的父窗口就不好用了。用spy++看了之后,写了下面一段代码findDesktopIconWnd(),在xp和win7下
Windows 7桌面显示图标窗口句柄的获取
Windows 7下,我们取桌面图标窗口的句柄使用以下语句   在windows XP时代,我们获取桌面图标窗口的句柄往往用一下语句: HWND hwndParent = ::FindWindow( "Progman", "Program Manager" ); HWND hwndSHELLDLL_DefView = ::FindWindowEx( hwndParent
把自己的窗口嵌入桌面[源码]
.版本 2 窗口句柄 = 寻找顶级窗口 (“Progman”, “Program Manager”) ' Program Manager 桌面的标题 新父窗口 (取窗口句柄 (), 窗口句柄)
C#窗体钉在桌面、置底、嵌入桌面的办法
想做一个桌面时钟,钉在桌面上不影响正常使用,只在看桌面的时候显示。 从网上多方寻找找到这么个代码,但是还是有不方便的地方,大家探讨一下。 这个程序在使用“显示桌面”的时候还可以显示,将程序的Form1.cs改为: using System; using System.Collections.Generic; using System.ComponentModel; using Syste
桌面上嵌入窗口(桌面日历)原理探索
转自:http://www.cppblog.com/weiym/archive/2012/05/03/173608.html 今天在QQ群里有人问怎样实现将自己的窗口嵌入桌面,让它和桌面融为一体,就像很多桌面日历软件那样。我当时想到的就是建立一个Child Window,将他的父窗口设置成桌面Shell窗口就可以了。但是后来想想觉得不对,因为很多桌面日历窗口都有半透明和阴影效果,明显是用Laye
C# 将窗体嵌入到任务栏中
参考了网上的一篇博客 博客连接 也算是慢慢弄懂了将窗体嵌入到任务栏中的方法。 其实这篇文也只是我对于那篇博客的理解 先看看实现效果 首先先大致了解一下系统的任务栏 系统的任务栏实质上是一个容器 在这容器之下还有好几个分区,托盘区,时钟区等等 任务栏类名叫“Shell_TaryWnd” 其区域是 在这之下还有个二级容器为“ReBarWindow32”其区域是 在它之下还有个窗口为“MSTask...
C# WINFORM 制作真正的 透明窗体 桌面画图 的完美解决方案
通过长时间研究终于找到关于在C# WINFORM下制作真正的透明窗体在系统桌面上画图的完美解决方案; 我的解决方案为两层透明窗体重叠,一层透明窗体showForm显示图像(TransparencyKey因为鼠标穿透,但字迹显示清楚正常),用另一层窗体drawForm做绘图轨迹(Opacity鼠标不穿透,可以不必显示图像),两个都为透明窗体,Opacity透明绘图层的轨迹在透明窗体TransparencyKey图画层上显示,直接上代码: drawForm.cs只新建窗体drawForm即可,可以不用写其它代码
win10 透明任务栏 界面设置
可以实现好多win10的桌面设置功能 软件属于免费软件,大家可以参考
CentOS下Qt窗口透明效果失效,成黑色背景的问题
一、问题        简介 二、运行图 (1)如下图1所示。 三、详解 1、开始 (1)开始
Unity 窗体透明
文章转自游戏蛮牛:http://www.manew.com/forum.php?mod=viewthread&tid=103087&_dsign=ec6d9a3d 偶然在国外网站上看到的一个脚本,通过纯色背景抠像的方法,把windows的窗体透明化,可以用来做无背景的小头像、桌面精灵等。 首先新建一个叫TransparentWindow的CS脚本,输入如下代码: using
openbox设置透明效果
X窗口下的透明效果设置使用transset + devilspie + xcompmgr设置透明效果。X窗口下没有现成的工具,但可以借助于Xcompmgr和transset。 在运行Xcompmgr之后,就可以用transset来设置窗口透明度了。transset设置透明度opacity变量:0~1。0表示完全透明,1表示不透明。如果不指定opacity参数,默认值是0.75transset --
利用opencv将QImage中指定的颜色变为透明
之前做项目的时候用到了将指定的颜色变为透明,当时查了一些资料,现在在博客中记录下来,防止遗忘。下面附上代码:void vacDealThread::__Bmp2Png(QImage &bmp) { bmp = bmp.convertToFormat(QImage::Format_RGBA8888_Premultiplied, Qt::NoFormatConversion); int b...
WIN10美化-透明化任务栏插件
win10任务栏透明化美化,瞬间提升一个逼格的插件,谁用谁知道
html DIV透明黑色浮层 提示加载中
<!doctype html> <html> <head> <title>遮罩层</title> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-sc
win10任务栏全透明
一个可以实现win10任务栏全透明的工具:链接:https://pan.baidu.com/s/1LSgxGAZxxuxE3rC3_L7fTg 密码:51dz。用VS2017打包的程序,使用方法是安装完打开,在任务栏点击程序图标可以选择不同的功能。效果如下:原项目GitHub地址:https://github.com/TranslucentTB/TranslucentTB...
Qt窗体设置Qt::WA_TranslucentBackground为全黑的原因
4.5版本发行以后,可以设置窗口属性Qt::WA_TranslucentBackground来设定该窗口透明显示,但是有一个问题,就是如果该窗口是个top level窗口,就会有标题栏(title bar), 在windows平台下,如果不把这个标题栏去掉(设置Qt::FramelessWindowHint 标志位就会去掉标题栏),那么将不会是透明效果,而是背景为全黑(我的实验结果是这样)
WIN10桌面任务栏消失变黑色的解决方法
解决办法① Control+Alt+Delete打开任务管理器。 文件→运行新任务 在打开中输入explorer.exe,确认。解决办法② 重启计算机
C# 做的电子便贴。嵌入到桌面里面
C# 做的电子便贴。嵌入到桌面里面
【Unity3d】窗体透明
偶然在国外网站上看到的一个脚本,通过纯色背景抠像的方法,把windows的窗体透明化,可以用来做无背景的小头像、桌面精灵等。首先新建一个叫TransparentWindow的CS脚本,输入如下代码:using System; using System.Runtime.InteropServices; using UnityEngine;public class TransparentWindow :
使用vc++创建windows透明窗口
使用vc++创建windows透明窗口windows下的透明窗口有不少的实现方法,最简单的当属空画刷啦,但是这篇文章将的是用layer window(分层窗口)来实现透明窗口。 见过vista/win7中窗口漂亮的半透明特效吗?用layer window可以轻松实现,而且其实layer window在古老的windows2000中就已经实现啦。基本不用考虑平台的问题。layer window其实就
JAVA图片处理之黑色/白色透明化
package org.hdht.util.image; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.F
解决java压缩图片透明背景变黑色的问题
public static BufferedImage resize(int faceWidth,BufferedImage srcImg,HttpServletRequest request) throws IOException{                  int imgWidth = 0;         if(faceWidth>70 && faceWidth       
Windows桌面应用程序(1-2-4-7th) DPI和设备无关的像素
要使用Windows图形进行有效编程,您必须了解两个相关的概念: 每英寸点数(DPI) 设备无关像素(DIP)。 我们从DPI开始。这将需要短暂的绕行排版。在印刷术中,类型的大小以称为点的单位来测量。一点等于1/72英寸。 1点=1/72英寸'>1点=1/72英寸1点=1/72英寸1点=1/72英寸 注意 这是桌面出版的定义。历史上,一个点的具
C#下WPF创建自定义透明窗口
WPF下创建透明自定义窗口,效果如下:  窗口设置:WindowStyle="None" Opacity="0.6"  AllowsTransparency="True" Background="#001f55" WindowStyle设置为"None",否则设置透明度会报错,Window允许透明,AllowsTransparency设置为true。Opacity
为什么Android的点9图四周的颜色只能是白、黑或透明
http://androidren.com/index.php?qa=363&qa_1=%E4%B8%BA%E4%BB%80%E4%B9%88android%E7%9A%84%E7%82%B99%E5%9B%BE%E5%9B%9B%E5%91%A8%E7%9A%84%E9%A2%9C%E8%89%B2%E5%8F%AA%E8%83%BD%E6%98%AF%E7%99%BD-%E9%BB%91%E6
Window 透明窗体的实现总结
此片文章是以前写的, 刚刚新开了博客, 就发出来跟大家分享下。 这篇文章主要讲得是vc中各种分层、透明、不规则窗口的实现, 基本囊括GDI、GDI+能使用的所有方法。 本文讲述了三种方法,其中第一种方法有两种不同效果,第三种方法有两种不同的实现方式。文中有方法使用了GDi+,关于GDI+的使用请自行查询资料,本文不进行细述。 方法一:窗体整体透明,支持子控件透明,支持
PyQt5学习教程19:改变窗体的透明度
本文将介绍在PyQt5种更改窗体透明度的方法,使用的主要函数是:setWindowOpacity。说明如下: def setWindowOpacity(self, p_float): # real signature unknown; restored from __doc__ """ setWindowOpacity(self, float) """ pas...
窗口全透明完整代码
窗口全透明完整代码 Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As _ Long, lpRECT As RECT) As Long Private Declare Function GetClientRect Lib "user32" (ByVal hWnd As _ Long, lpRECT As RECT) As Long Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As _ Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal _ nCombineMode As Long) As Long Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, _ ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As _ Long, lpPoint As POINTAPI) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As _ Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Const RGN_AND = 1 Const RGN_COPY = 5 Const RGN_DIFF = 4 Const RGN_OR = 2 Const RGN_XOR = 3 Private Type POINTAPI x As Long Y As Long End Type Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Sub DataSamp() Dim ad As Database Dim aserch As QueryDef End Sub
C# 实现真正的透明控件(Windows桌面程序)
由于上位机程序的需要,需要大量的异性控件,开始不以为然,心想随着GDI到GDI+的升级,微软应该会给NET打造了一套高效绚丽的绘图方案,使用后才知道完全不是我以为的那么回事.于是开始各种寻找资源,发现网上方法无非使用Web.Transparent作为背景,要么就完全使用控件背后作为控件本身背景,然而这些无非都是掩耳盗铃,真正意义上的透明完全没有做到。 1.其中使用Web.Transparent的...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 像素游戏开发价格 大数据基础层