【发布时间】:2016-06-29 19:10:57
【问题描述】:
我想在桌面上有一个小窗口,它总是在桌面上,它只有两个按钮(可以做一些工作),因为桌面小工具从 Windows 8 中停止。任何其他硬代码替代品去做?
【问题讨论】:
标签: windows winforms windows-desktop-gadgets
我想在桌面上有一个小窗口,它总是在桌面上,它只有两个按钮(可以做一些工作),因为桌面小工具从 Windows 8 中停止。任何其他硬代码替代品去做?
【问题讨论】:
标签: windows winforms windows-desktop-gadgets
是的,这是可能的,但确实需要一些工作。概述该过程:
ShowInTaskbar 属性设置为 false,因此它不会显示在任务栏中。BorderStyle 属性设置为无。 (删除标题栏、最小化/最大化按钮等也很方便)WM_WINDOWPOSCHANGING 消息,这样您就可以将窗口保持在Z-Order 的底部。WM_NCHITTEST 消息,以便您可以通过拖动表单的背景来移动表单。返回HTCAPTION,这样系统就像您的鼠标在表单的标题栏中一样。作为一个简单的演示,创建一个表单,将 ShowInTaskbar 属性设置为 false,BorderStyle 设置为 None。然后添加以下代码:
static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
private const int WM_NCHITTEST = 0x0084;
private const int WM_WINDOWPOSCHANGING = 0x0046;
private const int HTCAPTION = 2;
private const int HTCLIENT = 1;
private struct WINDOWPOS
{
public IntPtr hwnd;
public IntPtr hwndInsertAfter;
public int x;
public int y;
public int cx;
public int cy;
public uint flags;
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_NCHITTEST)
{
m.Result = new IntPtr(HTCAPTION);
return;
}
else if (m.Msg == WM_WINDOWPOSCHANGING)
{
WINDOWPOS posInfo = Marshal.PtrToStructure<WINDOWPOS>(m.LParam);
posInfo.hwndInsertAfter = HWND_BOTTOM;
Marshal.StructureToPtr(posInfo, m.LParam, true);
}
base.WndProc(ref m);
}
【讨论】: