我希望在桌面上有一个小窗口,它总是在桌面上,它只有两个按钮(有一些工作),因为桌面小工具已停止使用Windows 8.Any Other Hard - 这样做的替代方案?
答案 0 :(得分:2)
是的,但这确实需要一些工作。概述过程:
ShowInTaskbar
属性设置为false,因此它不会显示在任务栏中。BorderStyle
属性设置为None。 (这也很方便地删除了标题栏,最小化/最大化按钮等)。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);
}