标签: z-order

给定一个 hwnd,确定该窗口是否未被其他窗口隐藏(Z-Ordering)

我有一个NativeWindow,我已经覆盖了WndProc处理WM_WINDOWPOSCHANGING消息的函数,当移动我的窗口时,我会将它粘在桌面上最近窗口的边框上。

我遇到的问题是我的窗口停靠在其他顶部窗口背景中的窗口,例如,如果我打开了一个资源管理器窗口并且在资源管理器窗口下方有其他窗口,那么我的窗口可以停靠到那个窗口在另一个窗口的下方,这是比资源管理器窗口低的 z 顺序级别。我想避免这种情况。

问题演示:

在此处输入图片说明

在上面的 GIF 中,有我的窗口 (Form1)、Visual Studio IDE 窗口、资源管理器窗口和一个名为“Hot Corners”的应用程序窗口。当我将“热角”窗口发送到背景时,我仍然可以将我的窗口粘附到“热角”边框上。我想避免这种情况。

请注意捕获的 Visual Studio输出窗口中的调试信息。


我在Wikipedia上阅读了 Z-Ordering ,我也在这里这里看到了这个例子和MSDN文档,但是,我仍然不明白如何实现这一点。

当我尝试将我的窗口粘附到其他窗口时,我需要确定该目标窗口是否在其他窗口下方,以避免出现我解释的问题。

我希望我能很好地解释问题并且清楚我需要什么,在我的窗口上方的 GIF 中,我的窗口不应该坚持“热角”窗口,因为它不可见,因为资源管理器窗口在上方。

这是相关的代码,该方法将我的窗口 (a Form)、我在窗口过程中过滤消息时获得的WINDOWPOS结构的句柄作为参数,最后一个参数是我的窗口到其他窗口的边界以坚持它。WM_WINDOWPOSCHANGINGWndProcthreshold

Protected Overridable Sub DockToNearestWindowBorder(ByVal window As IWin32Window,
                                                    ByVal windowPosHandle As IntPtr,
                                                    ByVal threshold As Integer)

    Dim windowPos As WindowPos =
        CType(Marshal.PtrToStructure(windowPosHandle, GetType(WindowPos)), WindowPos)

    If (windowPos.Y = 0) OrElse (windowPos.X = …
Run Code Online (Sandbox Code Playgroud)

.net vb.net winapi window z-order

7
推荐指数
1
解决办法
2418
查看次数

点击时不要将按钮带到前台

我的应用程序目前如下所示.Buttona RelativeLayout中有三个s ,中间按钮左右边距为负,与其他两个按钮重叠.

问题:当我单击左侧或右侧按钮时,它会到达前景一秒钟并重叠中间按钮,这看起来非常难看.

在此输入图像描述

在此输入图像描述

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal">

        <Button
            android:id="@+id/voices"
            android:layout_width="160dp"
            android:layout_height="wrap_content"

            android:layout_gravity="center_vertical"

            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:onClick="clickVoices"
            android:background="#333"
            android:textColor="#fff"
            android:text="@string/main_voices" />

        <Button
            android:id="@+id/chat"
            android:layout_width="160dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"

            android:onClick="clickChat"
            android:background="#333"
            android:textColor="#fff"
            android:text="@string/main_chat" />

        <Button
            android:id="@+id/record"
            android:layout_width="60dp"
            android:layout_height="100dp"

            android:clickable="true"
            android:onClick="clickRecord"
            android:scaleType="centerInside"
            android:src="@drawable/record"
            android:text="Record"
            android:layout_toRightOf="@+id/voices"
            android:layout_toLeftOf="@+id/chat"
            android:layout_marginLeft="-20dp"
            android:layout_marginRight="-20dp"
            android:layout_marginTop="-30dp"
            android:background="@drawable/round_button"

            android:paddingTop="30dp"
            android:layout_marginBottom="10dp" />
    </RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

android button z-order overlap relativelayout

7
推荐指数
1
解决办法
772
查看次数

如何在android中更改surfaceview的z顺序运行时

最近在研究android中的webrtc。

我想单击SurfaceView A 使其全屏,而另一个SurfaceView B 变小,或者单击 B。但我发现很难在运行时更改两个不同 SurfaceView 的 z 顺序。

这是我的布局

<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/app_bar_main">

<org.webrtc.PercentFrameLayout
    android:id="@+id/remote_video_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <org.webrtc.SurfaceViewRenderer
        android:id="@+id/remote_video_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</org.webrtc.PercentFrameLayout>

<org.webrtc.PercentFrameLayout
    android:id="@+id/local_video_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <org.webrtc.SurfaceViewRenderer
        android:id="@+id/local_video_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:keepScreenOn="true" />

</org.webrtc.PercentFrameLayout>
Run Code Online (Sandbox Code Playgroud)


PercentFrameLayout 是 ViewGroup 的子类,用于测量屏幕百分比。
我尝试在运行时使用 setZOrderMediaOverlay 但失败了。我发现SDK说

请注意,必须在将表面视图的包含窗口附加到窗口管理器之前设置此项。


那么这是否意味着我无法在运行时更改SurfaceView z 顺序?或者有什么办法可以破解它吗?

对不起,我的英语不好。



编辑1 SurfaceViewRenderPercentFrameLayout
都来自库,SurfaceViewRenderSurfaceView的子类。

android z-order surfaceview webrtc apprtcdemo

7
推荐指数
1
解决办法
5458
查看次数

如何更改 seaborn 对图中绘图元素的 z 顺序

这是一个片段,用于重现我的示例图像:

import pandas as pd
import numpy as np
import seaborn as sns

np.random.seed(42)
df = pd.DataFrame(np.random.rand(10,2), columns=['x', 'y'])
df['label'] = ['cat', 'mouse', 'dog', 'mouse', 'cat', 'cat', 'mouse', 'mouse','dog', 'cat']
sns.pairplot(df, hue='label');
Run Code Online (Sandbox Code Playgroud)

它生成以下seaborn对图,以及一些虚拟数据:

在此输入图像描述

在右上图中,“狗”类别的一个标记位于“鼠标”类别的覆盖标记下方。

我可以以某种方式更改散点图标记的 z 顺序,以便“狗”类别的所有标记在顶部最清晰可见吗?

编辑:我已经尝试过hue_order=['mouse', 'cat', 'dog']hue_order=['dog', 'mouse', 'cat'],但它们只影响图例和颜色中的顺序。不是散点图中标记的 z 顺序。

python z-order pandas seaborn pairplot

7
推荐指数
1
解决办法
1718
查看次数

Databricks:Z 顺序与分区

我正在学习Databricks,我有一些关于z-order 和partitionBy 的问题。当我阅读这两个函数时,听起来非常相似。这两个函数都以某种方式对数据进行分组,以加速读取操作。另外,partitionBy 看起来很适合连接操作,但我真的不明白当我只想读取数据时应该使用什么函数。你能告诉我应该如何考虑这两个函数才能正确使用它吗?

partitioning z-order apache-spark databricks delta-lake

7
推荐指数
1
解决办法
9381
查看次数

WindowsFormsHost ZOrder

似乎WindowsFormsHost控件设置为显示在顶部.是否有任何方法可以更改其z顺序以允许同一窗口上的其他WPF控件在WindowsFormsHost控件上显示?

wpf z-order

6
推荐指数
1
解决办法
1949
查看次数

使用 Python Windows 扩展获取窗口 Z 顺序

有没有办法使用Python Windows 扩展来获取窗口的 z 顺序?或者,有没有办法使用另一个模块来做到这一点?通常的方法是使用GetTopWindowand GetNextWindow,但这些函数都没有出现在win32gui模块中。

目前我正在这样做,但它没有考虑到 Windows 的 z 顺序:

import win32gui
def get_windows():
    def callback(hwnd, lst):
        lst.append(hwnd)
    lst = []
    win32gui.EnumWindows(callback, lst)
    return lst
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想要这样的东西:(这不起作用)

import win32gui
import win32con
def get_windows():
    '''Returns windows in z-order (top first)'''
    lst = []
    top = win32gui.GetTopWindow()
    if top is None: return lst
    lst.append(top)
    while True:
        next = win32gui.GetNextWindow(lst[-1], win32con.GW_HWNDNEXT)
        if next is None: break
        lst.append(next)
    return lst
Run Code Online (Sandbox Code Playgroud)

但是,缺少GetTopWindowGetNextWindow功能,所以我不能。

更新:

我想我寻求帮助的速度有点太快了。我用 …

python winapi pywin32 z-order

6
推荐指数
1
解决办法
1984
查看次数

新的WPF窗口仅显示在原始窗口下方

在我的WPF应用程序中,我在主窗体上有一个ListView,它显示来自DataSet的绑定数据.当用户双击ListView中的行时,它会打开一个详细信息窗口.

在我的XAML中,我使用样式在listview上创建双击处理程序:

<Style x:Key="ListViewDoubleClick" TargetType="{x:Type ListViewItem}">
    <EventSetter Event="MouseDoubleClick" Handler="HandleDoubleClick" />
</Style>
...
<ListView Name="searchResults" ItemContainerStyle="{StaticResource ListViewDoubleClick}>
Run Code Online (Sandbox Code Playgroud)

在代码隐藏中,我有一个跟踪打开的详细信息窗口的字典(多个可以一次打开),这样如果一个细节窗口已经打开,它就会被带到前面.我像这样处理双击:

private void HandleDoubleClick(object sender, MouseEventArgs e)
{
    DataRowView clickedRow = ((ListViewItem)sender).Content as DataRowView;
    int row = (int)clickedRow.Row["ID"];
    if (!displayedCards.ContainsKey(row))
    {
        DetailWindow window = new DetailWindow(RetrieveData(row));
        //window.Owner = this;
        displayedCards.Add(row, window);
        window.Show();
    }
    else
    {
        displayedCards[row].Activate();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,使用上面的代码,在主窗体后面打开详细信息窗口.如果我设置了所有者信息(window.Owner = this),则会在主窗体的顶部打开详细信息窗口,但主窗体永远不会出现在详细信息窗口的前面.

displayedCards[row].Activate()作品如我所料,使这一详细信息窗口中的所有其他细节窗口的前面,但它属于受害者同样的问题上面-它不会在主窗口中名列前茅.

我想要完成的是将详细信息窗口放在与主窗口相同的层/层(/ z顺序?)上,以便两者可以在彼此的顶部显示,并使详细信息窗口显示在打开时的主要形式.

编辑:如果重要,详细信息窗口没有WindowStyle,AllowsTransparency并设置为true.我也没有窗口标题,窗口没有出现在任务栏中.当试图解决这个问题时,我尝试设置WindowStyleSingleBorderWindow,并出现同样的问题,除了详细信息窗口的边框显示在主窗体的顶部,因为正在绘制细节窗口,然后它被推到主要的后面形成.在显示详细信息窗口后,我的双击处理程序是否可以将主窗体拉到前面?

c# wpf window z-order

6
推荐指数
1
解决办法
1506
查看次数

使用videoView.setZOrderOnTop后,VideoView上的按钮可见性(true); Android的

我必须在android上强制使用videoView.setZOrderOnTop(true).但使用此功能后,我无法在videoView上显示按钮.即使在设置videoView.setZOrderOnTop(true)后,有没有办法在videoView上显示按钮?

android z-order android-videoview

6
推荐指数
0
解决办法
1309
查看次数

Win32:按真实激活顺序枚举真实窗口

我现在已经厌倦了研究这个话题。系统中有上百万个 API 来实现部分功能,即枚举所有窗口,但没有涉及如何获取它们的真实 z 顺序。怎么做?让我解释。

首先,当然,要枚举窗口,可以使用EnumWindows或 当它表现不佳并决定不显示 UWP 应用程序时,因为操作系统中存在一些愚蠢的限制,可以直接使用NtUserBuildHwndList无论如何在后端调用的EnumWindows.

这样一来,您就可以在回调中过滤子窗口、隐藏窗口和奇怪的窗口。根据您所做的事情,您会得到不同的结果。为了让您免于阅读,最常见的方法是 Raymond Chen 那种过时的解决方案,或者尝试一些更新的方法,可以更好地过滤 Windows 10+ 中的隐藏窗口,并DwmGetWindowAttribute(hwnd, DWMWA_CLOAKED, &bIsCloaked, sizeof(BOOL));BOOL bIsCloaked = TRUE;您最终会得到真正的窗口对桌面感兴趣。

唯一的问题是,它们是按 z 顺序排序的。该列表是通过按 z 顺序对每个窗口带中的所有窗口进行排序而形成的,然后将结果连接到最终列表中。现在,什么是窗带?这是一项未记录的微软发明,他们让一些窗口位于更上面的位置HWND_TOPMOST(从安全角度来看是有道理的,但从根本不记录它的意义上来说,这是没有意义的)。您可以在这里阅读相关内容。基本上,桌面上有多个带区,每个带区是一组共享 z 顺序的窗口。然后,将条带堆叠在一起,生成条带的 z 顺序。选中“始终在顶部”的任务管理器在ZBID_SYSTEM_TOOLS上方的带区中运行ZBID_DESKTOP,这就是为什么它始终位于常规应用程序可以创建的任何窗口的顶部。

这是完全有道理的,但用户并不关心窗口带。它会看到桌面上的窗口,当按下 Alt-Tabing 时,它会看到一个按降序排列的列表,从最近使用的窗口到最后使用的窗口。按照这个顺序,尽管有乐队。例如,我的工作流程是 Firefox-Task Manager-cmd,我希望在 Alt-Tab 中看到 cmd-Task Manager-Firefox,尽管任务管理器始终位于顶部。

现在很明显,我们需要以某种方式对这个列表进行排序。出现的问题是,如何不考虑窗口带而按 z 顺序对窗口列表进行排序?我一生都无法在任何地方找到任何有用的东西,无论是在谷歌上,还是在乏善可陈的文档中。GetTopWindow并且GetNextWindow,传统功能比方说,始终将来自其他带的窗口放在第一个位置ZBID_DESKTOP,然后对其余窗口进行正确排序ZBID_DESKTOP。所有旧版 API 的行为就像其他频段中的窗口一样HWND_TOPMOST,这是有道理的。但我不希望这样:仅当我们一起考虑所有频带或所有窗口都在同一频带上时,z 顺序 …

winapi hwnd z-order

5
推荐指数
0
解决办法
446
查看次数