You need to use SetWindowPos instead of SetForegroundWindow and feed it a flag to show the window. That flag is 0x0040 according to the documentation.
Then, if you want it to truly have focus, then you can call SetForegroundWindow.
[DllImport("user32.dll", SetLastError = true)]
private static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
Here's a simple working example of the "show" of the taskbar:
MainWindow.xaml
<Window x:Class="_65994896.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Button Content="Show Taskbar" Click="Button_Click"/>
</Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Runtime.InteropServices;
using System.Windows;
namespace _65994896
{
public partial class MainWindow : Window
{
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr FindWindow( string lpClassName, string lpWindowName);
[DllImport("user32.dll", SetLastError = true)]
private static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
[Flags]
private enum SetWindowPosFlags : uint
{
SWP_HIDEWINDOW = 0x0080,
SWP_SHOWWINDOW = 0x0040
}
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
var window = FindWindow("Shell_traywnd", "");
SetWindowPos(window, IntPtr.Zero, 0, 0, 0, 0, (uint)SetWindowPosFlags.SWP_SHOWWINDOW);
}
}
}