c#, c++, управление окном, которое за иконками
есть проблема, делаю проект для колледжа, по типу wallpaper engine, только решил поставить на фон окно, winforms, с элементом, webview. Написал dll, которая принимает hwnd окна, и ставит его на фон. Вот только не работает мышь в окне, пробовал sendinput, но не работает, видел на GitHub, кто то делал через sendMessage, подскажите как это работает, не охота просто копировать код, а сам понять не смог
вот мой код на c# и c++
#region dll
[DllImport("set_wallpapers.dll")]
public static extern bool set(IntPtr hwnd);
[DllImport("set_wallpapers.dll")]
public static extern void mouse_capture(IntPtr hwnd);
#endregion
enum window
{
None = 0,
web = 1,
video = 2,
photo =3
}
private System.Windows.Forms.Timer mouseMoveTimer;
window selectedWindow;
WebWallpaper wallpaper;
public video_wallpaper video;
IntPtr hwnd = IntPtr.Zero;
public set_wallpaper()
{
selectedWindow = window.None;
InitializeComponent();
}
#region html
private void set_html_Click(object sender, EventArgs e)
{
close_wallpaper_Click(sender, e);
wallpaper = new WebWallpaper();
hwnd = wallpaper.Handle;
Microsoft.Web.WebView2.WinForms.WebView2 web = wallpaper._web();
if (!string.IsNullOrEmpty(URL_html.Text))
{
web.Source = new Uri(URL_html.Text);
wallpaper.Show();
// set() это функция из моей dll, оно ставит окно в качестве фона рабочего стола
if (set(hwnd))
{
wallpaper.WindowState = FormWindowState.Maximized;
selectedWindow = window.web;
}
}
}
#endregion
private void close_wallpaper_Click(object sender, EventArgs e)
{
switch (selectedWindow)
{
case window.None: break;
case window.web:
wallpaper.Close();
break;
case window.video:
video.Close();
break;
case window.photo:break;
}
selectedWindow= window.None;
}
код от dll
extern "C" __declspec(dllexport) bool set(HWND hwnd)
{
if (hwnd)
{
if (set_wallpapers(hwnd))
{
return true;
}
}
return false;
}
HWND get_wallpaper() {
HWND progman = FindWindow(L"Progman", NULL);
SendMessageTimeout(progman, 0x052C, 0, 0, 0x0000, 1000, nullptr);
EnumWindows([](HWND hwnd, LPARAM lparam) -> BOOL CALLBACK
{
HWND p = FindWindowEx(hwnd, NULL, L"SHELLDLL_DefView", NULL);
if (p)
{
wallpaper = FindWindowEx(NULL, hwnd, L"WorkerW", NULL);
}
return true;
}, NULL
);
return wallpaper;
}
bool set_wallpapers(HWND hwnd)
{
HWND desktop = get_wallpaper();
if (desktop)
{
SetParent(hwnd, desktop);
if (SetParent(hwnd, desktop))
{
return true;
}
}
return false;
}