写桌面背景-200分(200分)

  • 主题发起人 主题发起人 A.W
  • 开始时间 开始时间
A

A.W

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在桌面背景上画点什么,是用程序来完成,使画的东西就象桌面背景一样
不受桌面图标的影响,也不受窗口开关的影响。

请高手们多指教,我没有做出来,我现在需要做这个东东!
 
把你画的东西做成Windows的壁纸不就符合要求了?
 
桌面也是一个窗口,你可以取得这个窗口的句柄,然后用API函数来画图就可以了,也可以
自己在程序中画好图,然后用BITBLT函数来传递位图。
 
也不是那么容易吧。他应该是要求画在桌面上,也就是说,桌面上当时如果有其他的窗口开着,
那么他们可以关闭,但不影响我画的东西。但是,你在做壁纸的时候能否区别出所有桌面上
可以关闭的不是背景的东西呢?
我想首先,应该能取出桌面的当前背景,然后在你的程序执行中,鼠标画的东西实际是画在
这个背景上的,然后在存成背景。你试试看吧。
 
A.W:
我是着帮你用修改DeskTopWindow的窗口过程。但没成功。

OldWndProc: function(h: hwnd; m: tmsg; w: wparam; l: lparam): integer; stdcall;

function NewWndProc(h: hwnd; m: tmsg; w: wparam; l: lparam): integer; stdcall;
var
hdc: Integer;
begin
Result := OldWndProc(h,m,w,l);
if h=WM_PAINT then
begin
hdc := GetDC(h);
Rectangle(hdc,100,100,300,300);
ReleaseDC(h,hdc);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
hwnd: Integer;
retv: Integer;
begin
hwnd := GetDeskTopWindow;
OldWndProc := Pointer(GetWindowLong(hwnd,GWL_WNDPROC));
retv := SetWindowLong(hwnd,GWL_WNDPROC,Integer(@NewWndProc));
end; //retv 老是为零

procedure TForm1.FormDestroy(Sender: TObject);
var
hwnd: Integer;
retv: Integer;
begin
hwnd := GetDeskTopWindow;
retv := SetWindowLong(hwnd,GWL_WNDPROC,Integer(@OldWndProc));
end;
我想你还是用
hdc := GetDC(0);
Rectangle(hdc,100,100,300,300);
ReleaseDC(0,hdc);
在每隔一段时间刷新一次算了:(
 
只要画完后,把此时的图像存在一个临时的文件中(.bmp)
在调用系统api发出消息,背景图已改变.即改称临时文件.bmp的图像.
这样,背景就变成了你画完后的图.
突出程序前,记得回复原图.
api自己查一下help中有的.
 
我想这样是可以实现了,
不过这样转换来转换去,不是整个屏幕闪烁不停?
 
还是没搞懂和墙纸有什么区别。
 
>>巴库:
A.W想动态在桌面上显示点东东,但不破坏墙纸。
>>A.W:
我想我那个SetWindowLong不行是因为我定义的窗口过程和
桌面窗口程序不在一个地址空间内。
 
先把桌面抓下来,再在上面画,这样试一试
抓下来之后,应该可以比较方便的操作了
 
谢谢大家的参与!
采用画壁纸再更新的方式是不符合要求的,因为我是用线程不停地在更改。
请问?WINDOWS是如何处理桌面的?也是分层吗?它的壁纸在系统内是否也是一个独立的
内存区域,地址是多少?桌面是一个LISTVIEW,那么壁纸是它的背景么?它的HANDLE又
是多少?

请大家多谈谈!我太菜了!
 
//得到桌面的canvas
//备份下来
//在这个canvas上作图
//退出时还原原来的canvas

这样行不行?没试过
 
看了A.W说的也许明白了要做身么了。
是不是做一个屏幕类的游戏.或类似的
那同义billy
来个全屏显示,先得到桌面的canvas,在把得到的canvas化在你自己的程序的全屏上.
可以了把。
 
>>foxs
我要做的就是一个活动的桌面背景!
谁有好的方法?最好有原码,我的EMAIL:thiswang@sian.com
 
终于可以为 A.W 提供一个完整的方法了。Sigh !

procedure TForm1.Button1Click(Sender: TObject); // 在桌面上画的过程
var
hDesktop,hDesktopDC: THandle;
FCanvas: TCanvas;
begin
FCanvas := TCanvas.Create;
hDeskTop := FindWindow('Progman', nil);
try
hDesktopDC := GetDC(0);
FCanvas.Handle := hDesktopDC;
with FCanvas do
begin
Rectangle(100,100,200,200);
end;
finally
ReleaseDC(hDesktop, hDesktopDC);
FCanvas.Free;
end;
end;

procedure TForm1.Button2Click(Sender: TObject); // 擦除刚才画的东西
var
R: TRect;
begin
R := Rect(100,100,200,200);
RedrawWindow(0,@R,0,RDW_ERASE or RDW_INVALIDATE or RDW_ALLCHILDREN);
end;

至于活动的图像,方法很多,就不说了!
 
多人接受答案了。
 
后退
顶部