C# 将WinForm直接“放置”在桌面上

C# 将WinForm直接“放置”在桌面上,c#,winforms,overlay,desktop,C#,Winforms,Overlay,Desktop,所以我想要一个类似于桌面覆盖的东西。所以问题是我试图直接画到桌面墙纸上,但这会被重新画出来,从我所读到的来看,这真的没有好办法。所以我试着使用一个没有broderless的完全透明的WinForm,上面有文本 我遇到的问题是,点击Windows+D会隐藏应用程序,我没有找到一种方法来防止这种情况发生或再次启动它。我还了解到,将表单设置为桌面的子级也会导致问题 到目前为止,我所做的是在桌面正上方设置表单的位置: [DllImport("user32.dll")] static extern

所以我想要一个类似于桌面覆盖的东西。所以问题是我试图直接画到桌面墙纸上,但这会被重新画出来,从我所读到的来看,这真的没有好办法。所以我试着使用一个没有broderless的完全透明的WinForm,上面有文本

我遇到的问题是,点击Windows+D会隐藏应用程序,我没有找到一种方法来防止这种情况发生或再次启动它。我还了解到,将表单设置为桌面的子级也会导致问题

到目前为止,我所做的是在桌面正上方设置表单的位置:

[DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
    const UInt32 SWP_NOSIZE = 0x0001;
    const UInt32 SWP_NOMOVE = 0x0002;
    const UInt32 SWP_NOACTIVATE = 0x0010;
    //By calling SetWindowPos(Handle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); it will move to the very back of all windows.

最后我想要的是一个Win表单,它总是在桌面上,但在其他窗口下。

你应该运行一个线程,在很短的时间内,比如100ms调用BringWindowToTop api,并将你的窗口应用程序带到顶部,它将解决Win+D问题


没有文件记录的方法可以做到这一点,微软不喜欢让这变得容易。但通过pinvoking FindWindowEx可以找到名为Progman的窗口,FindWindowEx可以再次找到名为SHELLDLL_DefView的子窗口,SetParent可以将窗口粘附到它上。它确实以多种方式使保修无效,这不是我想要支持的。谷歌视窗窗体取代桌面视窗,寻找比我更勇敢的人。我稍后会研究这个问题。非常感谢@汉斯帕桑非常感谢,它就像一个符咒!
[DllImport("user32.dll", SetLastError=true)]
static extern bool BringWindowToTop(IntPtr hWnd);

[DllImport("user32.dll", SetLastError=true)]
static extern bool BringWindowToTop(HandleRef hWnd);