我正在创建一个桌面小工具,但遇到了问题。窗口将被“显示桌面”命令隐藏-停止,我知道你在想什么,不需要“你不应该这样做”的评论-我想停止它。毕竟,桌面小工具的全部意义在于它坚持桌面。
只是想澄清一下--我不想要一个TopMost窗口。我并不想真正停止“显示桌面”命令,只是忽略它。我只想让我的桌面小工具在桌面上保持可见,像往常一样几乎不会破坏正常的功能。
有什么想法吗?我当前的方法是在Google上找到的一个P/Invoke代码片段,将表单的父级设置为Progman或其他什么。问题是,这似乎强制窗口显示在任务栏中,这是我不想要的。
发布于 2015-09-15 22:59:19
也许对你的问题的回答有点晚了,但我似乎已经找到了答案:
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hP, IntPtr hC, string sC, string sW);
void MakeWin()
{
IntPtr nWinHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", null);
nWinHandle = FindWindowEx(nWinHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
SetParent(Handle, nWinHandle);
}
应该在表单的构造函数中调用"MakeWin“,最好在"InitializeComponent”之前。至少在Win7下对我来说效果很好。
发布于 2021-03-27 22:36:32
在此基础上为WPF表单添加我的扭曲。由于WPF窗口句柄的原因,上述代码不起作用。因此,WPF (win 10)可以使用完整的代码:
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindowEx(IntPtr hP, IntPtr hC, string sC, string sW);
void MakeWin()
{
IntPtr nWinHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", null);
nWinHandle = FindWindowEx(nWinHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
var interop = new WindowInteropHelper(this);
interop.EnsureHandle();
interop.Owner = nWinHandle;
}
https://stackoverflow.com/questions/10009623
复制相似问题