2012-04-04 83 views
3

我正在创建桌面小工具,并且遇到问题。该窗口将隐藏的“显示桌面”命令 - 停止,我知道你在想什么,不需要“你不应该这样做”的评论 - 我想停止它。毕竟,桌面小工具的重点在于它坚持桌面。通过“显示桌面”保持窗口可见/ Win + D

只是澄清 - 我不想要一个TopMost窗口。我不想实际停止“显示桌面”命令,只是忽略它。我只想让我的桌面小工具在桌面上保持可见状态,并像往常一样破坏正常的功能。

任何想法?我目前的方法是在Google上找到的P/Invoke片段,将表单的父项设置为Progman或其他。问题是,这似乎强制显示在任务栏中的窗口,我不想要。

+0

所以当用户点击“显示桌面”时,你的小工具是隐藏的?听起来似乎对我来说很合理,因为当我点击显示桌面时,内置小工具不会隐藏,因此您不希望发生这种情况。这是一个“真正的”小工具吗?我以为他们是HTML,但你提到最顶级的形式... – 2012-04-04 10:52:44

+0

这是一个Winforms应用程序。我最初尝试制作一个“侧边栏”/桌面小工具,但使用C#我感觉更加舒适,无论我对样式表和其他东西感到困惑,我也无法让它看起来像我想要的样子。我放弃了它,并决定尝试制作自己的独立小工具。 – robhol 2012-04-04 11:03:45

+0

我不认为winforms是你想要实现的方式。最好用html – nawfal 2012-04-04 12:25:16

回答

6

也许有点晚了一个回答你的问题,但仍然在这里的答案,我似乎找到了:

[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下适合我。

+0

是否可以避免窗口在任务栏上显示的OP问题? – Emile 2015-09-15 15:28:10

+1

是:)它不显示任何任务栏图标。但直到现在我还有另一个问题:窗口不能出现在其他(普通)窗口的上方。我想,两者的原因是,因为它已经成为“SHELLDLL_DefView”的子窗口。我只是试验“WS_POPUP”风格。 – 2015-09-18 19:46:29

+0

这似乎不适用于Windows 10,如http://stackoverflow.com/q/35045060/2551829中所述。我真的不明白你的代码是否足够努力去尝试和构建这个概念,使它在10上工作。你知道如何修改它以使它在Windows 10中工作吗? – DeadEli 2016-03-23 22:00:58