はじめに
今回は動く壁紙として有名なWallpapaer Engineのように、Unityで作ったプロジェクトを壁紙として表示する方法を書きます。
仕組み
壁紙のウィンドウハンドルを取得し、Unityのプロジェクトをそのウィンドウの子ウィンドウとして表示するだけです。
壁紙のウィンドウハンドル
c++で取得します。この記事ではc++でdllを作り、c#で呼び出します。
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
HWND p = FindWindowEx(hwnd, NULL, L"SHELLDLL_DefView", NULL);
HWND* ret = (HWND*)lParam;
if (p)
{
*ret = FindWindowEx(NULL, hwnd, L"WorkerW", NULL);
}
return true;
}
HWND get_wallpaper_window()
{
HWND progman = FindWindow(L"ProgMan", NULL);
SendMessageTimeout(progman, 0x052C, 0, 0, SMTO_NORMAL, 1000, nullptr);
HWND wallpaper_hwnd = nullptr;
EnumWindows(EnumWindowsProc, (LPARAM)&wallpaper_hwnd);
return wallpaper_hwnd;
}
Unityを表示する
[DllImport("WallpaperDLL.dll")] //c++で作ったdllを呼び出す
static extern IntPtr GetWallpaperHWND();
/*------------------------------------------*/
var path = ユニティーのexeのパス;
var cmdline = $"-parentHWND {GetWallpaperHWND()}";//子ウィンドウとして起動
Process exe = Process.Start(path, cmdline);
完成
二つ作ってみました。結構いい感じにできてよかったです。
ソース
DLL
最後に
結構簡単なのでぜひ試してみてください
参考
https://yotiky.hatenablog.com/entry/unity_uaal-wpf
https://stackoverflow.com/questions/56132584/draw-on-windows-10-wallpaper-in-c