Skip to content

Latest commit

 

History

History
58 lines (42 loc) · 2.17 KB

2022-03-21-wallpaper-change-by-flutter-for-windows.md

File metadata and controls

58 lines (42 loc) · 2.17 KB
layout title date tags
post
Flutter for Windowsで壁紙を変更してみた
2022-03-21 00:00:00 +0900
Flutter

Software Design (ソフトウェアデザイン) 2022年04月号 で特集されていたFlutterがWindowsにも対応していたのでちょっと遊んでみました。

win32パッケージ

win32 | Dart Package

win32用のパッケージがありまさにまさにやりたいことが実装されていました。

ドキュメントは本家で確認すると分かりやすかったです。

IDesktopWallpaper::SetWallpaper (shobjidl_core.h) - Win32 apps | Microsoft Docs

コード

win32パッケージのexampleには壁紙を変更するものがなかったのでとりあえず動くところまで実装してみました。

final hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

if (FAILED(hr)) {
    throw WindowsException(hr);
}

var desktopWallpaper = DesktopWallpaper.createInstance();
try {
    // モニタの数を取得する
    Pointer<Uint32> monitorDevicePathCountPtr = calloc<Uint32>();
    desktopWallpaper.GetMonitorDevicePathCount(monitorDevicePathCountPtr);
    log("monitorDevicePathCount=${monitorDevicePathCountPtr.value}");

    // すべてのモニタに壁紙を設定する
    Pointer<Utf16> wallpaperFilePathPtr = wallpaperFilePath.toNativeUtf16();
    for (var i=0; i<monitorDevicePathCountPtr.value; i++) {
        Pointer<Pointer<Utf16>> monitorIdPtr = calloc<Pointer<Utf16>>();
        desktopWallpaper.GetMonitorDevicePathAt(i, monitorIdPtr);
        desktopWallpaper.SetWallpaper(monitorIdPtr.value, wallpaperFilePathPtr);

        free(monitorIdPtr);
    }

    free(wallpaperFilePathPtr);
    free(monitorDevicePathCountPtr);
} finally {
    free(desktopWallpaper.ptr);
    CoUninitialize();
}

作りたいもの

Google Photosにアップロードした写真を壁紙に設定出来るものがあると良いなと思って(自分が)せっかくなのでFlutterで作ってみています。