无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 8610|回复: 25
打印 上一主题 下一主题

【原创】玩转PE墙纸(开机随机显示墙纸+一键切换循环显示)

[复制链接]
跳转到指定楼层
1#
发表于 2010-3-20 02:38:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
闲着无聊,写了个设置墙纸的批处理,可轻松实现开机随机显示墙纸和一键切换循环显示,有兴趣的可以试试

原文出自:http://hi.baidu.com/nictense/blog/item/9ab54c4257cedc1f73f05dd7.html

批处理文件名为SETWP.CMD,放在PE的wxpe\system32目录下,源代码如下:(直接下载: setwp2.rar (513 Bytes, 下载次数: 228)

@echo off
::NicTense 写于 2010.03.19
setlocal enableextensions
setlocal enabledelayedexpansion
set p=%SystemDrive%\wxpe\pic
for /f "tokens=2,*" %%i in ('reg query "HKCU\Control Panel\Desktop" /v Wallpaper') do (
set w=%%j
if /i "!w:~0,11!"=="!p!" set "w=%%~nxj" & goto next
)
for /f "tokens=2,*" %%i in ('reg query "HKCU\Control Panel\Desktop" /v ConvertedWallpaper') do (
set w=%%j
if /i "!w:~0,11!"=="!p!" ( set "w=%%~nxj" ) else set w=
)
:next
set n=0
for /f "tokens=*" %%i in ('dir %p%\*.bmp %p%\*.jpg /b /on') do (
set "w!n!=%%i"
set /a n+=1
if "!w!"=="found" set "w=%%i" & goto wall
if /i "%%i"=="!w!" set w=found
)
if /i "%1"=="rand" if "%w%"=="" goto rand
set "w=%w0%" & goto wall
:rand
set /a n=!RANDOM!%%n
set w=!w%n%!
:wall
if not "%w%"=="" pecmd.exe WALL "%p%\%w%"


这里我们假设所有的墙纸文件放在\wxpe\pic目录下,若放于其他目录请修改源代码中的红色部分
墙纸文件格式必须为bmp或者jpg,文件名和数量不限

接下来需要在pecmd.ini中增加2行

第一行,在SHEL之前增加

HOTK #121,PECMD.EXE EXEC !%WinDir%\SYSTEM32\SETWP.CMD rand

这里我们设定F10为快捷键,修改该值可设定为其他快捷键,该行最后的rand若去掉,则开机后自动设定按文件名排序第一的图片为墙纸,否则随机显示一幅墙纸

启动后按快捷键可循环切换当前墙纸,即按一次换一幅

第二行,加在SHEL之后

SEND #121

这里的#121和上行对应

好了,大功告成,收摊,睡觉!


本人近期发布帖子汇总,方便查询

【下载】Tango WinPE 2010 虎年珍藏版,32M新版XP3内核PE

【原创】为你的PE系统添加计算机型号和CPU识别功能

【原创】TXTSETUP.SIF减肥和检查错误批处理TSLite

【原创】玩转PE墙纸(开机随机显示墙纸+一键切换循环显示)

【下载】通用型PE一键美化工具PEBeautify+TangoPE美化包(PE美化,只需10秒)

【分享】利用PECMD和MSPAINT实现零体积一键截图功能

【原创】shell32.dll的终极精简&美化教程 (这个是很久前的了)

[ 本帖最后由 NicTense 于 2010-3-23 18:58 编辑 ]
2#
发表于 2010-3-20 07:16:26 | 只看该作者
貌似就是多了用random吧
回复

使用道具 举报

3#
发表于 2010-3-20 07:18:10 | 只看该作者
这么晚都还没休息,辛苦了!
回复

使用道具 举报

4#
发表于 2010-3-20 07:27:04 | 只看该作者
原帖由 NicTense 于 2010-3-20 02:38 发表
闲着无聊,写了个设置墙纸的批处理,可轻松实现开机随机显示墙纸和一键切换循环显示,有兴趣的可以试试批处理文件名为SETWP.CMD,放在PE的wxpe\system32目录下,源代码如下:(直接下载:85207)这 ...

天使兄弟的智慧无穷尽啊,顶贴来了,呵呵!
回复

使用道具 举报

5#
 楼主| 发表于 2010-3-20 10:43:17 | 只看该作者
原帖由 slore 于 2010-3-20 07:16 发表
貌似就是多了用random吧


呵呵,改造了一下,增加随机显示的选择,墙纸没什么可以玩的,也就这样了

对了,vc你熟不熟,如果写个单一功能的,把当前剪贴板的图片输出到指定格式指定文件名的命令行工具

是不是几K就可以实现
回复

使用道具 举报

6#
发表于 2010-3-20 10:47:46 | 只看该作者
这P处理,你玩的也 太熟了! 呵呵,一切都为了更帅!
回复

使用道具 举报

7#
发表于 2010-3-20 11:04:56 | 只看该作者
天使也是强人啊! !
回复

使用道具 举报

8#
发表于 2010-3-20 15:08:34 | 只看该作者
你帅啊!!!猛人一个!!!!
之前我也想了一个开机随即壁纸,我是用PECMD弄的,启动的时候截取当前时间秒的最后一位,然后把那个数字再运算一下得到一个随即数 不过没你这个灵活,没你这个帅啊
回复

使用道具 举报

9#
发表于 2010-3-20 18:40:39 | 只看该作者
折腾无罪  继续努力
回复

使用道具 举报

10#
发表于 2010-3-20 21:25:23 | 只看该作者
nircmd不错呀。。。
30多kB功能超强。。。


VC吧,都不行了,现在就会脚本什么的。。。
搞了半天才搞出来。感觉貌似用汇编写能小些=。=

USBFIX才5KB呀!你应该找他搞的。。。

S2B.exe 2.5KB

你测试下吧,我在XP下合PE下测试可用。

晕貌似该叫C2B。。。

自己按PrintScreen(你要用pecmd按对吧?)

这个只是将剪贴板图像保存为bitmap的。

S2B.rar

1.51 KB, 下载次数: 77, 下载积分: 无忧币 -2

回复

使用道具 举报

11#
 楼主| 发表于 2010-3-20 21:37:37 | 只看该作者
原帖由 slore 于 2010-3-20 21:25 发表
nircmd不错呀。。。
30多kB功能超强。。。


VC吧,都不行了,现在就会脚本什么的。。。
搞了半天才搞出来。感觉貌似用汇编写能小些=。=

USBFIX才5KB呀!你应该找他搞的。。。

S2B.exe 2.5KB

你 ...


2.5k,体积很帅,谢了,不过bmp太大了,最好是png,或者jpg也行,没道理再通过转换软件处理
貌似vc有函数可以直接存为jpg或者png的,应该是调用的shimgvw.dll的函数

nircmd是不错,但是里面很多命令很容易变成后门,而对pe来说,有用的只有几个
据说有些杀毒软件当他病毒,所以我都不知道集不集成他好

cnad vc是挺熟的,不过他好象比较忙,他的peset第四版都要等一个星期

哎,我用c和汇编的时候是10年前在大学的时候,现在看到c一点亲切感都没有了,都快接近乱码了,汇编更是。。。
记忆力衰退啊,重新学再装个庞大的软件就为了编个几k的软件也不是个办法啊

现在好痛苦啊,前段时间对grub还挺熟的,最近写了几个批处理,grub又忘光了,隔几天又一个人生。。。。
回复

使用道具 举报

12#
 楼主| 发表于 2010-3-20 21:41:34 | 只看该作者
自己按PrintScreen(你要用pecmd按对吧?)


知我者,slore也

其实我本来是想 直接用 pecmd send 模拟按键后,自动打开画笔,然后再自动粘贴

利用画笔的图片处理功能就是一个完整的截图功能了

可以截取整个屏幕或者正在打开的窗口,已经足够了

我原来用win7的那个抓图,抓出来的效果还不如直接按  alt+print screen
回复

使用道具 举报

13#
发表于 2010-3-20 21:46:32 | 只看该作者
学习了~~~~~~~~~
回复

使用道具 举报

14#
发表于 2010-3-20 22:49:16 | 只看该作者
没有现成的,有现成intel jpeg libray库。
找个时间试下。现学现卖,都是google找
相关函数,自己乱整合的。

既然内核mspaint,干嘛把关联给精简了?
预览,右键都不能直接编辑了。。。
回复

使用道具 举报

15#
发表于 2010-3-21 00:03:35 | 只看该作者
用nircmd,功能强大,配合PECMD.
回复

使用道具 举报

16#
 楼主| 发表于 2010-3-21 00:20:23 | 只看该作者
原帖由 slore 于 2010-3-20 22:49 发表
没有现成的,有现成intel jpeg libray库。
找个时间试下。现学现卖,都是google找
相关函数,自己乱整合的。

既然内核mspaint,干嘛把关联给精简了?
预览,右键都不能直接编辑了。。。


右键关联没注意,有空我把它还原回去

img1.Picture.Assign(Clipboard);
img1.Picture.SaveToFile( "c:\11.jpg ");

delphi的好方便啊...就是delphi出来的程序还是比较大

vb最牛,记得以前老师布置作业,要求写一个算法,两种显示方式,一种是直接运算显示结果,一种是加上延迟,要看到算法的运作过程的效果
结果我用vb写好,没有加任何延迟就“实现”了延迟的效果,直接显示结果没法实现,因为实在是太慢了,最后我想了个办法,不用运算,反正结果是知道的,直接显示给老师看,他也不看代码,只看显示器,顺利通过了

找来找去,好像vc都是只有保存为bmp的源代码,vb和delphi本身有函数,很容易实现
shimgvw.dll应该有相关函数才对啊,貌似vc应该可以直接调用的

以下代码保存剪贴板中的位图到文件   
   
  BOOL   SaveBitmap(const   BITMAP   &bm,HDC   hDC,HBITMAP   hBitmap,LPCTSTR   szFileName)   
  {   
   
  int   nBitPerPixel   =   bm.bmBitsPixel;//获得颜色模式   
          int   nW   =   bm.bmWidth;   
          int   nH   =   bm.bmHeight;   
  int   nPalItemC=bm.bmPlanes; //调色板项的个数   
  int   nBmpInfSize=sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nPalItemC;//位图信息的大小   
  int   nDataSize=(nBitPerPixel*nW+31)/32*4*nH;//位图数据的大小   
  //初始化位图信息   
          BITMAPFILEHEADER   bfh   =   {0};//位图文件头   
          bfh.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   nBmpInfSize;//sizeof(BITMAPINFOHEADER);//到位图数据的偏移量   
          bfh.bfSize   =   bfh.bfOffBits   +   nDataSize;//文件总的大小   
          bfh.bfType   =   (WORD)0x4d42;//位图标志   
  char   *   p   =   new   char[nBmpInfSize+nDataSize];//申请内存位图数据空间(包括信息头)   
          memset(p,0,nBmpInfSize);//将信息头的数据初始化为0   
  LPBITMAPINFOHEADER   pBih   =   (LPBITMAPINFOHEADER)   p;//位图信息头   
          pBih->biCompression   =   BI_RGB;   
  pBih->biBitCount   =   nBitPerPixel;//每个图元像素使用的位数   
          pBih->biHeight   =   nH;//高度   
  pBih->biWidth   =   nW;//宽度   
          pBih->biPlanes   =   1;   
          pBih->biSize   =   sizeof(BITMAPINFOHEADER);   
          pBih->biSizeImage   =   nDataSize;//图像数据大小   
          char   *pData=p+nBmpInfSize;   
  //DDB转换为DIB   
          ::GetDIBits(hDC,hBitmap,0,nH,pData,(LPBITMAPINFO)   pBih,   DIB_RGB_COLORS);//获取位图数据   
  ofstream   ofs(szFileName,ios::binary);   
  if(ofs.fail())   
  return   FALSE;   
          ofs.write((const   char*)&bfh,   sizeof(BITMAPFILEHEADER));//写入位图文件头   
          ofs.write((const   char*)pBih,   nBmpInfSize);//写入位图信息数据   
          ofs.write((const   char*)pData,   nDataSize);//写入位图数据   
  return   TRUE;   
  }   
   
  void   main()   
  {   
  HWND   hWnd=NULL;   
  ::OpenClipboard(hWnd);   //   打开剪贴板   
  HANDLE   hBitmap   =   ::GetClipboardData(CF_BITMAP);   //   获取剪贴板数据句柄   
  if(hBitmap==NULL)   
  {   
  return   ;   
  }   
  HDC   hDC   =   ::GetDC(hWnd);   //   获取设备环境句柄   
  HDC   hdcMem   =   CreateCompatibleDC(hDC);   //   创建与设备相关的内存环境   
  SelectObject(hdcMem,   hBitmap);   //   选择对象   
  SetMapMode(hdcMem,   GetMapMode(hDC));   //   设置映射模式   
  BITMAP   bm;   //   得到位图对象   
  GetObject(hBitmap,   sizeof(BITMAP),   &bm);   
  SaveBitmap(bm,hDC,(HBITMAP)hBitmap,"clip.bmp");   
  ::ReleaseDC(hWnd,   hDC);   //   释放设备环境句柄   
  DeleteDC(hdcMem);   //   删除内存环境   
  ::CloseClipboard();   //   关闭剪贴板   
   
  }


这还有一段,看来很多跟我一样的无聊人


//获取屏幕中指定区域的图
hbitmap cpage1::gethbitmap()
{
int nwidth=m_rectcapture.width();
int nheight=m_rectcapture.height(); //得到鼠标所在处的窗口的区域宽、高  

hdc hdcscreen, hmemdc;  
hbitmap hbitmap, holdbitmap;  

hdcscreen = createdc(      //建立一个屏幕设备环境句柄
      "display",    //用vbnullstring传递null值给该参数,除非:1、用display,是获取整个屏幕的设备场景;2、用winspool,则是访问打印驱动
      null,     //所用专门设备的名称。该名由打印管理器分配显示
      null,    //用vbnullstring传递null值给该参数
      null     //devmode,这个结构保存初始值。用createdcbynum传递0(null)值则适用默认设置
      );   
hmemdc = createcompatibledc(hdcscreen);   //建立一个与屏幕设备环境句柄兼容、与鼠标所在处的窗口的区域等大的位图
hbitmap = createcompatiblebitmap(hdcscreen, nwidth, nheight);
holdbitmap =(hbitmap)selectobject(hmemdc, hbitmap);    //把新位图选到内存设备描述表中
bitblt(hmemdc, 0, 0, nwidth, nheight, hdcscreen,m_rectcapture.left,m_rectcapture.top,srccopy);  // 把屏幕设备描述表拷贝到内存设备描述表中
hbitmap =(hbitmap)selectobject(hmemdc, holdbitmap);    //取回鼠标所在处的窗口屏幕位图的句柄
deletedc(hdcscreen);
deletedc(hmemdc);    //不再需要时,该设备场景可用deletedc函数删除。删除前,其所有对象应回复初始状态。

return hbitmap;
}

//保存图片
void cpage1::onlbuttonup(uint nflags, cpoint point)
{
/*-------------------------------------------------*/
m_getwininfo.eraselastwindow();  
/*-------------------------------------------------*/

if(this->m_bsavetofile)
  this->writebmptofile(this->gethbitmap());

if(this->m_bcopytoclip)
  this->copybmptoclipboard(this->gethbitmap());

if(this->m_bopenmspaint)
  ::shellexecute(null,"open","mspaint.exe",this->m_strfilepath,null,sw_shownormal);

this->stopcapture();
afxgetmainwnd()->showwindow(sw_normal);     //恢复窗口显示模式
   

cpropertypage::onlbuttonup(nflags, point);
}



呵呵,如果比较麻烦就不弄了,nircmd算了,只要不被当成病毒,这个命令行工具还是挺牛的,30k也够小的了

[ 本帖最后由 NicTense 于 2010-3-21 00:27 编辑 ]
回复

使用道具 举报

17#
发表于 2010-3-21 00:35:06 | 只看该作者
关键是要控制大小呀。。。用Cimage自然可以转2句话。。。
回复

使用道具 举报

18#
 楼主| 发表于 2010-3-21 00:42:11 | 只看该作者
原帖由 slore 于 2010-3-21 00:35 发表
关键是要控制大小呀。。。用Cimage自然可以转2句话。。。


我在网上看到说有些杀毒软件对nircmd报毒,我用金山就没事

不知道有没有这情况,如果确定不会报毒的话,就用它好了,30k也够小了,还有其他可以用的功能

可以做很多0体积的gui,比如文件时间修改工具之类的

fsutil我试下需不需要额外知道,如果不需要也打算集成进去
回复

使用道具 举报

19#
发表于 2010-3-23 12:04:35 | 只看该作者
天使能给做个XP的不?另外再加个随机登录界面跟声音?tks

[ 本帖最后由 aghu 于 2010-3-23 12:19 编辑 ]
回复

使用道具 举报

20#
发表于 2010-3-26 16:01:45 | 只看该作者
楼主真是强人,佩服。
回复

使用道具 举报

21#
发表于 2010-3-26 16:06:25 | 只看该作者
希望天使写一个在任意PE中加载WEB主题的处理
回复

使用道具 举报

22#
 楼主| 发表于 2010-3-26 16:21:28 | 只看该作者
原帖由 dpxqs 于 2010-3-26 16:06 发表
希望天使写一个在任意PE中加载WEB主题的处理


是wb主题吧,我对PE加载主题不感兴趣,你找水舞吧

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=141167

这方面他是高手
回复

使用道具 举报

23#
发表于 2010-3-26 16:47:37 | 只看该作者
水舞没有音讯了
回复

使用道具 举报

24#
发表于 2010-3-28 17:09:44 | 只看该作者
在你的版本的基础上测试了一下。。  可以用。。。。 。
回复

使用道具 举报

25#
发表于 2013-8-19 20:30:09 | 只看该作者
Win8的PE。
有几个问题。
1.用老九的PECMD只能显示字母排序的第一张图片,还会提示没找到注册表什么什么的。一闪而过也看不清楚。
2.用mdyblog的PECMD。。。wall命令在Win8PE里面失效,所以也更不能随机循环壁纸。

我不懂编程,SETWP.CMD里面的内容更是看不懂。但是提示注册表没找到 会不会是这两句出现的问题。
for /f "tokens=2,*" %%i in ('reg query "HKCU\Control Panel\Desktop" /v Wallpaper') do (
set w=%%j
if /i "!w:~0,11!"=="!p!" set "w=%%~nxj" & goto next
)
for /f "tokens=2,*" %%i in ('reg query "HKCU\Control Panel\Desktop" /v ConvertedWallpaper') do (
set w=%%j
if /i "!w:~0,11!"=="!p!" ( set "w=%%~nxj" ) else set w=
)
因为我在PE里面只能看到HKCU\Control Panel\Desktop" /v Wallpaper'这一项 但是看不到下面那个convertedwallpaper这个。
真心求N大指点下。

回复

使用道具 举报

26#
发表于 2021-11-25 12:03:28 来自手机 | 只看该作者
666666766666666666666666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-23 20:35

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表