在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;
        }

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

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 值。无论在其他任何地方,呈现目标均应为不透明的,否则将得到未定义的行为。

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

qq_34537052
qq_34537052 我刚刚看了看,Owner好像不可以跨进程设置
一年多之前 回复
qq_34537052
qq_34537052 SHELLDLL_DefView?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
窗口弹出透明层
现在想实现一个效果,在网页中央弹出一个小窗口,类似 这个论坛发帖的时候,弹出的让你去结贴的窗口,或者是QQ登陆的窗口,上面有textbox,button。因为从来没有实现过这个功能,网上查不知道该怎么表述,希望高手给我解答,谢谢
透明 圆球 窗口 桌面
我想做一个程序,rn程序是类似一个透明球体,在桌面上跟着鼠标移动,rn我懂MFC,WINAPI一些知识,知道的请给下思路,说下要点,
将窗口嵌入桌面
在试用某些Ap时,发现有些Ap的窗口可以嵌入桌面,这样Win+D键的时候就可以看到,很方便。在网上搜索了一下,原理就是将窗口的父窗口设置成桌面。 这个父窗口在Xp下通过FindWindow("Program manager","progman")找到,但是在win7下这个方法找到的父窗口就不好用了。用spy++看了之后,写了下面一段代码 findDesktopIconWnd(),在xp和win7...
窗口嵌入桌面?
怎么创建一个窗口,让它位于所有窗口的下面,只有显示桌面的时候才会看到,并且不会被最小化?rn能用SetWindowPos(&wndBottom,...)吗?为什么我用了没反应,还是我用错地方了。
WIN10桌面任务栏消失变黑色的解决方法
解决办法① Control+Alt+Delete打开任务管理器。 文件→运行新任务 在打开中输入explorer.exe,确认。解决办法② 重启计算机
vs2013 局部变量窗口背景变为黑色
![图片说明](https://img-ask.csdn.net/upload/201510/27/1445925765_114374.jpg)n有谁知道为什么我的vs2013 局部变量窗口会这样,全部是黑色的了,调试时候很不方便。急急急。谢谢。
桌面窗口透明调节工具
可以任意调节windows 窗口的透明度,站在远处看不到你真正干什么,你该懂了吧,但有些窗口无法调节。
请问如何把控件窗口变为透明
RT
怎么是一个窗口变为透明?
如题!
利用canvas下载图片,透明区默认变为黑色
问题:利用canvas下载图片,透明区默认变为黑色
下载保存的图片背景由透明变为黑色问题解决
bitmap压缩时如果采用CompressFormat.JPEG格式会将图片透明的背景转换为黑色,改为CompressFormat.PNG就ok了。 private void saveBitmap(Bitmap bitmap, int i) { File appDir = new File(Environment.getExternalStorageDirectory(),
鼠标指针 透明,黑色的
发几个好看的鼠标指针文件,简单安装就可以使用,文件很小。。。。。。。
透明桌面钟表 透明桌面钟表
透明桌面钟表 透明桌面钟表 透明桌面钟表
黑色透明主题
手机主题黑色透明主题
怎样设置窗口风格是桌面嵌入的,就是应用程序的窗口是嵌入到桌面中的!
怎样设置窗口风格是桌面嵌入的,就是应用程序的窗口是嵌入到桌面中的!
将GoogleMap嵌入到桌面应用程序窗口
将GoogleMap嵌入到桌面应用程序窗口,适合地图开发人员阅读和参考。
把自己的窗口嵌入桌面[源码].e
将别的窗口嵌套在自己的程序窗口内
导航栏变为透明
导航栏变为透明     [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:0];     //    让黑线消失的方法   self.navigationController.navigationBar.shadowImage=[UIImage new]; self
把自己的窗口嵌入桌面[源码]
.版本 2 窗口句柄 = 寻找顶级窗口 (“Progman”, “Program Manager”) ' Program Manager 桌面的标题 新父窗口 (取窗口句柄 (), 窗口句柄)
窗口透明 vc窗口透明
窗口透明 vc窗口透明
c#把彩色图片变为黑色
c# winform 彩色 图片 转换 灰色 变灰 灰度 速度 快 转为 safe unsafe 加权 平均值法
桌面蚂蚁(红色+黑色)
看到 12 只或更多的蚂蚁在桌面上穿梭;你会不会头皮发麻? 浑身发痒? 电脑前坐久了,或许这些乱爬的小家伙们会给你带来一点乐趣... 无需安装,可以从桌面执行,也可以在一个 U 盘或其他存储设备中运行。
hisi3520D 黑色字体透明,可以看到视频层图像
相关代码:rn像素格式:PIXEL_FORMAT_RGB_888rn#if 0rn //GUI层半透明rn /* 3.set alpha */rn stAlpha.bAlphaEnable = HI_FALSE;rn stAlpha.bAlphaChannel = HI_FALSE;rn stAlpha.u8Alpha0 = 0xff;rn stAlpha.u8Alpha1 = 0x8f;rn stAlpha.u8GlobalAlpha = 0x80;rn if (ioctl(console_fd, FBIOPUT_ALPHA_HIFB, &stAlpha) < 0)rn rn printf("Set alpha failed!\n");rn close(console_fd);rn return -1;rn rn#endifrn stColorKey.bKeyEnable = HI_TRUE;rn stColorKey.u32Key = 0x0;rn if (ioctl(console_fd, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)rn rn printf("FBIOPUT_COLORKEY_HIFB!\n");rn close(console_fd);rn return HI_NULL;rn rnstColorKey.u32Key = 0xFF0000;效果也是黑色字体透明。rn[img=https://img-bbs.csdn.net/upload/201505/07/1430968546_117250.jpg][/img]
桌面锁(透明桌面).rar
桌面锁v1.0 suo.exe 本程序基于.net 平台, 用于离开时将桌面加锁,程序界面透明 启用时屏蔽win键\ 任务管理器.
像素值矩阵变为图片
在MATLAB上,导入矩阵数据,数据命名a 然后执行以下代码:imshow(a); 或imwrite(mat2gray(matrix), 'matrix.tif');
获取桌面像素
用C#获取桌面的像素并把当前的桌面的长和宽显示在文本框中
桌面像素直尺
面像素直尺,根据一个朋友的代码写的,好多同事都在用,很不错
桌面屏幕倒计时和透明桌面窗体两个应用的结合源代码
桌面屏幕倒计时和透明桌面窗体两个应用的结合源代码
PNG图片的透明和黑色问题
别人写的BMP2Region函数,实现透明的原理是判断RGB均为0值是认为该像素透明,这在PS中打开时看到的也是这样,透明部分的RGB值的确都是0,但是这样一来,纯黑色的部分也被错误的当作要被透明的部分,应该如何解决[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/12.gif][/img]
win10任务栏透明插件
使win10任务栏全透明,是真的全透明而不是毛玻璃效果。
win10美化,状态栏透明
win10的美化,状态栏透明,支持最新版的1806版本的。安装完成后右键开始属性打开
win10任务栏透明
可以使windows 10的任务栏透明,包括完全透明和增加磨砂玻璃效果的完全透明
WIN10透明任务栏
透明/模糊化win10任务栏,可开机自启,Blur clear normal 分别对应 模糊 透明 正常。
win10任务栏透明软件
1.按住 win+R 打开“运行”对话框,输入 shell:startup ,回车或点击“确定”即可打开“用户启动文件夹” 2.右击“TranslucentTB.exe”,选择“创建快捷方式” 3.将快捷方式移入第一步打开的文件夹即可实现自启动 还有开机即全透明效果实现方法: 1. 在上述开机自启文件夹里找到快捷方式,右击选择“属性”进入。 2. 找到“目标”,在最后面先加一个空格,然后输入“–transparent”。 3. 点击“确认”关闭窗口即可
Win10任务栏透明软件
可以让Win8和Win10也拥有毛玻璃,效果还是不错的,而且非常灵活,不但可以设定透明度、颜色、光照方向,还能自定义底纹背景,甚至可以根据桌面背景自动计算最合适的颜色。 这个软件的名字虽然叫 Aero Glass for Win8 但它是有Win10版本的,虽然名字还叫 Aero Glass for Win8.1+
WIN10任务栏透明
windos10 windos8 Windos7桌面任务栏透明化,美化桌面工具
WIN10任务栏透明小工具
win10任务栏透明化,小软件,绿色免安装,只有500k,内附开机自启教程。
win10透明任务栏
win10透明任务栏
win10透明任务栏教程
win10透明任务栏教程   ...
C# 同时实现窗体透明、鼠标穿透与嵌入桌面
正在写一个程序,希望实现窗体半透明和鼠标穿透功能,同时嵌入桌面,用了以下接口代码:rn [DllImport("user32", EntryPoint = "SetWindowLong")]rn private static extern uint SetWindowLong(IntPtr hwnd, int nIndex, uint dwNewLong);rn [DllImport("user32", EntryPoint = "GetWindowLong")]rn private static extern uint GetWindowLong(IntPtr hwnd, int nIndex);rn private const uint WS_EX_LAYERED = 0x80000;rn private const int WS_EX_TRANSPARENT = 0x20;rn private const int GWL_STYLE = (-16);rn private const int GWL_EXSTYLE = (-20);rnrn private void CanPenetrate(bool b)rn rn uint intExTemp = GetWindowLong(this.Handle, GWL_EXSTYLE);rn //uint oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, WS_EX_LAYERED | WS_EX_TRANSPARENT);rn uint oldGWLEx;rn if (b)rn oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, intExTemp | WS_EX_TRANSPARENT| WS_EX_LAYERED);/////////穿透+透明rn elsern oldGWLEx = SetWindowLong(this.Handle, GWL_EXSTYLE, intExTemp | WS_EX_LAYERED);//透明rn rn[color=#FF0000]同时设置窗口的Opacity属性可以实现鼠标穿透和窗口透明。[/color]rnrn同时这个方法:rn [DllImport("User32.dll",EntryPoint="FindWindow")] rn private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); rn [DllImport("user32")] rn private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); rn //在构造函数中或者Load中 rn IntPtr hDeskTop=FindWindow("Progman", null); rn SetParent(this.Handle,hDeskTop);rn[color=#FF0000]可以实现将窗体嵌入桌面,即按显示桌面不会消失。[/color]rn但当把两个功能都用上的时候发现在设置Opacity属性时出现错误:rn[color=#FF9900]System.ComponentModel.Win32Exception: 参数不正确。rn 在 System.Windows.Forms.Form.UpdateLayered()rn 在 System.Windows.Forms.Form.set_Opacity(Double value)rn 在 事务提醒.Form1.Form1_Load(Object sender, EventArgs e) 位置 e:\Visual Studio 2008\Projects\事务提醒\事务提醒\Form1.cs:行号 180[/color]rn不设置opacity的话就能成功嵌入桌面,但这样透明效果就没了(附带一句,我用的是vista)。rn有没有人用过这两个方法,有碰到类似的问题吗?希望懂的帮忙解决下问题,谢谢了!
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池