大佬教程收集整理的这篇文章主要介绍了是否可以在 Python 中使用 IDesktopWallpaper?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个更改壁纸的简单代码:
import ctypes
import random
import os
start_path = "D:/my_wallpapers"
List_images = os.Listdir(start_path)
img_path = os.path.join(start_path,random.choice(List_images))
ctypes.windll.user32.SystemParametersInfoW(20,img_path,0)
我有两个显示器。此代码为两个显示器设置相同的图像。我想设置不同的图像。我发现有 IDesktopWallpaper (https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-idesktopwallpaper-setwallpaper)。是否可以在 Python 中使用 IDesktopWallpaper?
我寻求帮助,编写代码以便 IDesktopWallpaper 可以通过 Python 3 启动。 尊敬的马克西姆。
附言我使用 windows 10 64 位
ps2。 特别适用于 Strive Sun - MSFT 在我看来,我能够解决第一个问题。我能够将 ID_monitour 转移到 DLL。
voID SetWallpaper(int id_mon)
{
std::wString s = L"D:\\images\\my_img.jpg";
HRESulT ad;
Uint count;
WCHAR* mID = new WCHAR[200];
WCHAR* temp = mID;
memset(mID,200 * 2);
CoInitialize(null);
IDesktopWallpaper* p;
if (SUCCEEDED(CoCreateInstance(__uuIDof(DesktopWallpaper),CLSCTX_LOCAL_SERVER,__uuIDof(IDesktopWallpaper),(void**)&p))) {
p->GetMonitorDevicePathCount(&count); //count: the numbers of monitor
if (ID_mon!=0) {
p->GetMonitorDevicePathAt(ID_mon-1,&mID); //1: first monitor 2: second monitor,etc...
ad = p->SetWallpaper(mID,s.c_str());
}
else {
ad = p->SetWallpaper(NulL,s.c_str()); // 0: both monitors
}
p->Release();
}
delete[] temp;
CoUninitialize();
}
但是传path_to_my_img.jpg,我不能。我不明白在带有 String 参数的 C++ 中发生了什么。我试图利用char,但我无法在wString中转换char
最简单的方法是从python中调用C++ DLL,python中不需要处理com接口的一些语法问题。
.py
import os
import sys
from ctypes import *
lib = cdll.LoadLibrary('D:\\Sample\\Debug\\Sample.dll')
lib.SetWallpaper(0,'C:\\Users\\xyz\\Desktop\\panda.png')
.dll
// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include <Windows.h>
#include <String>
#include "Shobjidl.h"
extern "C" {
__declspec(dllexport)
void SetWallpaper(int id,const wchar_t* s)
{
HRESULT ad;
Uint count;
WCHAR* mid = new WCHAR[200];
WCHAR* temp = mid;
memset(mid,200 * 2);
CoInitialize(null);
IDesktopWallpaper* p;
if (SUCCEEDED(CoCreateInstance(__uuidof(DesktopWallpaper),CLSCTX_LOCAL_SERVER,__uuidof(IDesktopWallpaper),(void**)&p))) {
p->GetMonitorDevicePathCount(&count); //count: the numbers of monitor
p->GetMonitorDevicePathAt(id,&mid); //0: the first monitor 1: the second monitor
ad = p->SetWallpaper(mid,s);
p->Release();
}
delete[] temp;
CoUninitialize();
}
}
BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
如果你不知道如何创建一个简单的dll,请参考:Walkthrough: Create and use your own Dynamic Link Library (C++)
更新:
你需要安装一个vs编译器,比如VS2019,然后按照下面的步骤,
以上是大佬教程为你收集整理的是否可以在 Python 中使用 IDesktopWallpaper?全部内容,希望文章能够帮你解决是否可以在 Python 中使用 IDesktopWallpaper?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。