C#WPF主窗口始终位于桌面前面

C#WPF主窗口始终位于桌面前面,c#,wpf,C#,Wpf,我有一个小的WPF应用程序,我总是想显示在桌面前,但后面的所有其他应用程序。我尝试了几种方法来创建它,但要么窗口最小化(WindKey+D),要么它显示在所有应用程序前面 基本上我想在主窗口内运行一个标签。它在桌面上有一个透明的背景,消息文本每周都会改变。(所有用户的工作场所安全信息) 使用System.Windows; 命名空间ESL消息 { /// ///MainWindow.xaml的交互逻辑 /// /// 公共部分类主窗口:窗口 { 公共主窗口() { 初始化组件(); 初始化屏

我有一个小的WPF应用程序,我总是想显示在桌面前,但后面的所有其他应用程序。我尝试了几种方法来创建它,但要么窗口最小化(WindKey+D),要么它显示在所有应用程序前面

基本上我想在主窗口内运行一个标签。它在桌面上有一个透明的背景,消息文本每周都会改变。(所有用户的工作场所安全信息)

使用System.Windows;
命名空间ESL消息
{
/// 
///MainWindow.xaml的交互逻辑
/// 
/// 
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
初始化屏幕设置();
this.ShowInTaskbar=false;
}
public void InitialiseScreenSettings()
{
双屏幕宽度=System.Windows.SystemParameters.PrimaryScreenWidth;
双屏幕高度=System.Windows.SystemParameters.PrimaryScreenHeight;
双窗口宽度=此.Width;
双窗高度=此高度;
this.Left=(屏幕宽度/2)-(窗口宽度/2);
this.Top=(屏幕高度/2)-(窗口高度/2);
//this.Width=System.Windows.SystemParameters.PrimaryScreenWidth;
//this.Height=System.Windows.SystemParameters.PrimaryScreenHeight;
//这个.Topmost=true;
如果(!IsVisible)
{
Show();
}
if(WindowState==WindowState.Minimized)
{
WindowState=WindowState.Normal;
}
激活();
Topmost=true;//重要
Topmost=false;//重要
Focus();//重要
}
}
}  
试试这个

private KeyboardFilter kbFilter;

private void MainForm_Activated(object sender, EventArgs e)
{
    kbFilter = new KeyboardFilter(new Keys[] 
    { 
        Keys.LWin | Keys.D,
        Keys.RWin | Keys.D,
        Keys.LWin | Keys.X, // if you need
        Keys.RWin | Keys.X, // if you need
        Keys.Alt  | Keys.F4  // if you need
    });
}

private void MainForm_Deactivate(object sender, EventArgs e)
{
    kbFilter.Dispose();
}
确保在
main表单\u Deactivate
事件中使用
KeyboardFilter.Dispose()

KeyboardFilter
类取自

请尝试以下代码:

[DllImport("user32.dll")]
static extern bool SetWindowPos(
    IntPtr hWnd,
    IntPtr hWndInsertAfter,
    int X,
    int Y,
    int cx,
    int cy,
    uint uFlags);

const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;

static readonly IntPtr HWND_BOTTOM = new IntPtr(1);

static void SendWpfWindowBack(Window window)
{
    var hWnd = new WindowInteropHelper(window).Handle;
    SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
}
资料来源:

编辑:

private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
    SendWpfWindowBack(Application.Current.MainWindow);
}
    Loaded="MainWindow_OnLoaded"
对不起。您必须处理主窗口的已加载事件并将其发送回。 试试这个:

代码隐藏:

private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
    SendWpfWindowBack(Application.Current.MainWindow);
}
    Loaded="MainWindow_OnLoaded"
Xaml:

private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
    SendWpfWindowBack(Application.Current.MainWindow);
}
    Loaded="MainWindow_OnLoaded"
仍然按Win+D将隐藏它。但它与您的要求有些相似。
如果你想让你的员工永久地看到一个特定的消息,试着考虑使用壁纸。您可以为每个人设置相同的墙纸,并禁止员工更改墙纸。

谢谢。我得到一个“找不到名称键”。我想这是因为我使用WPF而不是Windows窗体?谢谢。我尝试了类似的方法,但是我不确定如何在InitialiseComponents()之后调用SendWpfWindowBack方法;。你能建议吗?这样做:
sendwpfindowback(这个)在InitialiseComponents()中,我仍然可以使用Windows键+D将其完全最小化。而且,第一次跑步时它不会直接跑到后面。(在Visual Studio上显示)。有什么想法吗?我想你的要求和我想象的有点不同。为窗口设置这些属性,并检查是否有任何更新
WindowStyle=“None”ResizeMode=“NoResize”ShowInTaskbar=“False”Topmost=“False”WindowStartupLocation=“CenterScreen”
我已经设置了所有这些。当我运行应用程序时,屏幕上会立即向用户显示消息。它需要回到只在桌面图像上,并保持在那里。示例如下: