Win2000下使桌面图标文字背景透明的原理是什么?(高分)

goldolphin 2003-06-29 08:08:26
如题,MagicSet、Windows优化大师等软件实现了那样的功能,不知是怎么做到的?用SPY++看到桌面图标在一个SysListview32控件中,但是改变这个控件DC的背景模式为透明,或用Listview_setbkcolor设置为NULL,都不能实现。listview控件中图标的文字背景是如果设置的呢?我在MSDN中没找到相关内容。
另外,要考虑到活动桌面的影响。就我所知,Windows优化大师中的类似功能在开启活动桌面后有问题。
...全文
256 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
goldolphin 2003-07-11
说得很有道理,谢谢各位关注~~~
回复
无敌魔仙 2003-07-09
同意 ThenLong(升龙(该昵称已被使用)) 的说法,写程序何必自己为难自己呢?
回复
ThenLong 2003-07-09
这个问题叫微软搞定不就行了吗??

他如果都没办法,那就没法了。

相信下个windows版本内置该功能!!!!!!!!1
回复
wuliangge2001 2003-07-09
我认为还是用hook。
回复
zxcdewq 2003-07-08
还有就是按F5刷新后就变回去了,优化大师也是这样的,大家想想解决的办法,
回复
zxcdewq 2003-07-08
实际上很简单,找到桌面窗口,改变图标文字的属性。我试过下面的代码,能实现,我也发帖子问过0x1026和0x1024是什么参数,但没得到答案

#include<windows.h>
#include <stdio.h>

HWND GetDeskWnd()
{
HWND hWnd;

hWnd = GetDesktopWindow();
if ((hWnd = FindWindowEx(hWnd, 0, "Progman", "Program Manager")) == 0)
return NULL;

if ((hWnd = FindWindowEx(hWnd, 0, "SHELLDLL_DefView", NULL)) == 0)
return NULL;

if ((hWnd = FindWindowEx(hWnd, 0, "SysListView32", NULL)) == 0)
return NULL;
return hWnd;
}

int main(void)
{
HWND hWnd;
hWnd = GetDeskWnd();
if(hWnd)
{// Change icon text attributes
SendMessage(hWnd, 0x1026, 0, 0xffffffff); // Turn background to transparent
SendMessage(hWnd, 0x1024, 0, 0x000000ff); // Turn foregound to white

InvalidateRect(hWnd, NULL, TRUE); // Repaint
}
return 0;
} // main()

回复
madmanahong 2003-07-08
gz
回复
goldolphin 2003-07-08
我前面已经说过了,更改注册表值没有用处。
用消息钩子,我也是这样想的,不过,这样无疑增加了系统开销。但是也没有什么别的好办法了。
回复
Linux2001 2003-07-08
首先更改注册表键值,然后使用消息钩子钩住桌面刷新消息,如果发现该消息就进行特殊处理
回复
goldolphin 2003-07-08
在windows注册表项HKEY_CURRENT_USER\Control Panel\Colors
下有关于桌面背景的键值:Background,它是一个字符串,如“58 110 165”指定RGB。而图标文字背景与其相同。
每次刷新桌面时,系统将重新读取该值并得到COLORREF值来重新设置桌面图标的文字背景。问题在于CLR_NONE是0xffffffff,而从Background值得到的COLORREF值取值范围在0x00000000~0x00ffffff。所以使文字背景透明后要想刷新时仍能保持,没有一劳永逸的办法,除非crack刷新桌面时调用的函数。不然就必须定时或通过过滤消息来设置文字背景透明。
至于活动桌面的问题,还没想通。
回复
goldolphin 2003-07-08
0x1026 LVM_SETTEXTBKCOLOR
0x1024 LVM_SETTEXTCOLOR
回复
goldolphin 2003-07-08
楼上的谢谢了。
回复
goldolphin 2003-06-29
楼上的方法试过了,没有用。不是这么简单吧?
回复
kingcom_xu 2003-06-29
#define CLR_NONE 0xFFFFFFFFL

设为null当然没用
回复
kingcom_xu 2003-06-29
CListCtrl::SetBkColor
BOOL SetBkColor( COLORREF cr );

Return Value

Nonzero if successful; otherwise zero.

Parameters

cr

Background color to set, or the CLR_NONE value for no background color. List view controls with background colors redraw themselves significantly faster than those without background colors. For information, seeCOLORREF in the Platform SDK.
回复
发帖
界面
创建于2007-09-28

1.5w+

社区成员

VC/MFC 界面
申请成为版主
帖子事件
创建了帖子
2003-06-29 08:08
社区公告
暂无公告