保护眼睛

hjkto 2009-12-03 05:39:49
桌面->右键->属性->外观->高级->项目选择(窗口)、颜色1(L)选择(其它)将色调改为:85。饱和度:123。亮度:205->添加到自定义颜色->在自定义颜色选定点确定->确定这样所有的文档都不再是刺眼的白底黑字,而是非常柔和的豆沙绿色,这个色调是眼科专家配置的,长时间使用会很有效的缓解眼睛疲劳保护眼睛


用代码实现,给个思路
给代码,再加分
...全文
345 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
framman 2011-06-23
  • 打赏
  • 举报
回复
我最多能加120分,本想多加一些,给其他两位高手,不好意思了
hjkto 2009-12-07
  • 打赏
  • 举报
回复
我最多能加120分,本想多加一些,给其他两位高手,不好意思了!
hjkto 2009-12-07
  • 打赏
  • 举报
回复
wooden954
没想到,你效率这么高!

别的不说了,200分奉上!!

还是说一声,谢谢!!
xiaoxian251 2009-12-06
  • 打赏
  • 举报
回复
刷新可以用SHChangeNotify
砝码 2009-12-06
  • 打赏
  • 举报
回复
UP
liudi611 2009-12-06
  • 打赏
  • 举报
回复
哎,干啥都是分!
wooden954 2009-12-06
  • 打赏
  • 举报
回复
根本不需要写注册表啦什么的,就一个系统调用就完成了。而且其速度比在Windows桌面属性设置快多了,点击按钮立即生效。
主要是没有显示改变桌面主题时的那个“请稍候”的窗口。
wooden954 2009-12-06
  • 打赏
  • 举报
回复

procedure TForm1.Button1Click(Sender: TObject);
var
ColorNo:integer;
Colors:COLORREF;
begin
//下列常量表示设置的是哪些显示元素,这些常量已定义在Windows单元中,不必再定义,直接使用即可
// COLOR_SCROLLBAR =0 //滚动条颜色
// COLOR_BACKGROUND =1 //无墙纸时的背景色
// COLOR_ACTIVECAPTION =2 //活动窗口标题颜色
// COLOR_INACTIVECAPTION =3 //非活动窗口标题颜色
// COLOR_MENU =4 //菜单
// COLOR_WINDOW =5 //Windows背景
// COLOR_WINDOWFRAME =6 //Window frame
// COLOR_MENUTEXT =7 //Window文字
// COLOR_WINDOWTEXT =8 //3D阴影(Win95)
// COLOR_CAPTIONTEXT =9 //窗口标题中的文字
// COLOR_ACTIVEBORDER =10 //活动窗口边框
// COLOR_INACTIVEBORDER =11 //非活动窗口边框
// COLOR_APPWORKSPACE =12 //MDI桌面的背景
// COLOR_HIGHLIGHT =13 //选择项背景
// COLOR_HIGHLIGHTTEXT =14 //选择菜单项
// COLOR_BTNFACE =15 //按钮
// COLOR_BTNSHADOW =16 //3D按钮阴影
// COLOR_GRAYTEXT =17 //Grey text,of zero if dithering is used.
// COLOR_BTNTEXT =18 //按钮文本
// COLOR_INACTIVECAPTIONTEXT=19 //非活动窗口文本
// COLOR_BTNHIGHLIGHT =20 //3D高亮按钮
// COLOR_2NDACTIVECAPTION =27 //只用于Win98:第2活动窗口颜色
// COLOR_2NDINACTIVECAPTION =28 //只用于Win98:第2非活动窗口颜色
COLORNO:=COLOR_WINDOW; //设置Windows背景
Colors:=RGB(199,237,204);
SetSysColors(1, ColorNo,Colors); //这个函数无论是否使用桌面主题,都能生效
end;


这个函数是测试过的,没有问题。
hjkto 2009-12-06
  • 打赏
  • 举报
回复
昨天晚上,找网友测试了一下

确定不能刷新!!!


期待高手解决此问题!!
hjkto 2009-12-05
  • 打赏
  • 举报
回复
reg.OpenKey('\Control Panel\Colors',true);
reg.WriteString('ActiveTitle','2 3 4');
试了n次了,不能刷新
在你的机器上可以刷新吗?
如你所说,改了,注册表写入成功,但没有效果
mdejtod 2009-12-05
  • 打赏
  • 举报
回复
你试过了?确定不能立即刷新?
可我以前写的程序都可以用这函数立即刷新注册表。。。只有少数机器上不能生效。。
hjkto 2009-12-05
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 mdejtod 的回复:]
试试改一下其它的注册表信息,再用这段代码试试效果?

[/Quote]
假设这个注册表无法立即更新的话

能否用

WinExec(’RunDLL32.exe Shell32.dll,Control_RunDLL desk.cpl,,2’, SW_SHOWNORMAL);
打开窗口,然后模拟手动操作呢?
虽然不及注册表方便,但只要能实现就可以,分一样给
mdejtod 2009-12-05
  • 打赏
  • 举报
回复
试试改一下其它的注册表信息,再用这段代码试试效果?
hjkto 2009-12-05
  • 打赏
  • 举报
回复
继续等高手解决此问题
如注册表无法立即更新的话,其它思路实现也行
如有人能实现的话,独得150-200分
hjkto 2009-12-05
  • 打赏
  • 举报
回复

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,registry;
const
FCIDM_SHVIEWSHELL = $7000;
FNoFolderOptions = 'NoFolderOptions';
FCIDM_MENU_VIEW_REFRESH = FCIDM_SHVIEWSHELL + $0103;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function EnumWindowsProc(AHWnd: HWND;LPARAM: lParam): boolean; stdcall;
var
WClassName : array[0..254] of char;
begin
Result := True;
GetClassName(AHWnd, @WClassName, 254);
if SameText(WClassName,'CabinetWClass') then
begin
PostMessage(AHWnd,$111, 28931, 0);
end;
end;


//function EnumWindowsProc(AHWnd: HWND;LPARAM: lParam): boolean; stdcall;
Procedure UpdateExplorer;
var
AHandle : THandle;
begin
EnumWindows(@EnumWindowsProc, 0);
AHandle := FindWindow('Progman',Nil);
if AHandle <> 0 then PostMessage(AHandle,$111, 28931, 0);
end;
procedure RefershDesk;
begin
PostMessage(HWND_BROADCAST, WM_COMMAND, FCIDM_MENU_VIEW_REFRESH, 0);
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
UpdateExplorer;
end;




procedure TForm1.Button1Click(Sender: TObject);
var
reg:tregistry;
begin
reg:=tregistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('\Control Panel\Colors',true);
reg.WriteString('window','199 237 204');
reg.CloseKey;
reg.Free;
RefershDesk;
end;

end.



还是没有反映,运行后,屏幕确实有刷新的动作,但各个窗口的背景色依然是白色???
hjkto 2009-12-05
  • 打赏
  • 举报
回复
请问稻草人,这个要怎么用,怎么两个函数相同?

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
FCIDM_SHVIEWSHELL = $7000;
FNoFolderOptions = 'NoFolderOptions';
FCIDM_MENU_VIEW_REFRESH = FCIDM_SHVIEWSHELL + $0103;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
{function EnumWindowsProc(AHWnd: HWND;LPARAM: lParam): boolean; stdcall;

procedure RefershDesk;
begin
PostMessage(HWND_BROADCAST, WM_COMMAND, FCIDM_MENU_VIEW_REFRESH, 0);
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
UpdateExplorer;
end; }

function EnumWindowsProc(AHWnd: HWND;LPARAM: lParam): boolean; stdcall;
var
WClassName : array[0..254] of char;
begin
Result := True;
GetClassName(AHWnd, @WClassName, 254);
if SameText(WClassName,'CabinetWClass') then
begin
PostMessage(AHWnd,$111, 28931, 0);
end;
end;

Procedure UpdateExplorer;
var
AHandle : THandle;
begin
EnumWindows(@EnumWindowsProc, 0);
AHandle := FindWindow('Progman',Nil);
if AHandle <> 0 then PostMessage(AHandle,$111, 28931, 0);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
UpdateExplorer;
end;

end.


我哪里用错了吗?
mdejtod 2009-12-04
  • 打赏
  • 举报
回复
补充:FCIDM_SHVIEWSHELL = $7000;
mdejtod 2009-12-04
  • 打赏
  • 举报
回复

const
FNoFolderOptions = 'NoFolderOptions';
FCIDM_MENU_VIEW_REFRESH = FCIDM_SHVIEWSHELL + $0103;
function EnumWindowsProc(AHWnd: HWND;LPARAM: lParam): boolean; stdcall;

procedure TfrmMain.RefershDesk;
begin
PostMessage(HWND_BROADCAST, WM_COMMAND, FCIDM_MENU_VIEW_REFRESH, 0);
SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
UpdateExplorer;
end;

function EnumWindowsProc(AHWnd: HWND;LPARAM: lParam): boolean; stdcall;
var
WClassName : array[0..254] of char;
begin
Result := True;
GetClassName(AHWnd, @WClassName, 254);
if SameText(WClassName,'CabinetWClass') then
begin
PostMessage(AHWnd,$111, 28931, 0);
end;
end;

Procedure UpdateExplorer;
var
AHandle : THandle;
begin
EnumWindows(@EnumWindowsProc, 0);
AHandle := FindWindow('Progman',Nil);
if AHandle <> 0 then PostMessage(AHandle,$111, 28931, 0);
end;
hjkto 2009-12-04
  • 打赏
  • 举报
回复
//SYSTEMPARAMETERSINFO(SPI_SETDESKWALLPAPER,0,NIL,SPIF_SENDCHANGE);
//SendMessage(FindWindow('Progman', 'Program Manager'), WM_COMMAND, 106597, 0);
//sendMessage(FindWindow('Progman','Program Manager'),WM_COMMAND,$A065,0);
//SYSTEMPARAMETERSINFO(SPI_SETDESKWALLPAPER,0,NIL,SPIF_UPDATEINIFILE Or SPIF_SENDCHANGE);
SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST+SHCNF_FLUSH,nil,nil);
//SendMessage(HWND_BROADCAST,WM_SETTINGCHANGE,0,0);
// SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NiL, NiL);

这些都不行
hjkto 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gyk120 的回复:]
刷新可以用SHChangeNotify
[/Quote]
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NiL, NiL);
试了一下,不行,只相当于f5的效果
加载更多回复(13)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧