1

WPF ウィンドウに問題があります。TopMost="True"私は永遠に一番上になるように設定しました。問題は、別のウィンドウ (Firefox など) をクリックすると、ウィンドウが一番上に残りますが、タスクバー (スタート バー) の後ろにあるため、タスクバーが一番上に表示され、次に自分のウィンドウ、次に Firefox ウィンドウが表示されることです。Windows 7 を使用しています。

質問: タスクバーに対してウィンドウを設定するには、コードで何を変更する必要がありますか?

XAML コード:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Pixeli morti" Height="350" Width="525" WindowStyle="None" WindowStartupLocation="CenterScreen" WindowState="Maximized" ResizeMode="NoResize" Background="#00000000" Topmost="True" AllowsTransparency="True">
    <Grid>
        <Canvas Name="canvas1" />
    </Grid>
</Window>
4

1 に答える 1

0

これは私にとってはうまくいきます。どのウィンドウに切り替えても、常にタスクバーの上にとどまります。SetWindowPos メソッドを使用し、p/invoke 経由で含めました。

これを機能させるには、いくつかの列挙型とフラグが必要です。おそらくすべてのフラグが必要なわけではありませんが、最もよく使用される pinvoke メソッドをすべて備えたライブラリを用意することをお勧めします。

public enum SetWindowPosFlags : uint
{
    SWP_ASYNCWINDOWPOS = 0x4000,
    SWP_DEFERERASE = 0x2000,
    SWP_DRAWFRAME = 0x0020,
    SWP_FRAMECHANGED = 0x0020,
    SWP_HIDEWINDOW = 0x0080,
    SWP_NOACTIVATE = 0x0010,
    SWP_NOCOPYBITS = 0x0100,
    SWP_NOMOVE = 0x0002,
    SWP_NOOWNERZORDER = 0x0200,
    SWP_NOREDRAW = 0x0008,
    SWP_NOREPOSITION = 0x0200,
    SWP_NOSENDCHANGING = 0x0400,
    SWP_NOSIZE = 0x0001,
    SWP_NOZORDER = 0x0004,
    SWP_SHOWWINDOW = 0x0040,
}
public static class HWND
{
   public static IntPtr
   NoTopMost = new IntPtr(-2),
   TopMost = new IntPtr(-1),
   Top = new IntPtr(0),
   Bottom = new IntPtr(1);
}

また、実際のメソッドが必要です。たとえば、WinApi のような静的ヘルパー クラスに配置することをお勧めします。

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);

最後に、ウィンドウ コードで、必要なパラメーターを指定してメソッドを呼び出しました。

public Window1()
{
    InitializeComponent();
    this.SourceInitialized += (sender, args) =>
    {
        var wih = new WindowInteropHelper(this);
        WinApi.SetWindowPos(wih.Handle, HWND.TopMost, 0, 0, 0, 0, SetWindowPosFlags.SWP_NOMOVE | SetWindowPosFlags.SWP_NOSIZE);
    };
}

ウィンドウのサイズが変更、最小化、または最大化された場合は、そのメソッドを再度呼び出す必要がある場合があります。実際、それが再びアクティブになった場合。また、モーダル ダイアログでの動作を確認する必要があります。

于 2012-07-30T12:31:39.283 に答える