程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了是否可以在 Python 中使用 IDesktopWallpaper?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决是否可以在 Python 中使用 IDesktopWallpaper??

开发过程中遇到是否可以在 Python 中使用 IDesktopWallpaper?的问题如何解决?下面主要结合日常开发的经验,给出你关于是否可以在 Python 中使用 IDesktopWallpaper?的解决方法建议,希望对你解决是否可以在 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?

是否可以在 Python 中使用 IDesktopWallpaper?

是否可以在 Python 中使用 IDesktopWallpaper?

是否可以在 Python 中使用 IDesktopWallpaper?

是否可以在 Python 中使用 IDesktopWallpaper?

大佬总结

以上是大佬教程为你收集整理的是否可以在 Python 中使用 IDesktopWallpaper?全部内容,希望文章能够帮你解决是否可以在 Python 中使用 IDesktopWallpaper?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。