所以,我有一个申请。我希望它始终位于目标应用程序之上的一个z级别。它只是在标题栏中显示状态消息,它很难看,但这是我必须满足的要求。
像这样:
我研究了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);
}
这是低效的,闪烁的代码嗅觉,有人会知道如何避免这种情况吗?