我一直在尝试使用Qt和mingw32编写一个应用程序来下载图像并将它们设置为背景壁纸.我已经在线阅读了几篇关于如何在VB和C#中执行此操作的文章,并且在某种程度上如何在c ++中执行此操作.我目前正在调用SystemParametersInfo看似所有正确的参数(没有编译器错误)并且它失败了.没有镲片的大崩溃,只是0返回.GetLastError()同样具有启发性0.
下面是我正在使用的代码(稍微修改一下,因此您不必查看对象内部).
#include <windows.h>
#include <iostream>
#include <QString>
void setWall()
{
QString filepath = "C:\\Documents and Settings\\Owner\\My Documents\\Wallpapers\\wallpaper.png";
char path[150];
strcpy(path, currentFilePath.toStdString().c_str());
char *pathp;
pathp = path;
cout << path;
int result;
result = SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pathp, SPIF_UPDATEINIFILE);
if (result)
{
cout << "Wallpaper set";
}
else
{
cout << "Wallpaper not set";
cout << "SPI returned" << result;
}
}
Run Code Online (Sandbox Code Playgroud) 有没有办法在 C++ 中处理 Windows 的墙纸(图标后面)以便在它上面绘图?这将允许制作等效的活动桌面(在 Windows XP 之后停止使用)、等效的墙纸引擎或任何其他类似工具。(在我的情况下,墙纸上的温度和资源使用情况监控)。
注意:返回的句柄返回GetDesktopWindow()桌面图标级别的窗口,而不是在它后面。
类似问题的解决方案对我不起作用。具体来说,我尝试了 VLC 媒体播放器的墙纸模式代码。
关键代码是:
hwnd = FindWindow( _T("Progman"), NULL );
if( hwnd ) hwnd = FindWindowEx( hwnd, NULL, _T("SHELLDLL_DefView"), NULL );
if( hwnd ) hwnd = FindWindowEx( hwnd, NULL, _T("SysListView32"), NULL );
if( !hwnd )
{
msg_Warn( p_vout, "couldn't find \"SysListView32\" window, "
"wallpaper mode not supported" );
return;
}
Run Code Online (Sandbox Code Playgroud)
但它不会在壁纸上绘制。
如何在C/C++程序中更改Linux桌面上的壁纸(使用GNOME)?有没有系统API可以做到这一点?
我需要捕获没有背景图片(壁纸)的屏幕截图。我可以尝试禁用墙纸,拍摄屏幕截图,然后重新启用它,但是:
有谁知道在哪里寻找解决方案的解决方案或想法?也许可以暂时禁用壁纸?
更新:屏幕截图是注册错误程序的一部分,因此我需要所有可能有用的信息(可见表单、任务栏等),并且非常希望将屏幕截图保持在无损格式(更易读、压缩速度更快)。选项之一是捕捉镜头以将它们存储为 AVI,因此处理时间也很重要。背景使图像更大,这是我试图删除它的唯一原因。我可以使用一些算法来减少使用的颜色,它大大提高了压缩率,但它是耗时的过程。所以最重要的是完全删除背景图片。
更新 2:为了从镜头序列生成 AVI,我使用了 François PIETTE 的单元(基于本文):
Avi := TAviFromBitmaps.CreateAviFile(
nil,
AviFilename,
MKFOURCC('S', 'C', 'L', 'S'), // msu-sc-codec
2, 1); // 2 frames per second
// called by timer
procedure TfrmSnapshot.RecordFrame;
begin
TakeSnapshot; // get snap shot to BMP:TBitmap
Avi.AppendNewFrame(Bmp.Handle);
end;
Run Code Online (Sandbox Code Playgroud)
因此,如果我能够从快照中删除背景,那么 AVI 压缩也将得到改进。
我使用的最终代码部分:
TAppRects = class
protected
FMonitor: TMonitor;
FRects: TList<TRect>;
function GetRegion(AArea: TRect): HRGN;
public
constructor Create(AMonitor: TMonitor);
destructor Destroy; override;
// fill all Area which is not …Run Code Online (Sandbox Code Playgroud) 我已经想出了如何更改桌面壁纸(互联网上有几十个例子.)
有一件事我仍然无法理解:如何检测壁纸何时发生变化?(通过显示控制面板或其他程序更改它.)
我需要制作一个批处理文件,将墙纸更改为与蝙蝠文件位于同一位置的图片,我目前有以下代码:
reg add "HKCU\Control Panel\Desktop" /v Wallpaper /f /t REG_SZ /d c:\images\wallpaper.bmp
Run Code Online (Sandbox Code Playgroud)
问题是它的图片需要放在文件夹c:\ images \中,我需要将它放在与bat文件相同的位置。有谁知道我该怎么做。
我正在使用:
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER,
0, "picturefile", 0)
Run Code Online (Sandbox Code Playgroud)
要改变壁纸.
但我想知道是否有任何简单的方法在每个屏幕上放置不同的壁纸.
虽然这个功能在Windows中不是标准功能,但是像ultramon这样的外部应用程序可以做到这一点.有谁知道它是如何工作的?
如果我将两个图像合并为一个然后制作壁纸,我认为它可能会起作用的方式,但是我仍然需要一种跨两个屏幕跨越一个图像的方法.
另外,我如何获取有关显示器设置,每个屏幕的分辨率及其位置的一些信息?就像你在windows中的gui显示设置中看到的那样,但是在数字中.
我试图远程更改在WORKGROUP环境中运行Win 7的大约50台计算机上的壁纸.
我拥有所有这些的本地管理员权限,而且他们正在运行一个代理(Faronics),可以让我远程推送.bat .exe .msi .vbs和.ps1.
只是想知道是否有任何应用程序允许我远程执行此操作,或者如果没有,是什么是将我的图像添加到这些计算机并将其设置为默认壁纸的最简单方法?
我想获得家居壁纸并将其作为我活动的背景.这可能吗 ?
我在网上搜索过
WallpaperInfo v = w.getWallpaperInfo();
String name = v.getServiceName();
Run Code Online (Sandbox Code Playgroud)
我有服务名称(因为壁纸是一个实时服务),例如,我com.android.wallpaper.grass.GrassWallpaper...我可以使用它来启动服务到我的活动?
如果是这样,怎么样?
我尝试更改桌面壁纸.当我像这样使用它时它工作得很好:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\1.jpg", SPIF_SENDCHANGE);
Run Code Online (Sandbox Code Playgroud)
但是当我像这样使用它时,桌面壁纸设置为完全黑色:
std::string s = "C:\\1.jpg";
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &s, SPIF_SENDCHANGE);
Run Code Online (Sandbox Code Playgroud)
我试图通过使用获得更多信息GetLastError(),但返回值只是0.我也尝试使用.png文件,但这不会改变任何东西.
我有什么想法我做错了吗?
我需要在C/C++上为Mac OS X Lion编写交互式动态壁纸.它必须是什么类型的应用程序(xcode方面的目标)?插入?可可应用?等等?请帮我一些教程,也许是工作源代码.