SetWindowPos高于其他窗口

时间:2018-02-21 13:18:03

标签: c# winforms winapi user32

所以,我有一个申请。我希望它始终位于目标应用程序之上的一个z级别。它只是在标题栏中显示状态消息,它很难看,但这是我必须满足的要求。

像这样:

Desired effect

我研究了WM_NCPAINT,在项目的这个阶段(原型设计/提案),这不是一个真正可行的解决方案。

我在SetWindowPos()中发现了user32.dll函数:

[DllImport("user32.dll", SetLastError = true)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, Swp uFlags);

并将所有z级相关事件(所有应用程序)挂钩:

SetWinEventHook(EVENT_OBJECT_SHOW, EVENT_OBJECT_FOCUS, IntPtr.Zero, ZOrderChanged, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS | WINEVENT_SKIPOWNTHREAD);

这似乎在某种程度上起作用。但是,因为我只能设置为直接位于目标应用程序后面,所以我必须两次调用SetWindowPos()来实现此目的,一次获取目标的z级别并且一次交换两个:

    private void ZOrderChanged(IntPtr hWinEventHook, uint eventType, IntPtr lParam, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
    {
        SetWindowPos(Handle, _foxViewHWnd, 0, 0, 0, 0, Swp.Noactivate | Swp.Nomove | Swp.Nosize);
        SetWindowPos(_foxViewHWnd, Handle, 0, 0, 0, 0, Swp.Noactivate | Swp.Nomove | Swp.Nosize);
    }

这是低效的,闪烁的代码嗅觉,有人会知道如何避免这种情况吗?

0 个答案:

没有答案